From 54469c472826ce915a640a3f7bbed76a32e28bf4 Mon Sep 17 00:00:00 2001 From: Megan Marsh Date: Wed, 12 Aug 2020 01:43:15 -0700 Subject: [PATCH] =?UTF-8?q?Add=20all=20of=20the=20custom=20AWS=20template?= =?UTF-8?q?=20engines=20to=20GeneratedData=20for=20use=20b=E2=80=A6=20(#97?= =?UTF-8?q?51)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- builder/amazon/chroot/builder.go | 7 ++++- builder/amazon/chroot/builder_test.go | 19 ++++++++++-- .../amazon/common/interpolate_build_info.go | 18 ++++++++++++ .../amazon/common/step_set_generated_data.go | 29 +++++++++++++++++++ builder/amazon/ebs/builder.go | 5 +++- builder/amazon/ebs/builder_test.go | 18 ++++++++++++ builder/amazon/ebssurrogate/builder.go | 5 +++- builder/amazon/ebssurrogate/builder_test.go | 18 ++++++++++++ builder/amazon/ebsvolume/builder.go | 7 ++++- builder/amazon/ebsvolume/builder_test.go | 18 ++++++++++++ builder/amazon/instance/builder.go | 5 +++- builder/amazon/instance/builder_test.go | 18 ++++++++++++ website/pages/docs/builders/amazon/chroot.mdx | 7 +++++ website/pages/docs/builders/amazon/ebs.mdx | 7 +++++ .../docs/builders/amazon/ebssurrogate.mdx | 7 +++++ .../pages/docs/builders/amazon/ebsvolume.mdx | 17 +++++++++++ .../pages/docs/builders/amazon/instance.mdx | 7 +++++ 17 files changed, 205 insertions(+), 7 deletions(-) create mode 100644 builder/amazon/common/step_set_generated_data.go diff --git a/builder/amazon/chroot/builder.go b/builder/amazon/chroot/builder.go index 4053f77c8..1cd6a2073 100644 --- a/builder/amazon/chroot/builder.go +++ b/builder/amazon/chroot/builder.go @@ -335,7 +335,9 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, []string, error) { } packer.LogSecretFilter.Set(b.config.AccessKey, b.config.SecretKey, b.config.Token) - generatedData := []string{"SourceAMIName", "Device", "MountPath"} + generatedData := awscommon.GetGeneratedDataList() + generatedData = append(generatedData, "Device", "MountPath") + return generatedData, warns, nil } @@ -420,6 +422,9 @@ func (b *Builder) Run(ctx context.Context, ui packer.Ui, hook packer.Hook) (pack &chroot.StepCopyFiles{ Files: b.config.CopyFiles, }, + &awscommon.StepSetGeneratedData{ + GeneratedData: generatedData, + }, &chroot.StepChrootProvision{}, &chroot.StepEarlyCleanup{}, &StepSnapshot{}, diff --git a/builder/amazon/chroot/builder_test.go b/builder/amazon/chroot/builder_test.go index dcab9e92b..bdecd2533 100644 --- a/builder/amazon/chroot/builder_test.go +++ b/builder/amazon/chroot/builder_test.go @@ -227,10 +227,25 @@ func TestBuilderPrepare_ReturnGeneratedData(t *testing.T) { if generatedData[0] != "SourceAMIName" { t.Fatalf("Generated data should contain SourceAMIName") } - if generatedData[1] != "Device" { + if generatedData[1] != "BuildRegion" { + t.Fatalf("Generated data should contain BuildRegion") + } + if generatedData[2] != "SourceAMI" { + t.Fatalf("Generated data should contain SourceAMI") + } + if generatedData[3] != "SourceAMICreationDate" { + t.Fatalf("Generated data should contain SourceAMICreationDate") + } + if generatedData[4] != "SourceAMIOwner" { + t.Fatalf("Generated data should contain SourceAMIOwner") + } + if generatedData[5] != "SourceAMIOwnerName" { + t.Fatalf("Generated data should contain SourceAMIOwnerName") + } + if generatedData[6] != "Device" { t.Fatalf("Generated data should contain Device") } - if generatedData[2] != "MountPath" { + if generatedData[7] != "MountPath" { t.Fatalf("Generated data should contain MountPath") } } diff --git a/builder/amazon/common/interpolate_build_info.go b/builder/amazon/common/interpolate_build_info.go index df11808cd..21647eaa0 100644 --- a/builder/amazon/common/interpolate_build_info.go +++ b/builder/amazon/common/interpolate_build_info.go @@ -40,6 +40,24 @@ func extractBuildInfo(region string, state multistep.StateBag, generatedData *bu SourceAMIOwnerName: aws.StringValue(sourceAMI.ImageOwnerAlias), SourceAMITags: sourceAMITags, } + + generatedData.Put("BuildRegion", buildInfoTemplate.BuildRegion) + generatedData.Put("SourceAMI", buildInfoTemplate.SourceAMI) + generatedData.Put("SourceAMICreationDate", buildInfoTemplate.SourceAMICreationDate) generatedData.Put("SourceAMIName", buildInfoTemplate.SourceAMIName) + generatedData.Put("SourceAMIOwner", buildInfoTemplate.SourceAMIOwner) + generatedData.Put("SourceAMIOwnerName", buildInfoTemplate.SourceAMIOwnerName) + return buildInfoTemplate } + +func GetGeneratedDataList() []string { + return []string{ + "SourceAMIName", + "BuildRegion", + "SourceAMI", + "SourceAMICreationDate", + "SourceAMIOwner", + "SourceAMIOwnerName", + } +} diff --git a/builder/amazon/common/step_set_generated_data.go b/builder/amazon/common/step_set_generated_data.go new file mode 100644 index 000000000..e364390b0 --- /dev/null +++ b/builder/amazon/common/step_set_generated_data.go @@ -0,0 +1,29 @@ +package common + +import ( + "context" + + "github.com/aws/aws-sdk-go/service/ec2" + "github.com/hashicorp/packer/builder" + "github.com/hashicorp/packer/helper/multistep" +) + +// &awscommon.StepSetGeneratedData{ +// GeneratedData: generatedData, +// }, + +type StepSetGeneratedData struct { + GeneratedData *builder.GeneratedData +} + +func (s *StepSetGeneratedData) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction { + ec2conn := state.Get("ec2").(*ec2.EC2) + + extractBuildInfo(*ec2conn.Config.Region, state, s.GeneratedData) + + return multistep.ActionContinue +} + +func (s *StepSetGeneratedData) Cleanup(state multistep.StateBag) { + // No cleanup... +} diff --git a/builder/amazon/ebs/builder.go b/builder/amazon/ebs/builder.go index 23ca9d7bb..5243df8d0 100644 --- a/builder/amazon/ebs/builder.go +++ b/builder/amazon/ebs/builder.go @@ -140,7 +140,7 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, []string, error) { packer.LogSecretFilter.Set(b.config.AccessKey, b.config.SecretKey, b.config.Token) - generatedData := []string{"SourceAMIName"} + generatedData := awscommon.GetGeneratedDataList() return generatedData, warns, nil } @@ -284,6 +284,9 @@ func (b *Builder) Run(ctx context.Context, ui packer.Ui, hook packer.Hook) (pack ), SSHConfig: b.config.RunConfig.Comm.SSHConfigFunc(), }, + &awscommon.StepSetGeneratedData{ + GeneratedData: generatedData, + }, &common.StepProvision{}, &common.StepCleanupTempKeys{ Comm: &b.config.RunConfig.Comm, diff --git a/builder/amazon/ebs/builder_test.go b/builder/amazon/ebs/builder_test.go index 0a553539e..8e255b868 100644 --- a/builder/amazon/ebs/builder_test.go +++ b/builder/amazon/ebs/builder_test.go @@ -144,7 +144,25 @@ func TestBuilderPrepare_ReturnGeneratedData(t *testing.T) { if len(generatedData) == 0 { t.Fatalf("Generated data should not be empty") } + if len(generatedData) == 0 { + t.Fatalf("Generated data should not be empty") + } if generatedData[0] != "SourceAMIName" { t.Fatalf("Generated data should contain SourceAMIName") } + if generatedData[1] != "BuildRegion" { + t.Fatalf("Generated data should contain BuildRegion") + } + if generatedData[2] != "SourceAMI" { + t.Fatalf("Generated data should contain SourceAMI") + } + if generatedData[3] != "SourceAMICreationDate" { + t.Fatalf("Generated data should contain SourceAMICreationDate") + } + if generatedData[4] != "SourceAMIOwner" { + t.Fatalf("Generated data should contain SourceAMIOwner") + } + if generatedData[5] != "SourceAMIOwnerName" { + t.Fatalf("Generated data should contain SourceAMIOwnerName") + } } diff --git a/builder/amazon/ebssurrogate/builder.go b/builder/amazon/ebssurrogate/builder.go index f2f744d5a..9a043dcb7 100644 --- a/builder/amazon/ebssurrogate/builder.go +++ b/builder/amazon/ebssurrogate/builder.go @@ -163,7 +163,7 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, []string, error) { packer.LogSecretFilter.Set(b.config.AccessKey, b.config.SecretKey, b.config.Token) - generatedData := []string{"SourceAMIName"} + generatedData := awscommon.GetGeneratedDataList() return generatedData, warns, nil } @@ -308,6 +308,9 @@ func (b *Builder) Run(ctx context.Context, ui packer.Ui, hook packer.Hook) (pack ), SSHConfig: b.config.RunConfig.Comm.SSHConfigFunc(), }, + &awscommon.StepSetGeneratedData{ + GeneratedData: generatedData, + }, &common.StepProvision{}, &common.StepCleanupTempKeys{ Comm: &b.config.RunConfig.Comm, diff --git a/builder/amazon/ebssurrogate/builder_test.go b/builder/amazon/ebssurrogate/builder_test.go index 663ea422c..33ad6756f 100644 --- a/builder/amazon/ebssurrogate/builder_test.go +++ b/builder/amazon/ebssurrogate/builder_test.go @@ -86,7 +86,25 @@ func TestBuilderPrepare_ReturnGeneratedData(t *testing.T) { if len(generatedData) == 0 { t.Fatalf("Generated data should not be empty") } + if len(generatedData) == 0 { + t.Fatalf("Generated data should not be empty") + } if generatedData[0] != "SourceAMIName" { t.Fatalf("Generated data should contain SourceAMIName") } + if generatedData[1] != "BuildRegion" { + t.Fatalf("Generated data should contain BuildRegion") + } + if generatedData[2] != "SourceAMI" { + t.Fatalf("Generated data should contain SourceAMI") + } + if generatedData[3] != "SourceAMICreationDate" { + t.Fatalf("Generated data should contain SourceAMICreationDate") + } + if generatedData[4] != "SourceAMIOwner" { + t.Fatalf("Generated data should contain SourceAMIOwner") + } + if generatedData[5] != "SourceAMIOwnerName" { + t.Fatalf("Generated data should contain SourceAMIOwnerName") + } } diff --git a/builder/amazon/ebsvolume/builder.go b/builder/amazon/ebsvolume/builder.go index 5cfc69ec2..07ef24878 100644 --- a/builder/amazon/ebsvolume/builder.go +++ b/builder/amazon/ebsvolume/builder.go @@ -12,6 +12,7 @@ import ( "github.com/aws/aws-sdk-go/service/ec2" "github.com/aws/aws-sdk-go/service/iam" "github.com/hashicorp/hcl/v2/hcldec" + "github.com/hashicorp/packer/builder" awscommon "github.com/hashicorp/packer/builder/amazon/common" "github.com/hashicorp/packer/common" "github.com/hashicorp/packer/hcl2template" @@ -146,7 +147,7 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, []string, error) { packer.LogSecretFilter.Set(b.config.AccessKey, b.config.SecretKey, b.config.Token) - generatedData := []string{"SourceAMIName"} + generatedData := awscommon.GetGeneratedDataList() return generatedData, warns, nil } @@ -166,6 +167,7 @@ func (b *Builder) Run(ctx context.Context, ui packer.Ui, hook packer.Hook) (pack state.Put("iam", iam) state.Put("hook", hook) state.Put("ui", ui) + generatedData := &builder.GeneratedData{State: state} var instanceStep multistep.Step @@ -276,6 +278,9 @@ func (b *Builder) Run(ctx context.Context, ui packer.Ui, hook packer.Hook) (pack ), SSHConfig: b.config.RunConfig.Comm.SSHConfigFunc(), }, + &awscommon.StepSetGeneratedData{ + GeneratedData: generatedData, + }, &common.StepProvision{}, &common.StepCleanupTempKeys{ Comm: &b.config.RunConfig.Comm, diff --git a/builder/amazon/ebsvolume/builder_test.go b/builder/amazon/ebsvolume/builder_test.go index d4202a573..7b8d20438 100644 --- a/builder/amazon/ebsvolume/builder_test.go +++ b/builder/amazon/ebsvolume/builder_test.go @@ -105,7 +105,25 @@ func TestBuilderPrepare_ReturnGeneratedData(t *testing.T) { if len(generatedData) == 0 { t.Fatalf("Generated data should not be empty") } + if len(generatedData) == 0 { + t.Fatalf("Generated data should not be empty") + } if generatedData[0] != "SourceAMIName" { t.Fatalf("Generated data should contain SourceAMIName") } + if generatedData[1] != "BuildRegion" { + t.Fatalf("Generated data should contain BuildRegion") + } + if generatedData[2] != "SourceAMI" { + t.Fatalf("Generated data should contain SourceAMI") + } + if generatedData[3] != "SourceAMICreationDate" { + t.Fatalf("Generated data should contain SourceAMICreationDate") + } + if generatedData[4] != "SourceAMIOwner" { + t.Fatalf("Generated data should contain SourceAMIOwner") + } + if generatedData[5] != "SourceAMIOwnerName" { + t.Fatalf("Generated data should contain SourceAMIOwnerName") + } } diff --git a/builder/amazon/instance/builder.go b/builder/amazon/instance/builder.go index 6964fba4d..9e254c76c 100644 --- a/builder/amazon/instance/builder.go +++ b/builder/amazon/instance/builder.go @@ -227,7 +227,7 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, []string, error) { } packer.LogSecretFilter.Set(b.config.AccessKey, b.config.SecretKey, b.config.Token) - generatedData := []string{"SourceAMIName"} + generatedData := awscommon.GetGeneratedDataList() return generatedData, warns, nil } @@ -360,6 +360,9 @@ func (b *Builder) Run(ctx context.Context, ui packer.Ui, hook packer.Hook) (pack ), SSHConfig: b.config.RunConfig.Comm.SSHConfigFunc(), }, + &awscommon.StepSetGeneratedData{ + GeneratedData: generatedData, + }, &common.StepProvision{}, &common.StepCleanupTempKeys{ Comm: &b.config.RunConfig.Comm, diff --git a/builder/amazon/instance/builder_test.go b/builder/amazon/instance/builder_test.go index 1456649ba..68c3d9786 100644 --- a/builder/amazon/instance/builder_test.go +++ b/builder/amazon/instance/builder_test.go @@ -319,7 +319,25 @@ func TestBuilderPrepare_ReturnGeneratedData(t *testing.T) { if len(generatedData) == 0 { t.Fatalf("Generated data should not be empty") } + if len(generatedData) == 0 { + t.Fatalf("Generated data should not be empty") + } if generatedData[0] != "SourceAMIName" { t.Fatalf("Generated data should contain SourceAMIName") } + if generatedData[1] != "BuildRegion" { + t.Fatalf("Generated data should contain BuildRegion") + } + if generatedData[2] != "SourceAMI" { + t.Fatalf("Generated data should contain SourceAMI") + } + if generatedData[3] != "SourceAMICreationDate" { + t.Fatalf("Generated data should contain SourceAMICreationDate") + } + if generatedData[4] != "SourceAMIOwner" { + t.Fatalf("Generated data should contain SourceAMIOwner") + } + if generatedData[5] != "SourceAMIOwnerName" { + t.Fatalf("Generated data should contain SourceAMIOwnerName") + } } diff --git a/website/pages/docs/builders/amazon/chroot.mdx b/website/pages/docs/builders/amazon/chroot.mdx index 38c9c0062..7062ee69d 100644 --- a/website/pages/docs/builders/amazon/chroot.mdx +++ b/website/pages/docs/builders/amazon/chroot.mdx @@ -508,9 +508,16 @@ This builder generates data that are shared with provisioner and post-processor The generated variables available for this builder are: +- `BuildRegion` - The region (for example `eu-central-1`) where Packer is + building the AMI. +- `SourceAMI` - The source AMI ID (for example `ami-a2412fcd`) used to build + the AMI. +- `SourceAMICreationDate` - The source AMI creation date (for example `"2020-05-14T19:26:34.000Z"`). - `SourceAMIName` - The source AMI Name (for example `ubuntu/images/ebs-ssd/ubuntu-xenial-16.04-amd64-server-20180306`) used to build the AMI. +- `SourceAMIOwner` - The source AMI owner ID. +- `SourceAMIOwnerName` - The source AMI owner alias/name (for example `amazon`). - `Device` - Root device path. - `MountPath` - Device mounting path. diff --git a/website/pages/docs/builders/amazon/ebs.mdx b/website/pages/docs/builders/amazon/ebs.mdx index 5c6f9dc74..70c01e1f3 100644 --- a/website/pages/docs/builders/amazon/ebs.mdx +++ b/website/pages/docs/builders/amazon/ebs.mdx @@ -316,9 +316,16 @@ This builder generates data that are shared with provisioner and post-processor The generated variables available for this builder are: +- `BuildRegion` - The region (for example `eu-central-1`) where Packer is + building the AMI. +- `SourceAMI` - The source AMI ID (for example `ami-a2412fcd`) used to build + the AMI. +- `SourceAMICreationDate` - The source AMI creation date (for example `"2020-05-14T19:26:34.000Z"`). - `SourceAMIName` - The source AMI Name (for example `ubuntu/images/ebs-ssd/ubuntu-xenial-16.04-amd64-server-20180306`) used to build the AMI. +- `SourceAMIOwner` - The source AMI owner ID. +- `SourceAMIOwnerName` - The source AMI owner alias/name (for example `amazon`). Usage example: diff --git a/website/pages/docs/builders/amazon/ebssurrogate.mdx b/website/pages/docs/builders/amazon/ebssurrogate.mdx index 7c760db1f..6e323a5ae 100644 --- a/website/pages/docs/builders/amazon/ebssurrogate.mdx +++ b/website/pages/docs/builders/amazon/ebssurrogate.mdx @@ -220,9 +220,16 @@ This builder generates data that are shared with provisioner and post-processor The generated variables available for this builder are: +- `BuildRegion` - The region (for example `eu-central-1`) where Packer is + building the AMI. +- `SourceAMI` - The source AMI ID (for example `ami-a2412fcd`) used to build + the AMI. +- `SourceAMICreationDate` - The source AMI creation date (for example `"2020-05-14T19:26:34.000Z"`). - `SourceAMIName` - The source AMI Name (for example `ubuntu/images/ebs-ssd/ubuntu-xenial-16.04-amd64-server-20180306`) used to build the AMI. +- `SourceAMIOwner` - The source AMI owner ID. +- `SourceAMIOwnerName` - The source AMI owner alias/name (for example `amazon`). Usage example: diff --git a/website/pages/docs/builders/amazon/ebsvolume.mdx b/website/pages/docs/builders/amazon/ebsvolume.mdx index e4e49720a..a6d4d9b97 100644 --- a/website/pages/docs/builders/amazon/ebsvolume.mdx +++ b/website/pages/docs/builders/amazon/ebsvolume.mdx @@ -245,6 +245,23 @@ variables are available: - `SourceAMIOwnerName` - The source AMI owner alias/name (for example `amazon`). - `SourceAMITags` - The source AMI Tags, as a `map[string]string` object. +## Build Shared Information Variables + +This builder generates data that are shared with provisioner and post-processor via build function of [template engine](/docs/templates/engine) for JSON and [contextual variables](/docs/from-1.5/contextual-variables) for HCL2. + +The generated variables available for this builder are: + +- `BuildRegion` - The region (for example `eu-central-1`) where Packer is + building the AMI. +- `SourceAMI` - The source AMI ID (for example `ami-a2412fcd`) used to build + the AMI. +- `SourceAMICreationDate` - The source AMI creation date (for example `"2020-05-14T19:26:34.000Z"`). +- `SourceAMIName` - The source AMI Name (for example + `ubuntu/images/ebs-ssd/ubuntu-xenial-16.04-amd64-server-20180306`) used to + build the AMI. +- `SourceAMIOwner` - The source AMI owner ID. +- `SourceAMIOwnerName` - The source AMI owner alias/name (for example `amazon`). + -> **Note:** Packer uses pre-built AMIs as the source for building images. These source AMIs may include volumes that are not flagged to be destroyed on termination of the instance building the new image. In addition to those diff --git a/website/pages/docs/builders/amazon/instance.mdx b/website/pages/docs/builders/amazon/instance.mdx index f8e1083a2..805ff299a 100644 --- a/website/pages/docs/builders/amazon/instance.mdx +++ b/website/pages/docs/builders/amazon/instance.mdx @@ -213,9 +213,16 @@ This builder generates data that are shared with provisioner and post-processor The generated variables available for this builder are: +- `BuildRegion` - The region (for example `eu-central-1`) where Packer is + building the AMI. +- `SourceAMI` - The source AMI ID (for example `ami-a2412fcd`) used to build + the AMI. +- `SourceAMICreationDate` - The source AMI creation date (for example `"2020-05-14T19:26:34.000Z"`). - `SourceAMIName` - The source AMI Name (for example `ubuntu/images/ebs-ssd/ubuntu-xenial-16.04-amd64-server-20180306`) used to build the AMI. +- `SourceAMIOwner` - The source AMI owner ID. +- `SourceAMIOwnerName` - The source AMI owner alias/name (for example `amazon`). Usage example: