You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
packer/internal/hcp/api/mock_service.go

292 lines
9.7 KiB

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package api
import (
"errors"
"fmt"
"strconv"
"github.com/go-openapi/runtime"
hcpPackerService "github.com/hashicorp/hcp-sdk-go/clients/cloud-packer-service/stable/2023-01-01/client/packer_service"
hcpPackerModels "github.com/hashicorp/hcp-sdk-go/clients/cloud-packer-service/stable/2023-01-01/models"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
// MockPackerClientService represents a basic mock of the Cloud Packer Service.
// Upon calling a service method a boolean is set to true to indicate that a method has been called.
// To skip the setting of these booleans set TrackCalledServiceMethods to false; defaults to true in NewMockPackerClientService().
type MockPackerClientService struct {
CreateBucketCalled, UpdateBucketCalled, GetBucketCalled, BucketNotFound bool
CreateVersionCalled, GetVersionCalled, VersionAlreadyExist, VersionCompleted bool
CreateBuildCalled, UpdateBuildCalled, ListBuildsCalled, BuildAlreadyDone bool
TrackCalledServiceMethods bool
// Mock Creates
CreateBucketResp *hcpPackerModels.HashicorpCloudPacker20230101CreateBucketResponse
CreateVersionResp *hcpPackerModels.HashicorpCloudPacker20230101CreateVersionResponse
CreateBuildResp *hcpPackerModels.HashicorpCloudPacker20230101CreateBuildResponse
// Mock Gets
GetVersionResp *hcpPackerModels.HashicorpCloudPacker20230101GetVersionResponse
ExistingBuilds []string
ExistingBuildLabels map[string]string
hcpPackerService.ClientService
}
// NewMockPackerClientService returns a basic mock of the Cloud Packer Service.
// Upon calling a service method a boolean is set to true to indicate that a method has been called.
// To skip the setting of these booleans set TrackCalledServiceMethods to false. By default, it is true.
func NewMockPackerClientService() *MockPackerClientService {
m := MockPackerClientService{
ExistingBuilds: make([]string, 0),
ExistingBuildLabels: make(map[string]string),
TrackCalledServiceMethods: true,
}
return &m
}
func (svc *MockPackerClientService) PackerServiceCreateBucket(
params *hcpPackerService.PackerServiceCreateBucketParams, _ runtime.ClientAuthInfoWriter,
opts ...hcpPackerService.ClientOption,
) (*hcpPackerService.PackerServiceCreateBucketOK, error) {
if params.Body.Name == "" {
return nil, errors.New("no bucket name was passed in")
}
if svc.TrackCalledServiceMethods {
svc.CreateBucketCalled = true
}
payload := &hcpPackerModels.HashicorpCloudPacker20230101CreateBucketResponse{
Bucket: &hcpPackerModels.HashicorpCloudPacker20230101Bucket{
ID: "bucket-id",
},
}
payload.Bucket.Name = params.Body.Name
ok := &hcpPackerService.PackerServiceCreateBucketOK{
Payload: payload,
}
return ok, nil
}
func (svc *MockPackerClientService) PackerServiceGetBucket(
params *hcpPackerService.PackerServiceGetBucketParams, _ runtime.ClientAuthInfoWriter,
opts ...hcpPackerService.ClientOption,
) (*hcpPackerService.PackerServiceGetBucketOK, error) {
if svc.TrackCalledServiceMethods {
svc.GetBucketCalled = true
}
if svc.BucketNotFound {
return nil, status.Error(codes.NotFound, fmt.Sprintf("Code:%d %s", codes.NotFound, codes.NotFound.String()))
}
return hcpPackerService.NewPackerServiceGetBucketOK(), nil
}
func (svc *MockPackerClientService) PackerServiceUpdateBucket(
params *hcpPackerService.PackerServiceUpdateBucketParams, _ runtime.ClientAuthInfoWriter,
opts ...hcpPackerService.ClientOption,
) (*hcpPackerService.PackerServiceUpdateBucketOK, error) {
if svc.TrackCalledServiceMethods {
svc.UpdateBucketCalled = true
}
return hcpPackerService.NewPackerServiceUpdateBucketOK(), nil
}
func (svc *MockPackerClientService) PackerServiceCreateVersion(
params *hcpPackerService.PackerServiceCreateVersionParams, _ runtime.ClientAuthInfoWriter,
opts ...hcpPackerService.ClientOption,
) (*hcpPackerService.PackerServiceCreateVersionOK,
error) {
if svc.VersionAlreadyExist {
return nil, status.Error(
codes.AlreadyExists, fmt.Sprintf("Code:%d %s", codes.AlreadyExists,
codes.AlreadyExists.String()),
)
}
if params.Body.Fingerprint == "" {
return nil, errors.New("no valid Fingerprint was passed in")
}
if svc.TrackCalledServiceMethods {
svc.CreateVersionCalled = true
}
payload := &hcpPackerModels.HashicorpCloudPacker20230101CreateVersionResponse{
Version: &hcpPackerModels.HashicorpCloudPacker20230101Version{
BucketName: params.BucketName,
Fingerprint: params.Body.Fingerprint,
ID: "version-id",
Name: "v0",
Status: hcpPackerModels.HashicorpCloudPacker20230101VersionStatusVERSIONRUNNING.Pointer(),
TemplateType: params.Body.TemplateType,
},
}
ok := &hcpPackerService.PackerServiceCreateVersionOK{
Payload: payload,
}
return ok, nil
}
func (svc *MockPackerClientService) PackerServiceGetVersion(
params *hcpPackerService.PackerServiceGetVersionParams, _ runtime.ClientAuthInfoWriter,
opts ...hcpPackerService.ClientOption,
) (*hcpPackerService.PackerServiceGetVersionOK, error) {
if !svc.VersionAlreadyExist {
return nil, status.Error(codes.AlreadyExists, fmt.Sprintf("Code:%d %s", codes.Aborted, codes.Aborted.String()))
}
if params.BucketName == "" {
return nil, errors.New("no valid BucketName was passed in")
}
if params.Fingerprint == "" {
return nil, errors.New("no valid Fingerprint was passed in")
}
if svc.TrackCalledServiceMethods {
svc.GetVersionCalled = true
}
payload := &hcpPackerModels.HashicorpCloudPacker20230101GetVersionResponse{
Version: &hcpPackerModels.HashicorpCloudPacker20230101Version{
ID: "version-id",
Builds: make([]*hcpPackerModels.HashicorpCloudPacker20230101Build, 0),
TemplateType: hcpPackerModels.HashicorpCloudPacker20230101TemplateTypeTEMPLATETYPEUNSET.Pointer(),
},
}
payload.Version.BucketName = params.BucketName
payload.Version.Fingerprint = params.Fingerprint
ok := &hcpPackerService.PackerServiceGetVersionOK{
Payload: payload,
}
if svc.VersionCompleted {
ok.Payload.Version.Name = "v1"
ok.Payload.Version.Builds = append(ok.Payload.Version.Builds, &hcpPackerModels.HashicorpCloudPacker20230101Build{
ID: "build-id",
ComponentType: svc.ExistingBuilds[0],
Status: hcpPackerModels.HashicorpCloudPacker20230101BuildStatusBUILDDONE.Pointer(),
Artifacts: []*hcpPackerModels.HashicorpCloudPacker20230101Artifact{
{ExternalIdentifier: "image-id", Region: "somewhere"},
},
Labels: make(map[string]string),
})
} else {
ok.Payload.Version.Name = "v0"
}
return ok, nil
}
func (svc *MockPackerClientService) PackerServiceCreateBuild(
params *hcpPackerService.PackerServiceCreateBuildParams, _ runtime.ClientAuthInfoWriter,
opts ...hcpPackerService.ClientOption,
) (*hcpPackerService.PackerServiceCreateBuildOK, error) {
if params.BucketName == "" {
return nil, errors.New("no valid BucketName was passed in")
}
if params.Fingerprint == "" {
return nil, errors.New("no valid Fingerprint was passed in")
}
if params.Body.ComponentType == "" {
return nil, errors.New("no build componentType was passed in")
}
if svc.TrackCalledServiceMethods {
svc.CreateBuildCalled = true
}
payload := &hcpPackerModels.HashicorpCloudPacker20230101CreateBuildResponse{
Build: &hcpPackerModels.HashicorpCloudPacker20230101Build{
PackerRunUUID: "test-uuid",
Status: hcpPackerModels.HashicorpCloudPacker20230101BuildStatusBUILDUNSET.Pointer(),
},
}
payload.Build.ComponentType = params.Body.ComponentType
ok := hcpPackerService.NewPackerServiceCreateBuildOK()
ok.Payload = payload
return ok, nil
}
func (svc *MockPackerClientService) PackerServiceUpdateBuild(
params *hcpPackerService.PackerServiceUpdateBuildParams, _ runtime.ClientAuthInfoWriter,
opts ...hcpPackerService.ClientOption,
) (*hcpPackerService.PackerServiceUpdateBuildOK, error) {
if params.BuildID == "" {
return nil, errors.New("no valid BuildID was passed in")
}
if params.Body == nil {
return nil, errors.New("no valid Updates were passed in")
}
if params.Body.Status == nil || *params.Body.Status == "" {
return nil, errors.New("no build status was passed in")
}
if svc.TrackCalledServiceMethods {
svc.UpdateBuildCalled = true
}
ok := hcpPackerService.NewPackerServiceUpdateBuildOK()
ok.Payload = &hcpPackerModels.HashicorpCloudPacker20230101UpdateBuildResponse{
Build: &hcpPackerModels.HashicorpCloudPacker20230101Build{
ID: params.BuildID,
},
}
return ok, nil
}
func (svc *MockPackerClientService) PackerServiceListBuilds(
params *hcpPackerService.PackerServiceListBuildsParams, _ runtime.ClientAuthInfoWriter,
opts ...hcpPackerService.ClientOption,
) (*hcpPackerService.PackerServiceListBuildsOK, error) {
status := hcpPackerModels.HashicorpCloudPacker20230101BuildStatusBUILDUNSET
artifacts := make([]*hcpPackerModels.HashicorpCloudPacker20230101Artifact, 0)
labels := make(map[string]string)
if svc.BuildAlreadyDone {
status = hcpPackerModels.HashicorpCloudPacker20230101BuildStatusBUILDDONE
artifacts = append(artifacts, &hcpPackerModels.HashicorpCloudPacker20230101Artifact{ExternalIdentifier: "image-id", Region: "somewhere"})
}
for k, v := range svc.ExistingBuildLabels {
labels[k] = v
}
builds := make([]*hcpPackerModels.HashicorpCloudPacker20230101Build, 0, len(svc.ExistingBuilds))
for i, name := range svc.ExistingBuilds {
builds = append(builds, &hcpPackerModels.HashicorpCloudPacker20230101Build{
ID: name + "--" + strconv.Itoa(i),
ComponentType: name,
Platform: "mockPlatform",
Status: &status,
Artifacts: artifacts,
Labels: labels,
})
}
ok := hcpPackerService.NewPackerServiceListBuildsOK()
ok.Payload = &hcpPackerModels.HashicorpCloudPacker20230101ListBuildsResponse{
Builds: builds,
}
return ok, nil
}