Send channel id to HCP Packer (#11861)

pull/11914/head
Sylvia Moss 4 years ago committed by GitHub
parent d8e0ccc965
commit 5c3d5c1295
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -17,7 +17,6 @@ import (
"github.com/hashicorp/packer-plugin-sdk/hcl2helper"
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
"github.com/hashicorp/packer-plugin-sdk/template/config"
"github.com/hashicorp/packer/internal/registry"
packerregistry "github.com/hashicorp/packer/internal/registry"
)
@ -99,7 +98,7 @@ func (d *Datasource) Configure(raws ...interface{}) error {
return nil
}
// Information from []*models.HashicorpCloudPackerImage with some information
// DatasourceOutput Information from []*models.HashicorpCloudPackerImage with some information
// from the parent []*models.HashicorpCloudPackerBuild included where it seemed
// like it might be relevant. Need to copy so we can generate
type DatasourceOutput struct {
@ -118,6 +117,9 @@ type DatasourceOutput struct {
// to a UUID. It is created by the HCP Packer Registry when an iteration is
// first created, and is unique to this iteration.
IterationID string `mapstructure:"iteration_id"`
// The ID of the channel used to query the image iteration. This value will be empty if the `iteration_id` was used
// directly instead of a channel.
ChannelID string `mapstructure:"channel_id"`
// The UUID associated with the Packer run that created this image.
PackerRunUUID string `mapstructure:"packer_run_uuid"`
// ID or URL of the remote cloud image as given by a build.
@ -134,31 +136,6 @@ func (d *Datasource) OutputSpec() hcldec.ObjectSpec {
return (&DatasourceOutput{}).FlatMapstructure().HCL2Spec()
}
func (d *Datasource) getIteration(
ctx context.Context,
cli *registry.Client,
) (*models.HashicorpCloudPackerIteration, error) {
if d.config.IterationID != "" {
iter, err := cli.GetIteration(ctx, d.config.Bucket, packerregistry.GetIteration_byID(d.config.IterationID))
if err != nil {
return nil, fmt.Errorf(
"error retrieving image iteration from HCP Packer registry: %s",
err)
}
return iter, nil
}
iter, err := cli.GetIterationFromChannel(ctx, d.config.Bucket, d.config.Channel)
if err != nil {
return nil, fmt.Errorf(
"error retrieving iteration from HCP Packer registry: %s",
err)
}
return iter, nil
}
func (d *Datasource) Execute() (cty.Value, error) {
ctx := context.TODO()
@ -167,13 +144,35 @@ func (d *Datasource) Execute() (cty.Value, error) {
return cty.NullVal(cty.EmptyObject), err
}
// Load channel.
log.Printf("[INFO] Reading info from HCP Packer registry (%s) [project_id=%s, organization_id=%s, iteration_id=%s]",
d.config.Bucket, cli.ProjectID, cli.OrganizationID, d.config.IterationID)
var iteration *models.HashicorpCloudPackerIteration
var channelID string
if d.config.IterationID != "" {
log.Printf("[INFO] Reading info from HCP Packer registry (%s) [project_id=%s, organization_id=%s, iteration_id=%s]",
d.config.Bucket, cli.ProjectID, cli.OrganizationID, d.config.IterationID)
iteration, err := d.getIteration(ctx, cli)
if err != nil {
return cty.NullVal(cty.EmptyObject), err
iter, err := cli.GetIteration(ctx, d.config.Bucket, packerregistry.GetIteration_byID(d.config.IterationID))
if err != nil {
return cty.NullVal(cty.EmptyObject), fmt.Errorf(
"error retrieving image iteration from HCP Packer registry: %s",
err)
}
iteration = iter
} else {
log.Printf("[INFO] Reading info from HCP Packer registry (%s) [project_id=%s, organization_id=%s, channel=%s]",
d.config.Bucket, cli.ProjectID, cli.OrganizationID, d.config.Channel)
channel, err := cli.GetChannel(ctx, d.config.Bucket, d.config.Channel)
if err != nil {
return cty.NullVal(cty.EmptyObject), fmt.Errorf("error retrieving "+
"channel from HCP Packer registry: %s", err.Error())
}
if channel.Iteration == nil {
return cty.NullVal(cty.EmptyObject), fmt.Errorf("there is no iteration associated with the channel %s",
d.config.Channel)
}
channelID = channel.ID
iteration = channel.Iteration
}
revokeAt := time.Time(iteration.RevokeAt)
@ -201,6 +200,7 @@ func (d *Datasource) Execute() (cty.Value, error) {
CreatedAt: image.CreatedAt.String(),
BuildID: build.ID,
IterationID: build.IterationID,
ChannelID: channelID,
PackerRunUUID: build.PackerRunUUID,
ID: image.ImageID,
Region: image.Region,

@ -64,6 +64,7 @@ type FlatDatasourceOutput struct {
CreatedAt *string `mapstructure:"created_at" cty:"created_at" hcl:"created_at"`
BuildID *string `mapstructure:"build_id" cty:"build_id" hcl:"build_id"`
IterationID *string `mapstructure:"iteration_id" cty:"iteration_id" hcl:"iteration_id"`
ChannelID *string `mapstructure:"channel_id" cty:"channel_id" hcl:"channel_id"`
PackerRunUUID *string `mapstructure:"packer_run_uuid" cty:"packer_run_uuid" hcl:"packer_run_uuid"`
ID *string `mapstructure:"id" cty:"id" hcl:"id"`
Region *string `mapstructure:"region" cty:"region" hcl:"region"`
@ -87,6 +88,7 @@ func (*FlatDatasourceOutput) HCL2Spec() map[string]hcldec.Spec {
"created_at": &hcldec.AttrSpec{Name: "created_at", Type: cty.String, Required: false},
"build_id": &hcldec.AttrSpec{Name: "build_id", Type: cty.String, Required: false},
"iteration_id": &hcldec.AttrSpec{Name: "iteration_id", Type: cty.String, Required: false},
"channel_id": &hcldec.AttrSpec{Name: "channel_id", Type: cty.String, Required: false},
"packer_run_uuid": &hcldec.AttrSpec{Name: "packer_run_uuid", Type: cty.String, Required: false},
"id": &hcldec.AttrSpec{Name: "id", Type: cty.String, Required: false},
"region": &hcldec.AttrSpec{Name: "region", Type: cty.String, Required: false},

@ -58,7 +58,7 @@ func (d *Datasource) Configure(raws ...interface{}) error {
return nil
}
// Essentially a copy of []*models.HashicorpCloudPackerIteration, but without the
// DatasourceOutput is essentially a copy of []*models.HashicorpCloudPackerIteration, but without the
// []Builds or ancestor id.
type DatasourceOutput struct {
// who created the iteration
@ -88,6 +88,8 @@ type DatasourceOutput struct {
IncrementalVersion int32 `mapstructure:"incremental_version"`
// The date when this iteration was last updated.
UpdatedAt string `mapstructure:"updated_at"`
// The ID of the channel used to query the image iteration.
ChannelID string `mapstructure:"channel_id"`
}
func (d *Datasource) OutputSpec() hcldec.ObjectSpec {
@ -105,11 +107,17 @@ func (d *Datasource) Execute() (cty.Value, error) {
log.Printf("[INFO] Reading iteration info from HCP Packer registry (%s) [project_id=%s, organization_id=%s, channel=%s]",
d.config.Bucket, cli.ProjectID, cli.OrganizationID, d.config.Channel)
iteration, err := cli.GetIterationFromChannel(ctx, d.config.Bucket, d.config.Channel)
channel, err := cli.GetChannel(ctx, d.config.Bucket, d.config.Channel)
if err != nil {
return cty.NullVal(cty.EmptyObject), fmt.Errorf("error retrieving "+
"iteration from HCP Packer registry: %s", err.Error())
}
if channel.Iteration == nil {
return cty.NullVal(cty.EmptyObject), fmt.Errorf("there is no iteration associated with the channel %s",
d.config.Channel)
}
iteration := channel.Iteration
revokeAt := time.Time(iteration.RevokeAt)
if !revokeAt.IsZero() && revokeAt.Before(time.Now().UTC()) {
@ -128,6 +136,7 @@ func (d *Datasource) Execute() (cty.Value, error) {
ID: iteration.ID,
IncrementalVersion: iteration.IncrementalVersion,
UpdatedAt: iteration.UpdatedAt.String(),
ChannelID: channel.ID,
}
return hcl2helper.HCL2ValueFromConfig(output, d.OutputSpec()), nil

@ -59,6 +59,7 @@ type FlatDatasourceOutput struct {
ID *string `mapstructure:"id" cty:"id" hcl:"id"`
IncrementalVersion *int32 `mapstructure:"incremental_version" cty:"incremental_version" hcl:"incremental_version"`
UpdatedAt *string `mapstructure:"updated_at" cty:"updated_at" hcl:"updated_at"`
ChannelID *string `mapstructure:"channel_id" cty:"channel_id" hcl:"channel_id"`
}
// FlatMapstructure returns a new FlatDatasourceOutput.
@ -81,6 +82,7 @@ func (*FlatDatasourceOutput) HCL2Spec() map[string]hcldec.Spec {
"id": &hcldec.AttrSpec{Name: "id", Type: cty.String, Required: false},
"incremental_version": &hcldec.AttrSpec{Name: "incremental_version", Type: cty.Number, Required: false},
"updated_at": &hcldec.AttrSpec{Name: "updated_at", Type: cty.String, Required: false},
"channel_id": &hcldec.AttrSpec{Name: "channel_id", Type: cty.String, Required: false},
}
return s
}

@ -144,10 +144,19 @@ func (d *DeactivatedDatasource) Execute() (cty.Value, error) {
log.Printf("[INFO] Reading info from HCP Packer registry (%s) [project_id=%s, organization_id=%s, channel=%s]",
d.config.Bucket, cli.ProjectID, cli.OrganizationID, d.config.Channel)
iteration, err := cli.GetIterationFromChannel(ctx, d.config.Bucket, d.config.Channel)
channel, err := cli.GetChannel(ctx, d.config.Bucket, d.config.Channel)
if err != nil {
return cty.NullVal(cty.EmptyObject), fmt.Errorf("error retrieving "+
"image iteration from HCP Packer registry: %s", err.Error())
"channel from HCP Packer registry: %s", err.Error())
}
var iteration *models.HashicorpCloudPackerIteration
if channel != nil {
if channel.Iteration != nil {
iteration = channel.Iteration
}
return cty.NullVal(cty.EmptyObject), fmt.Errorf("there is no iteration associated with the channel %s",
d.config.Channel)
}
revokeAt := time.Time(iteration.RevokeAt)

@ -22,7 +22,7 @@ require (
github.com/hashicorp/go-uuid v1.0.2
github.com/hashicorp/go-version v1.4.0
github.com/hashicorp/hcl/v2 v2.13.0
github.com/hashicorp/hcp-sdk-go v0.19.0
github.com/hashicorp/hcp-sdk-go v0.20.1-0.20220726131832-34fbcf69a746
github.com/hashicorp/packer-plugin-amazon v1.1.0
github.com/hashicorp/packer-plugin-sdk v0.3.1
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869
@ -96,6 +96,7 @@ require (
github.com/hashicorp/packer-plugin-vmware v1.0.7
github.com/hashicorp/packer-plugin-vsphere v1.0.5
github.com/hashicorp/packer-plugin-yandex v1.1.1
github.com/prometheus/common v0.9.1
github.com/scaleway/packer-plugin-scaleway v1.0.4
)
@ -126,6 +127,8 @@ require (
github.com/Telmate/proxmox-api-go v0.0.0-20220107223401-b9c909d83a3b // indirect
github.com/acomagu/bufpipe v1.0.3 // indirect
github.com/agext/levenshtein v1.2.3 // indirect
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4 // indirect
github.com/aliyun/alibaba-cloud-sdk-go v1.61.1028 // indirect
github.com/aliyun/aliyun-oss-go-sdk v2.1.8+incompatible // indirect
github.com/antihax/optional v1.0.0 // indirect
@ -162,7 +165,6 @@ require (
github.com/go-openapi/strfmt v0.20.0 // indirect
github.com/go-openapi/swag v0.19.14 // indirect
github.com/go-openapi/validate v0.20.2 // indirect
github.com/go-ozzo/ozzo-validation v3.6.0+incompatible // indirect
github.com/go-resty/resty/v2 v2.6.0 // indirect
github.com/go-stack/stack v1.8.0 // indirect
github.com/gofrs/uuid v4.0.0+incompatible // indirect
@ -258,6 +260,7 @@ require (
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20211021150943-2b146023228c // indirect
google.golang.org/protobuf v1.27.1 // indirect
gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect
gopkg.in/cheggaaa/pb.v1 v1.0.28 // indirect
gopkg.in/ini.v1 v1.62.0 // indirect
gopkg.in/square/go-jose.v2 v2.6.0 // indirect

@ -139,8 +139,10 @@ github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7l
github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4 h1:Hs82Z41s6SdL1CELW+XaDYmOH4hkBN4/N9og/AsOv7E=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/aliyun/alibaba-cloud-sdk-go v1.61.1028 h1:lBif3zUMR6sjgfONVqfnjjjdXIK09S4Lvkze20ApE8w=
github.com/aliyun/alibaba-cloud-sdk-go v1.61.1028/go.mod h1:pUKYbK5JQ+1Dfxk80P0qxGqe5dkxDoabbZS7zOcouyA=
@ -430,8 +432,6 @@ github.com/go-openapi/validate v0.19.15/go.mod h1:tbn/fdOwYHgrhPBzidZfJC2MIVvs9G
github.com/go-openapi/validate v0.20.1/go.mod h1:b60iJT+xNNLfaQJUqLI7946tYiFEOuE9E4k54HpKcJ0=
github.com/go-openapi/validate v0.20.2 h1:AhqDegYV3J3iQkMPJSXkvzymHKMTw0BST3RK3hTT4ts=
github.com/go-openapi/validate v0.20.2/go.mod h1:e7OJoKNgd0twXZwIn0A43tHbvIcr/rZIVCbJBpTUoY0=
github.com/go-ozzo/ozzo-validation v3.6.0+incompatible h1:msy24VGS42fKO9K1vLz82/GeYW1cILu7Nuuj1N3BBkE=
github.com/go-ozzo/ozzo-validation v3.6.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU=
github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8=
github.com/go-resty/resty/v2 v2.3.0/go.mod h1:UpN9CgLZNsv4e9XG50UU8xdI0F43UQ4HmxLBDwaroHU=
github.com/go-resty/resty/v2 v2.6.0 h1:joIR5PNLM2EFqqESUjCMGXrWmXNHEU9CEiK813oKYS4=
@ -700,8 +700,8 @@ github.com/hashicorp/hcl/v2 v2.10.1/go.mod h1:FwWsfWEjyV/CMj8s/gqAuiviY72rJ1/oay
github.com/hashicorp/hcl/v2 v2.12.0/go.mod h1:FwWsfWEjyV/CMj8s/gqAuiviY72rJ1/oayI9WftqcKg=
github.com/hashicorp/hcl/v2 v2.13.0 h1:0Apadu1w6M11dyGFxWnmhhcMjkbAiKCv7G1r/2QgCNc=
github.com/hashicorp/hcl/v2 v2.13.0/go.mod h1:e4z5nxYlWNPdDSNYX+ph14EvWYMFm3eP0zIUqPc2jr0=
github.com/hashicorp/hcp-sdk-go v0.19.0 h1:uaM2YlL84yLz2m9WyeK9HOUmcVkgw1u32aUJx7L64zw=
github.com/hashicorp/hcp-sdk-go v0.19.0/go.mod h1:z0I0eZ+TVJJ7pycnCzMM/ouOw5D5Qnp/zylNXkqGEX0=
github.com/hashicorp/hcp-sdk-go v0.20.1-0.20220726131832-34fbcf69a746 h1:rj2Hgrs5ZEqn5dXbj0ZIC6z+jFWkB0EoxOAD3JNWrms=
github.com/hashicorp/hcp-sdk-go v0.20.1-0.20220726131832-34fbcf69a746/go.mod h1:R44DJFnWufG+C89Ozlg/7ILrK3Ulh8g4zT8t8Ioe0KQ=
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=
@ -1050,6 +1050,7 @@ github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7q
github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U=
github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
@ -1732,6 +1733,7 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

@ -254,16 +254,29 @@ func (p *Parser) decodeBuildConfig(block *hcl.Block, cfg *PackerConfig) (*BuildB
cfg.bucket.RegisterBuildForComponent(source.String())
}
// Known HCP Packer Image Datasource, whose id is the SourceImageId for some build.
const hcpDatasourceType string = "hcp-packer-image"
// Known HCP Packer Image Datasource, whose id is the SourceImageId and ChannelID for some build.
values := ectx.Variables[dataAccessor].AsValueMap()
dsValues, ok := values[hcpDatasourceType]
const hcpImageDatasourceType string = "hcp-packer-image"
imageDatasourceValues, ok := values[hcpImageDatasourceType]
if !ok {
return build, diags
}
for _, value := range dsValues.AsValueMap() {
const hcpIterationDatasourceType string = "hcp-packer-iteration"
iterationToChannel := make(map[string]string)
if iterationDatasourceValues, ok := values[hcpIterationDatasourceType]; ok {
for _, itValue := range iterationDatasourceValues.AsValueMap() {
if !itValue.IsKnown() {
continue
}
itValues := itValue.AsValueMap()
iterationID, channelID := itValues["id"].AsString(), itValues["channel_id"].AsString()
iterationToChannel[iterationID] = channelID
}
}
for _, value := range imageDatasourceValues.AsValueMap() {
// Only try to check ancestry if we have fetched the
// data from HCP for the data source.
//
@ -278,8 +291,17 @@ func (p *Parser) decodeBuildConfig(block *hcl.Block, cfg *PackerConfig) (*BuildB
}
values := value.AsValueMap()
imgID, itID := values["id"], values["iteration_id"]
cfg.bucket.SourceImagesToParentIterations[imgID.AsString()] = itID.AsString()
imgID, itID, channelID := values["id"], values["iteration_id"], values["channel_id"]
sourceIteration := packerregistry.ParentIteration{
IterationID: itID.AsString(),
ChannelID: channelID.AsString(),
}
if sourceIteration.ChannelID == "" {
sourceIteration.ChannelID = iterationToChannel[itID.AsString()]
}
cfg.bucket.SourceImagesToParentIterations[imgID.AsString()] = sourceIteration
}
}

@ -193,6 +193,7 @@ func (client *Client) UpdateBuild(
cloudProvider,
sourceImageID string,
sourceIterationID string,
sourceChannelID string,
labels map[string]string,
status models.HashicorpCloudPackerBuildStatus,
images []*models.HashicorpCloudPackerImageCreateBody,
@ -213,6 +214,7 @@ func (client *Client) UpdateBuild(
CloudProvider: cloudProvider,
SourceImageID: sourceImageID,
SourceIterationID: sourceIterationID,
SourceChannelID: sourceChannelID,
},
}
@ -228,14 +230,9 @@ func (client *Client) UpdateBuild(
return resp.Payload.Build.ID, nil
}
// GetIterationFromChannel loads the iterationId associated with a current channel. If the
// GetChannel loads the named channel that is associated to the bucket slug . If the
// channel does not exist in HCP Packer, GetChannel returns an error.
func (client *Client) GetIterationFromChannel(
ctx context.Context,
bucketSlug string,
channelName string,
) (*models.HashicorpCloudPackerIteration, error) {
func (client *Client) GetChannel(ctx context.Context, bucketSlug string, channelName string) (*models.HashicorpCloudPackerChannel, error) {
params := packer_service.NewPackerServiceGetChannelParamsWithContext(ctx)
params.LocationOrganizationID = client.OrganizationID
params.LocationProjectID = client.ProjectID
@ -247,14 +244,10 @@ func (client *Client) GetIterationFromChannel(
return nil, err
}
if resp.Payload.Channel != nil {
if resp.Payload.Channel.Iteration != nil {
return resp.Payload.Channel.Iteration, nil
}
return nil, fmt.Errorf("there is no iteration associated with the channel %s",
channelName)
if resp.Payload.Channel == nil {
return nil, fmt.Errorf("there is no channel with the name %s associated with the bucket %s",
channelName, bucketSlug)
}
return nil, fmt.Errorf("there is no channel with the name %s associated with the bucket %s",
channelName, bucketSlug)
return resp.Payload.Channel, nil
}

@ -27,18 +27,23 @@ type Bucket struct {
Destination string
BucketLabels map[string]string
BuildLabels map[string]string
SourceImagesToParentIterations map[string]string
SourceImagesToParentIterations map[string]ParentIteration
Iteration *Iteration
client *Client
}
type ParentIteration struct {
IterationID string
ChannelID string
}
// NewBucketWithIteration initializes a simple Bucket that can be used publishing Packer build
// images to the HCP Packer registry.
func NewBucketWithIteration(opts IterationOptions) (*Bucket, error) {
b := Bucket{
BucketLabels: make(map[string]string),
BuildLabels: make(map[string]string),
SourceImagesToParentIterations: make(map[string]string),
SourceImagesToParentIterations: make(map[string]ParentIteration),
}
i, err := NewIteration(opts)
@ -169,6 +174,7 @@ func (b *Bucket) UpdateBuildStatus(ctx context.Context, name string, status mode
"",
"",
"",
"",
nil,
status,
nil,
@ -205,7 +211,7 @@ func (b *Bucket) CompleteBuild(ctx context.Context, name string) error {
return fmt.Errorf("setting a build to DONE with no published images is not currently supported.")
}
var providerName, sourceID, sourceIterationID string
var providerName, sourceID, sourceIterationID, sourceChannelID string
images := make([]*models.HashicorpCloudPackerImageCreateBody, 0, len(buildToUpdate.Images))
for _, image := range buildToUpdate.Images {
// These values will always be the same for all images in a single build,
@ -219,7 +225,8 @@ func (b *Bucket) CompleteBuild(ctx context.Context, name string) error {
// Check if image is using some other HCP Packer image
if v, ok := b.SourceImagesToParentIterations[image.SourceImageID]; ok {
sourceIterationID = v
sourceIterationID = v.IterationID
sourceChannelID = v.ChannelID
}
images = append(images, &models.HashicorpCloudPackerImageCreateBody{ImageID: image.ImageID, Region: image.ProviderRegion})
@ -231,6 +238,7 @@ func (b *Bucket) CompleteBuild(ctx context.Context, name string) error {
buildToUpdate.CloudProvider,
sourceID,
sourceIterationID,
sourceChannelID,
buildToUpdate.Labels,
status,
images,
@ -447,6 +455,7 @@ func (b *Bucket) HeartbeatBuild(ctx context.Context, build string) (func(), erro
"",
"",
"",
"",
nil,
models.HashicorpCloudPackerBuildStatusRUNNING,
nil,

@ -15,6 +15,9 @@
to a UUID. It is created by the HCP Packer Registry when an iteration is
first created, and is unique to this iteration.
- `channel_id` (string) - The ID of the channel used to query the image iteration. This value will be empty if the `iteration_id` was used
directly instead of a channel.
- `packer_run_uuid` (string) - The UUID associated with the Packer run that created this image.
- `id` (string) - ID or URL of the remote cloud image as given by a build.

@ -27,4 +27,6 @@
- `updated_at` (string) - The date when this iteration was last updated.
- `channel_id` (string) - The ID of the channel used to query the image iteration.
<!-- End of code generated from the comments of the DatasourceOutput struct in datasource/hcp-packer-iteration/data.go; -->

Loading…
Cancel
Save