From d908b3cf5826e97f1d4aafa494117ab7150c3146 Mon Sep 17 00:00:00 2001 From: Devashish Date: Tue, 26 Mar 2024 10:58:48 -0400 Subject: [PATCH] HPR-1537: Packer Core sends metadata to HCP Packer in UpdateBuild API (#12891) --- go.mod | 2 ++ go.sum | 6 +++--- internal/hcp/api/service_build.go | 2 ++ internal/hcp/registry/hcl.go | 10 +++++++++ internal/hcp/registry/json.go | 14 ++++++++++++- internal/hcp/registry/types.bucket.go | 30 +++++++++++++++++++++++++++ internal/hcp/registry/types.builds.go | 1 + 7 files changed, 61 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index deab270a917..2826aba0884 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,7 @@ module github.com/hashicorp/packer +replace github.com/hashicorp/hcp-sdk-go => github.com/hashicorp/hcp-sdk-go-internal v0.0.0-20240325194734-0bb6bd5bbc19 + require ( cloud.google.com/go v0.110.8 // indirect github.com/biogo/hts v1.4.3 diff --git a/go.sum b/go.sum index c4d29664a91..94fc57711b8 100644 --- a/go.sum +++ b/go.sum @@ -299,8 +299,8 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hcl/v2 v2.19.1 h1://i05Jqznmb2EXqa39Nsvyan2o5XyMowW5fnCKW5RPI= github.com/hashicorp/hcl/v2 v2.19.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= -github.com/hashicorp/hcp-sdk-go v0.85.0 h1:RDXpIf4gIGfz6je8Qq0FGg+8kwj7KboQTOxnklWyVJk= -github.com/hashicorp/hcp-sdk-go v0.85.0/go.mod h1:vQ4fzdL1AmhIAbCw+4zmFe5Hbpajj3NvRWkJoVuxmAk= +github.com/hashicorp/hcp-sdk-go-internal v0.0.0-20240325194734-0bb6bd5bbc19 h1:QFacHWwhQbVqA9p/nX5CC7wPVQUuT8T2pN7TKI15BQw= +github.com/hashicorp/hcp-sdk-go-internal v0.0.0-20240325194734-0bb6bd5bbc19/go.mod h1:vsLMHasv6H3Qf7wIlRSzHXIOp81G+ad1FP31JfdTKYc= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= @@ -759,8 +759,8 @@ gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/hcp/api/service_build.go b/internal/hcp/api/service_build.go index 69ce13b2b34..946d8d08e42 100644 --- a/internal/hcp/api/service_build.go +++ b/internal/hcp/api/service_build.go @@ -58,6 +58,7 @@ func (c *Client) UpdateBuild( buildLabels map[string]string, buildStatus hcpPackerModels.HashicorpCloudPacker20230101BuildStatus, artifacts []*hcpPackerModels.HashicorpCloudPacker20230101ArtifactCreateBody, + metadata *hcpPackerModels.HashicorpCloudPacker20230101BuildMetadata, ) (string, error) { params := hcpPackerAPI.NewPackerServiceUpdateBuildParamsWithContext(ctx) @@ -76,6 +77,7 @@ func (c *Client) UpdateBuild( Platform: platform, SourceExternalIdentifier: sourceExternalIdentifier, Status: &buildStatus, + Metadata: metadata, } resp, err := c.Packer.PackerServiceUpdateBuild(params, nil) diff --git a/internal/hcp/registry/hcl.go b/internal/hcp/registry/hcl.go index ce6fd68eaa6..332c19df953 100644 --- a/internal/hcp/registry/hcl.go +++ b/internal/hcp/registry/hcl.go @@ -70,6 +70,12 @@ func (h *HCLRegistry) StartBuild(ctx context.Context, build sdkpacker.Build) err if ok { name = cb.Type } + + metadata := cb.GetMetadata() + err := h.bucket.AddMetadataToBuild(ctx, name, metadata) + if err != nil { + return err + } return h.bucket.startBuild(ctx, name) } @@ -97,6 +103,10 @@ func (h *HCLRegistry) CompleteBuild( name, k, pluginDetails.Description.Version, ) } + err := h.bucket.AddMetadataToBuild(ctx, name, metadata) + if err != nil { + return nil, err + } return h.bucket.completeBuild(ctx, name, artifacts, buildErr) } diff --git a/internal/hcp/registry/json.go b/internal/hcp/registry/json.go index b86cfd45273..785ccc4a92f 100644 --- a/internal/hcp/registry/json.go +++ b/internal/hcp/registry/json.go @@ -83,7 +83,14 @@ func (h *JSONRegistry) PopulateVersion(ctx context.Context) error { // StartBuild is invoked when one build for the configuration is starting to be processed func (h *JSONRegistry) StartBuild(ctx context.Context, build sdkpacker.Build) error { - return h.bucket.startBuild(ctx, build.Name()) + name := build.Name() + + metadata := build.(*packer.CoreBuild).GetMetadata() + err := h.bucket.AddMetadataToBuild(ctx, name, metadata) + if err != nil { + return err + } + return h.bucket.startBuild(ctx, name) } // CompleteBuild is invoked when one build for the configuration has finished @@ -106,6 +113,11 @@ func (h *JSONRegistry) CompleteBuild( name, k, pluginDetails.Description.Version, ) } + + err := h.bucket.AddMetadataToBuild(ctx, name, metadata) + if err != nil { + return nil, err + } return h.bucket.completeBuild(ctx, name, artifacts, buildErr) } diff --git a/internal/hcp/registry/types.bucket.go b/internal/hcp/registry/types.bucket.go index 6eda3b484bf..f0a7c4b4353 100644 --- a/internal/hcp/registry/types.bucket.go +++ b/internal/hcp/registry/types.bucket.go @@ -19,6 +19,7 @@ import ( "github.com/hashicorp/packer/hcl2template" hcpPackerAPI "github.com/hashicorp/packer/internal/hcp/api" "github.com/hashicorp/packer/internal/hcp/env" + "github.com/hashicorp/packer/packer" "github.com/mitchellh/mapstructure" "google.golang.org/grpc/codes" ) @@ -213,6 +214,7 @@ func (bucket *Bucket) UpdateBuildStatus( nil, status, nil, + &buildToUpdate.Metadata, ) if err != nil { return err @@ -285,6 +287,7 @@ func (bucket *Bucket) markBuildComplete(ctx context.Context, name string) error buildToUpdate.Labels, status, artifacts, + &buildToUpdate.Metadata, ) if err != nil { return err @@ -535,6 +538,7 @@ func (bucket *Bucket) HeartbeatBuild(ctx context.Context, build string) (func(), nil, hcpPackerModels.HashicorpCloudPacker20230101BuildStatusBUILDRUNNING, nil, + nil, ) if err != nil { log.Printf("[ERROR] failed to send heartbeat for build %q: %s", build, err) @@ -599,6 +603,32 @@ type NotAHCPArtifactError struct { error } +// AddMetadataToBuild adds metadata to a build in the HCP Packer registry. +func (bucket *Bucket) AddMetadataToBuild( + ctx context.Context, buildName string, metadata packer.BuildMetadata, +) error { + buildToUpdate, err := bucket.Version.Build(buildName) + if err != nil { + return err + } + + packerMetadata := make(map[string]interface{}) + packerMetadata["version"] = metadata.PackerVersion + + var pluginsMetadata []map[string]interface{} + for _, plugin := range metadata.Plugins { + pluginMetadata := map[string]interface{}{ + "version": plugin.Description.Version, + "name": plugin.Name, + } + pluginsMetadata = append(pluginsMetadata, pluginMetadata) + } + packerMetadata["plugins"] = pluginsMetadata + + buildToUpdate.Metadata.Packer = packerMetadata + return nil +} + func (bucket *Bucket) completeBuild( ctx context.Context, buildName string, diff --git a/internal/hcp/registry/types.builds.go b/internal/hcp/registry/types.builds.go index a55e9b0b9f6..dc7e132762c 100644 --- a/internal/hcp/registry/types.builds.go +++ b/internal/hcp/registry/types.builds.go @@ -19,6 +19,7 @@ type Build struct { Labels map[string]string Artifacts map[string]packerSDKRegistry.Image Status hcpPackerModels.HashicorpCloudPacker20230101BuildStatus + Metadata hcpPackerModels.HashicorpCloudPacker20230101BuildMetadata } // NewBuildFromCloudPackerBuild converts a HashicorpCloudPackerBuild to a local build that can be tracked and