diff --git a/command/plugin.go b/command/plugin.go index 798b064b0..e8a42c41b 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" @@ -58,7 +59,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..a698a060d --- /dev/null +++ b/datasource/packer-image-iteration/data.go @@ -0,0 +1,184 @@ +//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" required:"true"` + // The name of the channel to use when retrieving your image + Channel string `mapstructure:"channel" required:"true"` + // 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 { + // The name of the cloud provider that the build exists in. For example, + // "aws", "azure", or "gce". + CloudProvider string `mapstructure:"cloud_provider"` + // The specific Packer builder or post-processor used to create the build. + ComponentType string `mapstructure:"component_type"` + // The date and time at which the build was run. + CreatedAt string `mapstructure:"created_at"` + // The build id. This is a ULID, which is a unique identifier similar + // to a UUID. It is created by the HCP Packer Registry when an build is + // first created, and is unique to this build. + ID string `mapstructure:"id"` + // A list of images as stored in the HCP Packer registry. See the ParImage + // docs for more information. + Images []ParImage `mapstructure:"images"` + // The iteration id. This is a ULID, which is a unique identifier similar + // 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"` + // Unstructured key:value metadata associated with the build. + Labels map[string]string `mapstructure:"labels"` + // The UUID associated with the Packer run that created this build. + PackerRunUUID string `mapstructure:"packer_run_uuid"` + // Whether the build is considered "complete" (the Packer build ran + // successfully and created an artifact), or "incomplete" (the Packer + // build did not finish, and there is no uploaded artifact). + Status string `mapstructure:"status"` + // The date and time at which the build was last updated. + UpdatedAt string `mapstructure:"updated_at"` +} + +// Copy of []*models.HashicorpCloudPackerImage Need to copy so we can generate +// the HCL spec. +type ParImage struct { + // The date and time at which the build was last updated. + CreatedAt string `mapstructure:"created_at,omitempty"` + // The iteration id. This is a ULID, which is a unique identifier similar + // to a UUID. It is created by the HCP Packer Registry when an iteration is + // first created, and is unique to this iteration. + ID string `mapstructure:"id,omitempty"` + // ID or URL of the remote cloud image as given by a build. + ImageID string `mapstructure:"image_id,omitempty"` + // The cloud region as given by `packer build`. eg. "ap-east-1". + // For locally managed clouds, this may map instead to a cluster, server + // or datastore. + Region string `mapstructure:"region,omitempty"` +} + +type DatasourceOutput struct { + // The iteration id. This is a ULID, which is a unique identifier similar + // to a UUID. It is created by the HCP Packer Registry when an iteration is + // first created, and is unique to this iteration. + Id string `mapstructure:"Id"` + // The version number assigned to an iteration. This number is an integer, + // and is created by the HCP Packer Registry once an iteration is + // marked "complete". If a new iteration is marked "complete", the version + // that HCP Packer assigns to it will always be the highest previous + // iteration version plus one. + IncrementalVersion int32 `mapstructure:"incremental_version"` + // The date the iteration was created. + CreatedAt string `mapstructure:"created_at"` + // A list of builds that are stored in the iteration. These builds can be + // parsed using HCL to find individual image ids for specific providers. + 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..9da8a7efb --- /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" required:"true" cty:"bucket_name" hcl:"bucket_name"` + Channel *string `mapstructure:"channel" required:"true" 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 5e1c7fb31..db12702c8 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 diff --git a/go.sum b/go.sum index 3be2bda52..f1a0c4684 100644 --- a/go.sum +++ b/go.sum @@ -116,8 +116,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= 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/docs/datasources/packer-image-iteration.mdx b/website/content/docs/datasources/packer-image-iteration.mdx new file mode 100644 index 000000000..7e7edbdda --- /dev/null +++ b/website/content/docs/datasources/packer-image-iteration.mdx @@ -0,0 +1,43 @@ +--- +description: | + The Packer Image Iteration Data Source retrieves information about an + iteration from the HCP Packer registry. This information can be parsed to + provide a source image to various Packer builders. +page_title: Packer Image Iteration - Data Sources +--- + +# Packer Image Iteration Data Source + +Type: `packer-image-iteration` + +The `Packer Image Iteration` Data Source retrieves information about an +iteration from the HCP Packer registry. This information can be parsed to +provide a source image to various Packer builders. + +Please note: The HCP Packer registry is in development, and is not yet available +for public use. For more information about HCP Packer, see https://www.hashicorp.com/blog/announcing-hcp-packer + +## Basic Example + +Below is a fully functioning example. It stores information about an image +iteration, which can then be parsed and accessed using HCL tools. + +```hcl +data "packer-image-iteration" "hardened-source" { + bucket = "hardened-ubuntu-16-04" + channel = "production-stable" +} +``` + +## Configuration Reference + +Configuration options are organized below into two categories: required and +optional. Within each category, the available options are alphabetized and +described. + +### Required: + +@include 'datasource/packer-image-iteration/RunConfig-required.mdx' + +There are currently no optional fields for this datasource, though we intend +to add filtering fields in the future. \ No newline at end of file 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/Config-required.mdx b/website/content/partials/datasource/packer-image-iteration/Config-required.mdx new file mode 100644 index 000000000..55ebde6eb --- /dev/null +++ b/website/content/partials/datasource/packer-image-iteration/Config-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..20f15d53a --- /dev/null +++ b/website/content/partials/datasource/packer-image-iteration/DatasourceOutput.mdx @@ -0,0 +1,18 @@ + + +- `Id` (string) - The iteration id. This is a ULID, which is a unique identifier similar + to a UUID. It is created by the HCP Packer Registry when an iteration is + first created, and is unique to this iteration. + +- `incremental_version` (int32) - The version number assigned to an iteration. This number is an integer, + and is created by the HCP Packer Registry once an iteration is + marked "complete". If a new iteration is marked "complete", the version + that HCP Packer assigns to it will always be the highest previous + iteration version plus one. + +- `created_at` (string) - The date the iteration was created. + +- `builds` ([]ParBuild) - A list of builds that are stored in the iteration. These builds can be + parsed using HCL to find individual image ids for specific providers. + + 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..4ae39c4ac --- /dev/null +++ b/website/content/partials/datasource/packer-image-iteration/ParBuild-not-required.mdx @@ -0,0 +1,31 @@ + + +- `cloud_provider` (string) - The name of the cloud provider that the build exists in. For example, + "aws", "azure", or "gce". + +- `component_type` (string) - The specific Packer builder or post-processor used to create the build. + +- `created_at` (string) - The date and time at which the build was run. + +- `id` (string) - The build id. This is a ULID, which is a unique identifier similar + to a UUID. It is created by the HCP Packer Registry when an build is + first created, and is unique to this build. + +- `images` ([]ParImage) - A list of images as stored in the HCP Packer registry. See the ParImage + docs for more information. + +- `iteration_id` (string) - The iteration id. This is a ULID, which is a unique identifier similar + to a UUID. It is created by the HCP Packer Registry when an iteration is + first created, and is unique to this iteration. + +- `labels` (map[string]string) - Unstructured key:value metadata associated with the build. + +- `packer_run_uuid` (string) - The UUID associated with the Packer run that created this build. + +- `status` (string) - Whether the build is considered "complete" (the Packer build ran + successfully and created an artifact), or "incomplete" (the Packer + build did not finish, and there is no uploaded artifact). + +- `updated_at` (string) - The date and time at which the build was last updated. + + 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..fe891d0ed --- /dev/null +++ b/website/content/partials/datasource/packer-image-iteration/ParImage-not-required.mdx @@ -0,0 +1,15 @@ + + +- `created_at` (string) - The date and time at which the build was last updated. + +- `id` (string) - The iteration id. This is a ULID, which is a unique identifier similar + to a UUID. It is created by the HCP Packer Registry when an iteration is + first created, and is unique to this iteration. + +- `image_id` (string) - ID or URL of the remote cloud image as given by a build. + +- `region` (string) - The cloud region as given by `packer build`. eg. "ap-east-1". + For locally managed clouds, this may map instead to a cluster, server + or datastore. + + 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. + +