From 980deeb6845e1c79155a4257bc0026faaebfd51c Mon Sep 17 00:00:00 2001 From: Megan Marsh Date: Wed, 25 Aug 2021 10:16:01 -0700 Subject: [PATCH] Implement hcp packer data source. This is a rough copy of the terraform provider's data source, to make beta user experience consistent across both sources --- command/plugin.go | 5 +- datasource/packer-image-iteration/data.go | 164 ++++++++++++++++++ .../packer-image-iteration/data.hcl2spec.go | 148 ++++++++++++++++ go.mod | 3 +- go.sum | 6 +- internal/packer_registry/registry_service.go | 29 ++++ .../Config-not-required.mdx | 7 + .../DatasourceOutput.mdx | 11 ++ .../Config-not-required.mdx | 7 + .../DatasourceOutput.mdx | 11 ++ .../ParBuild-not-required.mdx | 25 +++ .../packer-image-iteration/ParBuild.mdx | 6 + .../ParImage-not-required.mdx | 12 ++ .../packer-image-iteration/ParImage.mdx | 6 + 14 files changed, 436 insertions(+), 4 deletions(-) create mode 100644 datasource/packer-image-iteration/data.go create mode 100644 datasource/packer-image-iteration/data.hcl2spec.go create mode 100644 website/content/partials/datasource/packer-artifact-registry/Config-not-required.mdx create mode 100644 website/content/partials/datasource/packer-artifact-registry/DatasourceOutput.mdx create mode 100644 website/content/partials/datasource/packer-image-iteration/Config-not-required.mdx create mode 100644 website/content/partials/datasource/packer-image-iteration/DatasourceOutput.mdx create mode 100644 website/content/partials/datasource/packer-image-iteration/ParBuild-not-required.mdx create mode 100644 website/content/partials/datasource/packer-image-iteration/ParBuild.mdx create mode 100644 website/content/partials/datasource/packer-image-iteration/ParImage-not-required.mdx create mode 100644 website/content/partials/datasource/packer-image-iteration/ParImage.mdx diff --git a/command/plugin.go b/command/plugin.go index a1842d495..95d75b428 100644 --- a/command/plugin.go +++ b/command/plugin.go @@ -15,6 +15,7 @@ import ( filebuilder "github.com/hashicorp/packer/builder/file" nullbuilder "github.com/hashicorp/packer/builder/null" + packerimageiterationdatasource "github.com/hashicorp/packer/datasource/packer-image-iteration" artificepostprocessor "github.com/hashicorp/packer/post-processor/artifice" checksumpostprocessor "github.com/hashicorp/packer/post-processor/checksum" compresspostprocessor "github.com/hashicorp/packer/post-processor/compress" @@ -62,7 +63,9 @@ var PostProcessors = map[string]packersdk.PostProcessor{ "shell-local": new(shelllocalpostprocessor.PostProcessor), } -var Datasources = map[string]packersdk.Datasource{} +var Datasources = map[string]packersdk.Datasource{ + "packer-image-iteration": new(packerimageiterationdatasource.Datasource), +} var pluginRegexp = regexp.MustCompile("packer-(builder|post-processor|provisioner|datasource)-(.+)") diff --git a/datasource/packer-image-iteration/data.go b/datasource/packer-image-iteration/data.go new file mode 100644 index 000000000..ed29c3d8b --- /dev/null +++ b/datasource/packer-image-iteration/data.go @@ -0,0 +1,164 @@ +//go:generate packer-sdc struct-markdown +//go:generate packer-sdc mapstructure-to-hcl2 -type DatasourceOutput,Config,ParBuild,ParImage +package packer_image_iteration + +import ( + "context" + "fmt" + "log" + + "github.com/zclconf/go-cty/cty" + + "github.com/hashicorp/hcl/v2/hcldec" + "github.com/hashicorp/hcp-sdk-go/clients/cloud-packer-service/preview/2021-04-30/models" + "github.com/hashicorp/packer-plugin-sdk/common" + "github.com/hashicorp/packer-plugin-sdk/hcl2helper" + packersdk "github.com/hashicorp/packer-plugin-sdk/packer" + "github.com/hashicorp/packer-plugin-sdk/template/config" + packerregistry "github.com/hashicorp/packer/internal/packer_registry" +) + +type Datasource struct { + config Config +} + +type Config struct { + common.PackerConfig `mapstructure:",squash"` + // The name of the bucket your image is in. + Bucket string `mapstructure:"bucket_name"` + // The name of the channel to use when retrieving your image + Channel string `mapstructure:"channel"` + // TODO: Version string `mapstructure:"version"` + // TODO: Label string `mapstructure:"label"` +} + +func (d *Datasource) ConfigSpec() hcldec.ObjectSpec { + return d.config.FlatMapstructure().HCL2Spec() +} + +func (d *Datasource) Configure(raws ...interface{}) error { + err := config.Decode(&d.config, nil, raws...) + if err != nil { + return err + } + + var errs *packersdk.MultiError + + if d.config.Bucket == "" { + errs = packersdk.MultiErrorAppend(errs, fmt.Errorf("The `bucket_name` must be specified")) + } + if d.config.Channel == "" { + errs = packersdk.MultiErrorAppend(errs, fmt.Errorf("`channel` is currently a required field.")) + } + + if errs != nil && len(errs.Errors) > 0 { + return errs + } + return nil +} + +// Copy of []*models.HashicorpCloudPackerBuild. Need to copy so we can generate +// the HCL spec. +type ParBuild struct { + // aws + CloudProvider string `mapstructure:"cloud_provider"` + // builder or post-processor used to build this + ComponentType string `mapstructure:"component_type"` + // created at + // Format: date-time + CreatedAt string `mapstructure:"created_at"` + // ULID + ID string `mapstructure:"id"` + // images + Images []ParImage `mapstructure:"images"` + // ULID of the iteration + IterationID string `mapstructure:"iteration_id"` + // unstructured metadata + Labels map[string]string `mapstructure:"labels"` + // packer run uuid + PackerRunUUID string `mapstructure:"packer_run_uuid"` + // complete + Status string `mapstructure:"status"` + // updated at + // Format: date-time + UpdatedAt string `mapstructure:"updated_at"` +} + +// Copy of []*models.HashicorpCloudPackerImage Need to copy so we can generate +// the HCL spec. +type ParImage struct { + // Timestamp at which this image was created + // Format: date-time + CreatedAt string `mapstructure:"created_at,omitempty"` + // ULID for the image + ID string `mapstructure:"id,omitempty"` + // ID or URL of the remote cloud image as given by a build. + ImageID string `mapstructure:"image_id,omitempty"` + // region as given by `packer build`. eg. "ap-east-1" + Region string `mapstructure:"region,omitempty"` +} + +type DatasourceOutput struct { + Id string `mapstructure:"Id"` + IncrementalVersion int32 `mapstructure:"incremental_version"` + CreatedAt string `mapstructure:"created_at"` + Builds []ParBuild `mapstructure:"builds"` +} + +func (d *Datasource) OutputSpec() hcldec.ObjectSpec { + return (&DatasourceOutput{}).FlatMapstructure().HCL2Spec() +} + +func (d *Datasource) Execute() (cty.Value, error) { + cli, err := packerregistry.NewClient() + if err != nil { + return cty.NullVal(cty.EmptyObject), err + } + // Load channel. + 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 := packerregistry.GetIterationFromChannel(context.TODO(), cli, 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()) + } + output := DatasourceOutput{ + IncrementalVersion: iteration.IncrementalVersion, + CreatedAt: iteration.CreatedAt.String(), + Builds: convertPackerBuildList(iteration.Builds), + } + + return hcl2helper.HCL2ValueFromConfig(output, d.OutputSpec()), nil +} + +func convertPackerBuildList(builds []*models.HashicorpCloudPackerBuild) (flattened []ParBuild) { + for _, build := range builds { + out := ParBuild{ + CloudProvider: build.CloudProvider, + ComponentType: build.ComponentType, + CreatedAt: build.CreatedAt.String(), + ID: build.ID, + Images: convertPackerBuildImagesList(build.Images), + Labels: build.Labels, + PackerRunUUID: build.PackerRunUUID, + Status: string(build.Status), + UpdatedAt: build.UpdatedAt.String(), + } + flattened = append(flattened, out) + } + return +} + +func convertPackerBuildImagesList(images []*models.HashicorpCloudPackerImage) (flattened []ParImage) { + for _, image := range images { + out := ParImage{ + CreatedAt: image.CreatedAt.String(), + ID: image.ID, + ImageID: image.ImageID, + Region: image.Region, + } + flattened = append(flattened, out) + } + return +} diff --git a/datasource/packer-image-iteration/data.hcl2spec.go b/datasource/packer-image-iteration/data.hcl2spec.go new file mode 100644 index 000000000..064c18a03 --- /dev/null +++ b/datasource/packer-image-iteration/data.hcl2spec.go @@ -0,0 +1,148 @@ +// Code generated by "packer-sdc mapstructure-to-hcl2"; DO NOT EDIT. + +package packer_image_iteration + +import ( + "github.com/hashicorp/hcl/v2/hcldec" + "github.com/zclconf/go-cty/cty" +) + +// FlatConfig is an auto-generated flat version of Config. +// Where the contents of a field with a `mapstructure:,squash` tag are bubbled up. +type FlatConfig struct { + PackerBuildName *string `mapstructure:"packer_build_name" cty:"packer_build_name" hcl:"packer_build_name"` + PackerBuilderType *string `mapstructure:"packer_builder_type" cty:"packer_builder_type" hcl:"packer_builder_type"` + PackerCoreVersion *string `mapstructure:"packer_core_version" cty:"packer_core_version" hcl:"packer_core_version"` + PackerDebug *bool `mapstructure:"packer_debug" cty:"packer_debug" hcl:"packer_debug"` + PackerForce *bool `mapstructure:"packer_force" cty:"packer_force" hcl:"packer_force"` + PackerOnError *string `mapstructure:"packer_on_error" cty:"packer_on_error" hcl:"packer_on_error"` + PackerUserVars map[string]string `mapstructure:"packer_user_variables" cty:"packer_user_variables" hcl:"packer_user_variables"` + PackerSensitiveVars []string `mapstructure:"packer_sensitive_variables" cty:"packer_sensitive_variables" hcl:"packer_sensitive_variables"` + Bucket *string `mapstructure:"bucket_name" cty:"bucket_name" hcl:"bucket_name"` + Channel *string `mapstructure:"channel" cty:"channel" hcl:"channel"` +} + +// FlatMapstructure returns a new FlatConfig. +// FlatConfig is an auto-generated flat version of Config. +// Where the contents a fields with a `mapstructure:,squash` tag are bubbled up. +func (*Config) FlatMapstructure() interface{ HCL2Spec() map[string]hcldec.Spec } { + return new(FlatConfig) +} + +// HCL2Spec returns the hcl spec of a Config. +// This spec is used by HCL to read the fields of Config. +// The decoded values from this spec will then be applied to a FlatConfig. +func (*FlatConfig) HCL2Spec() map[string]hcldec.Spec { + s := map[string]hcldec.Spec{ + "packer_build_name": &hcldec.AttrSpec{Name: "packer_build_name", Type: cty.String, Required: false}, + "packer_builder_type": &hcldec.AttrSpec{Name: "packer_builder_type", Type: cty.String, Required: false}, + "packer_core_version": &hcldec.AttrSpec{Name: "packer_core_version", Type: cty.String, Required: false}, + "packer_debug": &hcldec.AttrSpec{Name: "packer_debug", Type: cty.Bool, Required: false}, + "packer_force": &hcldec.AttrSpec{Name: "packer_force", Type: cty.Bool, Required: false}, + "packer_on_error": &hcldec.AttrSpec{Name: "packer_on_error", Type: cty.String, Required: false}, + "packer_user_variables": &hcldec.AttrSpec{Name: "packer_user_variables", Type: cty.Map(cty.String), Required: false}, + "packer_sensitive_variables": &hcldec.AttrSpec{Name: "packer_sensitive_variables", Type: cty.List(cty.String), Required: false}, + "bucket_name": &hcldec.AttrSpec{Name: "bucket_name", Type: cty.String, Required: false}, + "channel": &hcldec.AttrSpec{Name: "channel", Type: cty.String, Required: false}, + } + return s +} + +// FlatDatasourceOutput is an auto-generated flat version of DatasourceOutput. +// Where the contents of a field with a `mapstructure:,squash` tag are bubbled up. +type FlatDatasourceOutput struct { + Id *string `mapstructure:"Id" cty:"Id" hcl:"Id"` + IncrementalVersion *int32 `mapstructure:"incremental_version" cty:"incremental_version" hcl:"incremental_version"` + CreatedAt *string `mapstructure:"created_at" cty:"created_at" hcl:"created_at"` + Builds []FlatParBuild `mapstructure:"builds" cty:"builds" hcl:"builds"` +} + +// FlatMapstructure returns a new FlatDatasourceOutput. +// FlatDatasourceOutput is an auto-generated flat version of DatasourceOutput. +// Where the contents a fields with a `mapstructure:,squash` tag are bubbled up. +func (*DatasourceOutput) FlatMapstructure() interface{ HCL2Spec() map[string]hcldec.Spec } { + return new(FlatDatasourceOutput) +} + +// HCL2Spec returns the hcl spec of a DatasourceOutput. +// This spec is used by HCL to read the fields of DatasourceOutput. +// The decoded values from this spec will then be applied to a FlatDatasourceOutput. +func (*FlatDatasourceOutput) HCL2Spec() map[string]hcldec.Spec { + s := 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}, + "created_at": &hcldec.AttrSpec{Name: "created_at", Type: cty.String, Required: false}, + "builds": &hcldec.BlockListSpec{TypeName: "builds", Nested: hcldec.ObjectSpec((*FlatParBuild)(nil).HCL2Spec())}, + } + return s +} + +// FlatParBuild is an auto-generated flat version of ParBuild. +// Where the contents of a field with a `mapstructure:,squash` tag are bubbled up. +type FlatParBuild struct { + CloudProvider *string `mapstructure:"cloud_provider" cty:"cloud_provider" hcl:"cloud_provider"` + ComponentType *string `mapstructure:"component_type" cty:"component_type" hcl:"component_type"` + CreatedAt *string `mapstructure:"created_at" cty:"created_at" hcl:"created_at"` + ID *string `mapstructure:"id" cty:"id" hcl:"id"` + Images []FlatParImage `mapstructure:"images" cty:"images" hcl:"images"` + IterationID *string `mapstructure:"iteration_id" cty:"iteration_id" hcl:"iteration_id"` + Labels map[string]string `mapstructure:"labels" cty:"labels" hcl:"labels"` + PackerRunUUID *string `mapstructure:"packer_run_uuid" cty:"packer_run_uuid" hcl:"packer_run_uuid"` + Status *string `mapstructure:"status" cty:"status" hcl:"status"` + UpdatedAt *string `mapstructure:"updated_at" cty:"updated_at" hcl:"updated_at"` +} + +// FlatMapstructure returns a new FlatParBuild. +// FlatParBuild is an auto-generated flat version of ParBuild. +// Where the contents a fields with a `mapstructure:,squash` tag are bubbled up. +func (*ParBuild) FlatMapstructure() interface{ HCL2Spec() map[string]hcldec.Spec } { + return new(FlatParBuild) +} + +// HCL2Spec returns the hcl spec of a ParBuild. +// This spec is used by HCL to read the fields of ParBuild. +// The decoded values from this spec will then be applied to a FlatParBuild. +func (*FlatParBuild) HCL2Spec() map[string]hcldec.Spec { + s := map[string]hcldec.Spec{ + "cloud_provider": &hcldec.AttrSpec{Name: "cloud_provider", Type: cty.String, Required: false}, + "component_type": &hcldec.AttrSpec{Name: "component_type", Type: cty.String, Required: false}, + "created_at": &hcldec.AttrSpec{Name: "created_at", Type: cty.String, Required: false}, + "id": &hcldec.AttrSpec{Name: "id", Type: cty.String, Required: false}, + "images": &hcldec.BlockListSpec{TypeName: "images", Nested: hcldec.ObjectSpec((*FlatParImage)(nil).HCL2Spec())}, + "iteration_id": &hcldec.AttrSpec{Name: "iteration_id", Type: cty.String, Required: false}, + "labels": &hcldec.AttrSpec{Name: "labels", Type: cty.Map(cty.String), Required: false}, + "packer_run_uuid": &hcldec.AttrSpec{Name: "packer_run_uuid", Type: cty.String, Required: false}, + "status": &hcldec.AttrSpec{Name: "status", Type: cty.String, Required: false}, + "updated_at": &hcldec.AttrSpec{Name: "updated_at", Type: cty.String, Required: false}, + } + return s +} + +// FlatParImage is an auto-generated flat version of ParImage. +// Where the contents of a field with a `mapstructure:,squash` tag are bubbled up. +type FlatParImage struct { + CreatedAt *string `mapstructure:"created_at,omitempty" cty:"created_at" hcl:"created_at"` + ID *string `mapstructure:"id,omitempty" cty:"id" hcl:"id"` + ImageID *string `mapstructure:"image_id,omitempty" cty:"image_id" hcl:"image_id"` + Region *string `mapstructure:"region,omitempty" cty:"region" hcl:"region"` +} + +// FlatMapstructure returns a new FlatParImage. +// FlatParImage is an auto-generated flat version of ParImage. +// Where the contents a fields with a `mapstructure:,squash` tag are bubbled up. +func (*ParImage) FlatMapstructure() interface{ HCL2Spec() map[string]hcldec.Spec } { + return new(FlatParImage) +} + +// HCL2Spec returns the hcl spec of a ParImage. +// This spec is used by HCL to read the fields of ParImage. +// The decoded values from this spec will then be applied to a FlatParImage. +func (*FlatParImage) HCL2Spec() map[string]hcldec.Spec { + s := map[string]hcldec.Spec{ + "created_at": &hcldec.AttrSpec{Name: "created_at", Type: cty.String, Required: false}, + "id": &hcldec.AttrSpec{Name: "id", Type: cty.String, Required: false}, + "image_id": &hcldec.AttrSpec{Name: "image_id", Type: cty.String, Required: false}, + "region": &hcldec.AttrSpec{Name: "region", Type: cty.String, Required: false}, + } + return s +} diff --git a/go.mod b/go.mod index 8ee7046d8..8d23aefcd 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,7 @@ module github.com/hashicorp/packer require ( + github.com/StackExchange/wmi v1.2.1 // indirect github.com/biogo/hts v0.0.0-20160420073057-50da7d4131a3 github.com/cheggaaa/pb v1.0.27 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e @@ -70,7 +71,7 @@ require ( github.com/shirou/gopsutil v3.21.1+incompatible github.com/stretchr/testify v1.7.0 github.com/ulikunitz/xz v0.5.8 - github.com/zclconf/go-cty v1.9.0 + github.com/zclconf/go-cty v1.9.1 github.com/zclconf/go-cty-yaml v1.0.1 golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a golang.org/x/mod v0.4.1 diff --git a/go.sum b/go.sum index 416e8437a..1e7a0c65e 100644 --- a/go.sum +++ b/go.sum @@ -115,8 +115,9 @@ github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tN github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/Telmate/proxmox-api-go v0.0.0-20200715182505-ec97c70ba887/go.mod h1:OGWyIMJ87/k/GCz8CGiWB2HOXsOVDM6Lpe/nFPkC4IQ= github.com/Telmate/proxmox-api-go v0.0.0-20210320143302-fea68269e6b0/go.mod h1:ayPkdmEKnlssqLQ9K1BE1jlsaYhXVwkoduXI30oQF0I= github.com/Telmate/proxmox-api-go v0.0.0-20210331182840-ff89a0cebcfa/go.mod h1:ayPkdmEKnlssqLQ9K1BE1jlsaYhXVwkoduXI30oQF0I= @@ -1231,8 +1232,9 @@ github.com/zclconf/go-cty v1.7.0/go.mod h1:VDR4+I79ubFBGm1uJac1226K5yANQFHeauxPB github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= github.com/zclconf/go-cty v1.8.1/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= github.com/zclconf/go-cty v1.8.3/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= -github.com/zclconf/go-cty v1.9.0 h1:IgJxw5b4LPXCPeqFjjhLaNEA8NKXMyaEUdAd399acts= github.com/zclconf/go-cty v1.9.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= +github.com/zclconf/go-cty v1.9.1 h1:viqrgQwFl5UpSxc046qblj78wZXVDFnSOufaOTER+cc= +github.com/zclconf/go-cty v1.9.1/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= github.com/zclconf/go-cty-yaml v1.0.1 h1:up11wlgAaDvlAGENcFDnZgkn0qUJurso7k6EpURKNF8= github.com/zclconf/go-cty-yaml v1.0.1/go.mod h1:IP3Ylp0wQpYm50IHK8OZWKMu6sPJIUgKa8XhiVHura0= diff --git a/internal/packer_registry/registry_service.go b/internal/packer_registry/registry_service.go index ac6f9a676..deb926683 100644 --- a/internal/packer_registry/registry_service.go +++ b/internal/packer_registry/registry_service.go @@ -3,6 +3,7 @@ package packer_registry import ( "context" "errors" + "fmt" packerSvc "github.com/hashicorp/hcp-sdk-go/clients/cloud-packer-service/preview/2021-04-30/client/packer_service" "github.com/hashicorp/hcp-sdk-go/clients/cloud-packer-service/preview/2021-04-30/models" @@ -140,3 +141,31 @@ func UpdateBuild(ctx context.Context, client *Client, input *models.HashicorpClo return resp.Payload.Build.ID, nil } + +// GetChannel loads the iterationId associated with a current channel. If +// the channel does not exist in HCP Packer, GetChannel returns an error. +func GetIterationFromChannel(ctx context.Context, client *Client, bucketSlug string, channelName string) (*models.HashicorpCloudPackerIteration, error) { + params := packerSvc.NewGetChannelParamsWithContext(ctx) + params.LocationOrganizationID = client.OrganizationID + params.LocationProjectID = client.ProjectID + params.BucketSlug = bucketSlug + params.Slug = channelName + + resp, err := client.Packer.GetChannel(params, nil) + if err != nil { + return nil, err + } + + if resp.Payload.Channel != nil { + if resp.Payload.Channel.Pointer != nil { + // The channel payload contains a pointer, which points to the iteration. + // Reach into the pointer to get the desired iteration. + return resp.Payload.Channel.Pointer.Iteration, nil + } + return nil, fmt.Errorf("there is no iteration associated with the channel %s", + channelName) + } + + return nil, fmt.Errorf("there is no channel with the name %s associated with the bucket %s", + channelName, bucketSlug) +} diff --git a/website/content/partials/datasource/packer-artifact-registry/Config-not-required.mdx b/website/content/partials/datasource/packer-artifact-registry/Config-not-required.mdx new file mode 100644 index 000000000..989d06be6 --- /dev/null +++ b/website/content/partials/datasource/packer-artifact-registry/Config-not-required.mdx @@ -0,0 +1,7 @@ + + +- `bucket_name` (string) - The name of the bucket your image is in. + +- `channel` (string) - The name of the channel to use when retrieving your image + + diff --git a/website/content/partials/datasource/packer-artifact-registry/DatasourceOutput.mdx b/website/content/partials/datasource/packer-artifact-registry/DatasourceOutput.mdx new file mode 100644 index 000000000..d98178434 --- /dev/null +++ b/website/content/partials/datasource/packer-artifact-registry/DatasourceOutput.mdx @@ -0,0 +1,11 @@ + + +- `Id` (string) - Id + +- `incremental_version` (int32) - Incremental Version + +- `created_at` (string) - Created At + +- `builds` (map[string]interface{}) - Builds + + diff --git a/website/content/partials/datasource/packer-image-iteration/Config-not-required.mdx b/website/content/partials/datasource/packer-image-iteration/Config-not-required.mdx new file mode 100644 index 000000000..55ebde6eb --- /dev/null +++ b/website/content/partials/datasource/packer-image-iteration/Config-not-required.mdx @@ -0,0 +1,7 @@ + + +- `bucket_name` (string) - The name of the bucket your image is in. + +- `channel` (string) - The name of the channel to use when retrieving your image + + diff --git a/website/content/partials/datasource/packer-image-iteration/DatasourceOutput.mdx b/website/content/partials/datasource/packer-image-iteration/DatasourceOutput.mdx new file mode 100644 index 000000000..1ffe5ce8e --- /dev/null +++ b/website/content/partials/datasource/packer-image-iteration/DatasourceOutput.mdx @@ -0,0 +1,11 @@ + + +- `Id` (string) - Id + +- `incremental_version` (int32) - Incremental Version + +- `created_at` (string) - Created At + +- `builds` ([]ParBuild) - Builds + + diff --git a/website/content/partials/datasource/packer-image-iteration/ParBuild-not-required.mdx b/website/content/partials/datasource/packer-image-iteration/ParBuild-not-required.mdx new file mode 100644 index 000000000..b1345e8c9 --- /dev/null +++ b/website/content/partials/datasource/packer-image-iteration/ParBuild-not-required.mdx @@ -0,0 +1,25 @@ + + +- `cloud_provider` (string) - aws + +- `component_type` (string) - builder or post-processor used to build this + +- `created_at` (string) - created at + Format: date-time + +- `id` (string) - ULID + +- `images` ([]ParImage) - images + +- `iteration_id` (string) - ULID of the iteration + +- `labels` (map[string]string) - unstructured metadata + +- `packer_run_uuid` (string) - packer run uuid + +- `status` (string) - complete + +- `updated_at` (string) - updated at + Format: date-time + + diff --git a/website/content/partials/datasource/packer-image-iteration/ParBuild.mdx b/website/content/partials/datasource/packer-image-iteration/ParBuild.mdx new file mode 100644 index 000000000..f8103c591 --- /dev/null +++ b/website/content/partials/datasource/packer-image-iteration/ParBuild.mdx @@ -0,0 +1,6 @@ + + +Copy of []*models.HashicorpCloudPackerBuild. Need to copy so we can generate +the HCL spec. + + diff --git a/website/content/partials/datasource/packer-image-iteration/ParImage-not-required.mdx b/website/content/partials/datasource/packer-image-iteration/ParImage-not-required.mdx new file mode 100644 index 000000000..7f2ce1669 --- /dev/null +++ b/website/content/partials/datasource/packer-image-iteration/ParImage-not-required.mdx @@ -0,0 +1,12 @@ + + +- `created_at` (string) - Timestamp at which this image was created + Format: date-time + +- `id` (string) - ULID for the image + +- `image_id` (string) - ID or URL of the remote cloud image as given by a build. + +- `region` (string) - region as given by `packer build`. eg. "ap-east-1" + + diff --git a/website/content/partials/datasource/packer-image-iteration/ParImage.mdx b/website/content/partials/datasource/packer-image-iteration/ParImage.mdx new file mode 100644 index 000000000..d4c9f4c1f --- /dev/null +++ b/website/content/partials/datasource/packer-image-iteration/ParImage.mdx @@ -0,0 +1,6 @@ + + +Copy of []*models.HashicorpCloudPackerImage Need to copy so we can generate +the HCL spec. + +