github.com/hashicorp/packer@v1.14.3/internal/hcp/api/mock_service.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package api 5 6 import ( 7 "errors" 8 "fmt" 9 "strconv" 10 11 "github.com/go-openapi/runtime" 12 hcpPackerService "github.com/hashicorp/hcp-sdk-go/clients/cloud-packer-service/stable/2023-01-01/client/packer_service" 13 hcpPackerModels "github.com/hashicorp/hcp-sdk-go/clients/cloud-packer-service/stable/2023-01-01/models" 14 "google.golang.org/grpc/codes" 15 "google.golang.org/grpc/status" 16 ) 17 18 // MockPackerClientService represents a basic mock of the Cloud Packer Service. 19 // Upon calling a service method a boolean is set to true to indicate that a method has been called. 20 // To skip the setting of these booleans set TrackCalledServiceMethods to false; defaults to true in NewMockPackerClientService(). 21 type MockPackerClientService struct { 22 CreateBucketCalled, UpdateBucketCalled, GetBucketCalled, BucketNotFound bool 23 CreateVersionCalled, GetVersionCalled, VersionAlreadyExist, VersionCompleted bool 24 CreateBuildCalled, UpdateBuildCalled, ListBuildsCalled, BuildAlreadyDone bool 25 TrackCalledServiceMethods bool 26 27 // Mock Creates 28 CreateBucketResp *hcpPackerModels.HashicorpCloudPacker20230101CreateBucketResponse 29 CreateVersionResp *hcpPackerModels.HashicorpCloudPacker20230101CreateVersionResponse 30 CreateBuildResp *hcpPackerModels.HashicorpCloudPacker20230101CreateBuildResponse 31 32 // Mock Gets 33 GetVersionResp *hcpPackerModels.HashicorpCloudPacker20230101GetVersionResponse 34 35 ExistingBuilds []string 36 ExistingBuildLabels map[string]string 37 38 hcpPackerService.ClientService 39 } 40 41 // NewMockPackerClientService returns a basic mock of the Cloud Packer Service. 42 // Upon calling a service method a boolean is set to true to indicate that a method has been called. 43 // To skip the setting of these booleans set TrackCalledServiceMethods to false. By default, it is true. 44 func NewMockPackerClientService() *MockPackerClientService { 45 m := MockPackerClientService{ 46 ExistingBuilds: make([]string, 0), 47 ExistingBuildLabels: make(map[string]string), 48 TrackCalledServiceMethods: true, 49 } 50 51 return &m 52 } 53 54 func (svc *MockPackerClientService) PackerServiceCreateBucket( 55 params *hcpPackerService.PackerServiceCreateBucketParams, _ runtime.ClientAuthInfoWriter, 56 opts ...hcpPackerService.ClientOption, 57 ) (*hcpPackerService.PackerServiceCreateBucketOK, error) { 58 if params.Body.Name == "" { 59 return nil, errors.New("no bucket name was passed in") 60 } 61 62 if svc.TrackCalledServiceMethods { 63 svc.CreateBucketCalled = true 64 } 65 payload := &hcpPackerModels.HashicorpCloudPacker20230101CreateBucketResponse{ 66 Bucket: &hcpPackerModels.HashicorpCloudPacker20230101Bucket{ 67 ID: "bucket-id", 68 }, 69 } 70 payload.Bucket.Name = params.Body.Name 71 72 ok := &hcpPackerService.PackerServiceCreateBucketOK{ 73 Payload: payload, 74 } 75 76 return ok, nil 77 } 78 79 func (svc *MockPackerClientService) PackerServiceGetBucket( 80 params *hcpPackerService.PackerServiceGetBucketParams, _ runtime.ClientAuthInfoWriter, 81 opts ...hcpPackerService.ClientOption, 82 ) (*hcpPackerService.PackerServiceGetBucketOK, error) { 83 if svc.TrackCalledServiceMethods { 84 svc.GetBucketCalled = true 85 } 86 if svc.BucketNotFound { 87 return nil, status.Error(codes.NotFound, fmt.Sprintf("Code:%d %s", codes.NotFound, codes.NotFound.String())) 88 } 89 return hcpPackerService.NewPackerServiceGetBucketOK(), nil 90 } 91 92 func (svc *MockPackerClientService) PackerServiceUpdateBucket( 93 params *hcpPackerService.PackerServiceUpdateBucketParams, _ runtime.ClientAuthInfoWriter, 94 opts ...hcpPackerService.ClientOption, 95 ) (*hcpPackerService.PackerServiceUpdateBucketOK, error) { 96 if svc.TrackCalledServiceMethods { 97 svc.UpdateBucketCalled = true 98 } 99 100 return hcpPackerService.NewPackerServiceUpdateBucketOK(), nil 101 } 102 103 func (svc *MockPackerClientService) PackerServiceCreateVersion( 104 params *hcpPackerService.PackerServiceCreateVersionParams, _ runtime.ClientAuthInfoWriter, 105 opts ...hcpPackerService.ClientOption, 106 ) (*hcpPackerService.PackerServiceCreateVersionOK, 107 error) { 108 if svc.VersionAlreadyExist { 109 return nil, status.Error( 110 codes.AlreadyExists, fmt.Sprintf("Code:%d %s", codes.AlreadyExists, 111 codes.AlreadyExists.String()), 112 ) 113 } 114 115 if params.Body.Fingerprint == "" { 116 return nil, errors.New("no valid Fingerprint was passed in") 117 } 118 119 if svc.TrackCalledServiceMethods { 120 svc.CreateVersionCalled = true 121 } 122 payload := &hcpPackerModels.HashicorpCloudPacker20230101CreateVersionResponse{ 123 Version: &hcpPackerModels.HashicorpCloudPacker20230101Version{ 124 BucketName: params.BucketName, 125 Fingerprint: params.Body.Fingerprint, 126 ID: "version-id", 127 Name: "v0", 128 Status: hcpPackerModels.HashicorpCloudPacker20230101VersionStatusVERSIONRUNNING.Pointer(), 129 TemplateType: params.Body.TemplateType, 130 }, 131 } 132 133 ok := &hcpPackerService.PackerServiceCreateVersionOK{ 134 Payload: payload, 135 } 136 137 return ok, nil 138 } 139 140 func (svc *MockPackerClientService) PackerServiceGetVersion( 141 params *hcpPackerService.PackerServiceGetVersionParams, _ runtime.ClientAuthInfoWriter, 142 opts ...hcpPackerService.ClientOption, 143 ) (*hcpPackerService.PackerServiceGetVersionOK, error) { 144 if !svc.VersionAlreadyExist { 145 return nil, status.Error(codes.AlreadyExists, fmt.Sprintf("Code:%d %s", codes.Aborted, codes.Aborted.String())) 146 } 147 148 if params.BucketName == "" { 149 return nil, errors.New("no valid BucketName was passed in") 150 } 151 152 if params.Fingerprint == "" { 153 return nil, errors.New("no valid Fingerprint was passed in") 154 } 155 156 if svc.TrackCalledServiceMethods { 157 svc.GetVersionCalled = true 158 } 159 160 payload := &hcpPackerModels.HashicorpCloudPacker20230101GetVersionResponse{ 161 Version: &hcpPackerModels.HashicorpCloudPacker20230101Version{ 162 ID: "version-id", 163 Builds: make([]*hcpPackerModels.HashicorpCloudPacker20230101Build, 0), 164 TemplateType: hcpPackerModels.HashicorpCloudPacker20230101TemplateTypeTEMPLATETYPEUNSET.Pointer(), 165 }, 166 } 167 168 payload.Version.BucketName = params.BucketName 169 payload.Version.Fingerprint = params.Fingerprint 170 ok := &hcpPackerService.PackerServiceGetVersionOK{ 171 Payload: payload, 172 } 173 174 if svc.VersionCompleted { 175 ok.Payload.Version.Name = "v1" 176 ok.Payload.Version.Builds = append(ok.Payload.Version.Builds, &hcpPackerModels.HashicorpCloudPacker20230101Build{ 177 ID: "build-id", 178 ComponentType: svc.ExistingBuilds[0], 179 Status: hcpPackerModels.HashicorpCloudPacker20230101BuildStatusBUILDDONE.Pointer(), 180 Artifacts: []*hcpPackerModels.HashicorpCloudPacker20230101Artifact{ 181 {ExternalIdentifier: "image-id", Region: "somewhere"}, 182 }, 183 Labels: make(map[string]string), 184 }) 185 } else { 186 ok.Payload.Version.Name = "v0" 187 } 188 189 return ok, nil 190 } 191 192 func (svc *MockPackerClientService) PackerServiceCreateBuild( 193 params *hcpPackerService.PackerServiceCreateBuildParams, _ runtime.ClientAuthInfoWriter, 194 opts ...hcpPackerService.ClientOption, 195 ) (*hcpPackerService.PackerServiceCreateBuildOK, error) { 196 if params.BucketName == "" { 197 return nil, errors.New("no valid BucketName was passed in") 198 } 199 200 if params.Fingerprint == "" { 201 return nil, errors.New("no valid Fingerprint was passed in") 202 } 203 204 if params.Body.ComponentType == "" { 205 return nil, errors.New("no build componentType was passed in") 206 } 207 208 if svc.TrackCalledServiceMethods { 209 svc.CreateBuildCalled = true 210 } 211 212 payload := &hcpPackerModels.HashicorpCloudPacker20230101CreateBuildResponse{ 213 Build: &hcpPackerModels.HashicorpCloudPacker20230101Build{ 214 PackerRunUUID: "test-uuid", 215 Status: hcpPackerModels.HashicorpCloudPacker20230101BuildStatusBUILDUNSET.Pointer(), 216 }, 217 } 218 219 payload.Build.ComponentType = params.Body.ComponentType 220 221 ok := hcpPackerService.NewPackerServiceCreateBuildOK() 222 ok.Payload = payload 223 224 return ok, nil 225 } 226 227 func (svc *MockPackerClientService) PackerServiceUpdateBuild( 228 params *hcpPackerService.PackerServiceUpdateBuildParams, _ runtime.ClientAuthInfoWriter, 229 opts ...hcpPackerService.ClientOption, 230 ) (*hcpPackerService.PackerServiceUpdateBuildOK, error) { 231 if params.BuildID == "" { 232 return nil, errors.New("no valid BuildID was passed in") 233 } 234 235 if params.Body == nil { 236 return nil, errors.New("no valid Updates were passed in") 237 } 238 239 if params.Body.Status == nil || *params.Body.Status == "" { 240 return nil, errors.New("no build status was passed in") 241 } 242 243 if svc.TrackCalledServiceMethods { 244 svc.UpdateBuildCalled = true 245 } 246 247 ok := hcpPackerService.NewPackerServiceUpdateBuildOK() 248 ok.Payload = &hcpPackerModels.HashicorpCloudPacker20230101UpdateBuildResponse{ 249 Build: &hcpPackerModels.HashicorpCloudPacker20230101Build{ 250 ID: params.BuildID, 251 }, 252 } 253 return ok, nil 254 } 255 256 func (svc *MockPackerClientService) PackerServiceListBuilds( 257 params *hcpPackerService.PackerServiceListBuildsParams, _ runtime.ClientAuthInfoWriter, 258 opts ...hcpPackerService.ClientOption, 259 ) (*hcpPackerService.PackerServiceListBuildsOK, error) { 260 261 status := hcpPackerModels.HashicorpCloudPacker20230101BuildStatusBUILDUNSET 262 artifacts := make([]*hcpPackerModels.HashicorpCloudPacker20230101Artifact, 0) 263 labels := make(map[string]string) 264 if svc.BuildAlreadyDone { 265 status = hcpPackerModels.HashicorpCloudPacker20230101BuildStatusBUILDDONE 266 artifacts = append(artifacts, &hcpPackerModels.HashicorpCloudPacker20230101Artifact{ExternalIdentifier: "image-id", Region: "somewhere"}) 267 } 268 269 for k, v := range svc.ExistingBuildLabels { 270 labels[k] = v 271 } 272 273 builds := make([]*hcpPackerModels.HashicorpCloudPacker20230101Build, 0, len(svc.ExistingBuilds)) 274 for i, name := range svc.ExistingBuilds { 275 builds = append(builds, &hcpPackerModels.HashicorpCloudPacker20230101Build{ 276 ID: name + "--" + strconv.Itoa(i), 277 ComponentType: name, 278 Platform: "mockPlatform", 279 Status: &status, 280 Artifacts: artifacts, 281 Labels: labels, 282 }) 283 } 284 285 ok := hcpPackerService.NewPackerServiceListBuildsOK() 286 ok.Payload = &hcpPackerModels.HashicorpCloudPacker20230101ListBuildsResponse{ 287 Builds: builds, 288 } 289 290 return ok, nil 291 }