From 072dfdee9ea39b536b8149dd557e80a20ebc4df6 Mon Sep 17 00:00:00 2001 From: Tanmay Jain Date: Mon, 27 Apr 2026 14:07:59 +0530 Subject: [PATCH] Skips bucket update when metadata matches current state Prevents unnecessary update operations by checking if the bucket's description and labels already match the requested values before issuing an update. Improves efficiency and avoids redundant API calls. --- internal/hcp/api/mock_service.go | 7 ++++++- internal/hcp/api/service_bucket.go | 27 ++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/internal/hcp/api/mock_service.go b/internal/hcp/api/mock_service.go index 062e53403..3ba4c15ff 100644 --- a/internal/hcp/api/mock_service.go +++ b/internal/hcp/api/mock_service.go @@ -34,6 +34,7 @@ type MockPackerClientService struct { CreateBuildResp *hcpPackerModels.HashicorpCloudPacker20230101CreateBuildResponse // Mock Gets + GetBucketResp *hcpPackerModels.HashicorpCloudPacker20230101GetBucketResponse GetVersionResp *hcpPackerModels.HashicorpCloudPacker20230101GetVersionResponse // Mock enforced blocks @@ -94,7 +95,11 @@ func (svc *MockPackerClientService) PackerServiceGetBucket( if svc.BucketNotFound { return nil, status.Error(codes.NotFound, fmt.Sprintf("Code:%d %s", codes.NotFound, codes.NotFound.String())) } - return hcpPackerService.NewPackerServiceGetBucketOK(), nil + resp := hcpPackerService.NewPackerServiceGetBucketOK() + if svc.GetBucketResp != nil { + resp.Payload = svc.GetBucketResp + } + return resp, nil } func (svc *MockPackerClientService) PackerServiceUpdateBucket( diff --git a/internal/hcp/api/service_bucket.go b/internal/hcp/api/service_bucket.go index c512f1dee..92938f598 100644 --- a/internal/hcp/api/service_bucket.go +++ b/internal/hcp/api/service_bucket.go @@ -2,6 +2,7 @@ package api import ( "context" + "reflect" 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" @@ -48,7 +49,7 @@ func (c *Client) UpsertBucket( getParams.LocationProjectID = c.ProjectID getParams.BucketName = bucketName - _, err := c.Packer.PackerServiceGetBucket(getParams, nil) + resp, err := c.Packer.PackerServiceGetBucket(getParams, nil) if err != nil { if CheckErrorCode(err, codes.NotFound) { _, err = c.CreateBucket(ctx, bucketName, bucketDescription, bucketLabels) @@ -56,6 +57,10 @@ func (c *Client) UpsertBucket( return err } + if resp != nil && resp.Payload != nil && bucketMetadataMatches(resp.Payload.Bucket, bucketDescription, bucketLabels) { + return nil + } + params := hcpPackerService.NewPackerServiceUpdateBucketParamsWithContext(ctx) params.LocationOrganizationID = c.OrganizationID params.LocationProjectID = c.ProjectID @@ -68,3 +73,23 @@ func (c *Client) UpsertBucket( return err } + +func bucketMetadataMatches( + bucket *hcpPackerModels.HashicorpCloudPacker20230101Bucket, + description string, + labels map[string]string, +) bool { + if bucket == nil { + return false + } + + if bucket.Description != description { + return false + } + + if len(bucket.Labels) == 0 && len(labels) == 0 { + return true + } + + return reflect.DeepEqual(bucket.Labels, labels) +}