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  }