mirror of
https://github.com/hashicorp/packer.git
synced 2026-05-27 12:00:04 -04:00
* Updating the license from MPL to Business Source License Going forward, this project will be licensed under the Business Source License v1.1. Please see our blog post for more details at https://hashi.co/bsl-blog, FAQ at https://hashi.co/license-faq, and details of the license at www.hashicorp.com/bsl. * Update copyright file headers to BUSL-1.1 --------- Co-authored-by: hashicorp-copywrite[bot] <110428419+hashicorp-copywrite[bot]@users.noreply.github.com>
102 lines
2.8 KiB
Go
102 lines
2.8 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package registry
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"path/filepath"
|
|
|
|
"github.com/hashicorp/hcl/v2"
|
|
"github.com/hashicorp/hcp-sdk-go/clients/cloud-packer-service/stable/2021-04-30/models"
|
|
sdkpacker "github.com/hashicorp/packer-plugin-sdk/packer"
|
|
"github.com/hashicorp/packer/packer"
|
|
)
|
|
|
|
// JSONMetadataRegistry is a HCP handler made to process legacy JSON templates
|
|
type JSONMetadataRegistry struct {
|
|
configuration *packer.Core
|
|
bucket *Bucket
|
|
ui sdkpacker.Ui
|
|
}
|
|
|
|
func NewJSONMetadataRegistry(config *packer.Core, ui sdkpacker.Ui) (*JSONMetadataRegistry, hcl.Diagnostics) {
|
|
bucket, diags := createConfiguredBucket(
|
|
filepath.Dir(config.Template.Path),
|
|
withPackerEnvConfiguration,
|
|
)
|
|
|
|
if diags.HasErrors() {
|
|
return nil, diags
|
|
}
|
|
|
|
for _, b := range config.Template.Builders {
|
|
buildName := b.Name
|
|
|
|
// By default, if the name is unspecified, it will be assigned the type
|
|
//
|
|
// If the two are different, we can compose the HCP build name from both
|
|
if b.Name != b.Type {
|
|
buildName = fmt.Sprintf("%s.%s", b.Type, b.Name)
|
|
}
|
|
|
|
// Get all builds slated within config ignoring any only or exclude flags.
|
|
bucket.RegisterBuildForComponent(buildName)
|
|
}
|
|
|
|
ui.Say(fmt.Sprintf("Tracking build on HCP Packer with fingerprint %q", bucket.Iteration.Fingerprint))
|
|
|
|
return &JSONMetadataRegistry{
|
|
configuration: config,
|
|
bucket: bucket,
|
|
ui: ui,
|
|
}, nil
|
|
}
|
|
|
|
// PopulateIteration creates the metadata on HCP for a build
|
|
func (h *JSONMetadataRegistry) PopulateIteration(ctx context.Context) error {
|
|
err := h.bucket.Validate()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = h.bucket.Initialize(ctx, models.HashicorpCloudPackerIterationTemplateTypeJSON)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = h.bucket.populateIteration(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
sha, err := getGitSHA(h.configuration.Template.Path)
|
|
if err != nil {
|
|
log.Printf("failed to get GIT SHA from environment, won't set as build labels")
|
|
} else {
|
|
h.bucket.Iteration.AddSHAToBuildLabels(sha)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// StartBuild is invoked when one build for the configuration is starting to be processed
|
|
func (h *JSONMetadataRegistry) StartBuild(ctx context.Context, build sdkpacker.Build) error {
|
|
return h.bucket.startBuild(ctx, build.Name())
|
|
}
|
|
|
|
// CompleteBuild is invoked when one build for the configuration has finished
|
|
func (h *JSONMetadataRegistry) CompleteBuild(
|
|
ctx context.Context,
|
|
build sdkpacker.Build,
|
|
artifacts []sdkpacker.Artifact,
|
|
buildErr error,
|
|
) ([]sdkpacker.Artifact, error) {
|
|
return h.bucket.completeBuild(ctx, build.Name(), artifacts, buildErr)
|
|
}
|
|
|
|
// IterationStatusSummary prints a status report in the UI if the iteration is not yet done
|
|
func (h *JSONMetadataRegistry) IterationStatusSummary() {
|
|
h.bucket.Iteration.iterationStatusSummary(h.ui)
|
|
}
|