From cc56959ac97b28644547e7adbeb20e62f6c868f2 Mon Sep 17 00:00:00 2001 From: Wilken Rivera Date: Tue, 30 Nov 2021 20:39:28 -0500 Subject: [PATCH] Move to using ectx to preload build names * Add basic post-processor test Closes #11411 --- ...processor_build_name_interpolation.pkr.hcl | 13 ++ ...ovisioner_build_name_interpolation.pkr.hcl | 17 +++ hcl2template/types.build.go | 15 ++- hcl2template/types.build.post-processor.go | 5 +- hcl2template/types.build.provisioners.go | 4 +- hcl2template/types.build_test.go | 114 ++++++++++++++++++ 6 files changed, 160 insertions(+), 8 deletions(-) create mode 100644 hcl2template/testdata/build/post-processor_build_name_interpolation.pkr.hcl create mode 100644 hcl2template/testdata/build/provisioner_build_name_interpolation.pkr.hcl diff --git a/hcl2template/testdata/build/post-processor_build_name_interpolation.pkr.hcl b/hcl2template/testdata/build/post-processor_build_name_interpolation.pkr.hcl new file mode 100644 index 00000000000..81799a25efa --- /dev/null +++ b/hcl2template/testdata/build/post-processor_build_name_interpolation.pkr.hcl @@ -0,0 +1,13 @@ +build { + name = "test-build" + sources = [ "source.virtualbox-iso.ubuntu-1204" ] + + post-processor "manifest" { + name = build.name + slice_string = ["${packer.version}", "${build.name}"] + } + +} + +source "virtualbox-iso" "ubuntu-1204" { +} diff --git a/hcl2template/testdata/build/provisioner_build_name_interpolation.pkr.hcl b/hcl2template/testdata/build/provisioner_build_name_interpolation.pkr.hcl new file mode 100644 index 00000000000..79e2ca21af7 --- /dev/null +++ b/hcl2template/testdata/build/provisioner_build_name_interpolation.pkr.hcl @@ -0,0 +1,17 @@ + +// starts resources to provision them. +build { + name = "build-name-test" + sources = [ + "source.virtualbox-iso.ubuntu-1204", + ] + + provisioner "shell" { + name = build.name + slice_string = ["${build.name}"] + } +} + +source "virtualbox-iso" "ubuntu-1204" { +} + diff --git a/hcl2template/types.build.go b/hcl2template/types.build.go index 6614fe91577..d317faa765a 100644 --- a/hcl2template/types.build.go +++ b/hcl2template/types.build.go @@ -8,6 +8,7 @@ import ( "github.com/hashicorp/hcl/v2/hclsyntax" packerregistry "github.com/hashicorp/packer/internal/registry" "github.com/hashicorp/packer/internal/registry/env" + "github.com/zclconf/go-cty/cty" ) const ( @@ -105,6 +106,12 @@ func (p *Parser) decodeBuildConfig(block *hcl.Block, cfg *PackerConfig) (*BuildB build.Name = b.Name build.Description = b.Description + // Expose build.name during parsing of pps and provisioners + ectx := cfg.EvalContext(BuildContext, nil) + ectx.Variables[buildAccessor] = cty.ObjectVal(map[string]cty.Value{ + "name": cty.StringVal(b.Name), + }) + for _, buildFrom := range b.FromSources { ref := sourceRefFromString(buildFrom) @@ -158,7 +165,7 @@ func (p *Parser) decodeBuildConfig(block *hcl.Block, cfg *PackerConfig) (*BuildB } build.Sources = append(build.Sources, ref) case buildProvisionerLabel: - p, moreDiags := p.decodeProvisioner(block, cfg) + p, moreDiags := p.decodeProvisioner(block, ectx) diags = append(diags, moreDiags...) if moreDiags.HasErrors() { continue @@ -173,14 +180,14 @@ func (p *Parser) decodeBuildConfig(block *hcl.Block, cfg *PackerConfig) (*BuildB }) continue } - p, moreDiags := p.decodeProvisioner(block, cfg) + p, moreDiags := p.decodeProvisioner(block, ectx) diags = append(diags, moreDiags...) if moreDiags.HasErrors() { continue } build.ErrorCleanupProvisionerBlock = p case buildPostProcessorLabel: - pp, moreDiags := p.decodePostProcessor(block, cfg) + pp, moreDiags := p.decodePostProcessor(block, ectx) diags = append(diags, moreDiags...) if moreDiags.HasErrors() { continue @@ -197,7 +204,7 @@ func (p *Parser) decodeBuildConfig(block *hcl.Block, cfg *PackerConfig) (*BuildB errored := false postProcessors := []*PostProcessorBlock{} for _, block := range content.Blocks { - pp, moreDiags := p.decodePostProcessor(block, cfg) + pp, moreDiags := p.decodePostProcessor(block, ectx) diags = append(diags, moreDiags...) if moreDiags.HasErrors() { errored = true diff --git a/hcl2template/types.build.post-processor.go b/hcl2template/types.build.post-processor.go index bbf64a01ac4..da2f6a6a6da 100644 --- a/hcl2template/types.build.post-processor.go +++ b/hcl2template/types.build.post-processor.go @@ -23,7 +23,7 @@ func (p *PostProcessorBlock) String() string { return fmt.Sprintf(buildPostProcessorLabel+"-block %q %q", p.PType, p.PName) } -func (p *Parser) decodePostProcessor(block *hcl.Block, cfg *PackerConfig) (*PostProcessorBlock, hcl.Diagnostics) { +func (p *Parser) decodePostProcessor(block *hcl.Block, ectx *hcl.EvalContext) (*PostProcessorBlock, hcl.Diagnostics) { var b struct { Name string `hcl:"name,optional"` Only []string `hcl:"only,optional"` @@ -31,7 +31,8 @@ func (p *Parser) decodePostProcessor(block *hcl.Block, cfg *PackerConfig) (*Post KeepInputArtifact *bool `hcl:"keep_input_artifact,optional"` Rest hcl.Body `hcl:",remain"` } - diags := gohcl.DecodeBody(block.Body, cfg.EvalContext(BuildContext, nil), &b) + + diags := gohcl.DecodeBody(block.Body, ectx, &b) if diags.HasErrors() { return nil, diags } diff --git a/hcl2template/types.build.provisioners.go b/hcl2template/types.build.provisioners.go index 1bb5ed2a408..bce8a9d50c1 100644 --- a/hcl2template/types.build.provisioners.go +++ b/hcl2template/types.build.provisioners.go @@ -74,7 +74,7 @@ func (p *ProvisionerBlock) String() string { return fmt.Sprintf(buildProvisionerLabel+"-block %q %q", p.PType, p.PName) } -func (p *Parser) decodeProvisioner(block *hcl.Block, cfg *PackerConfig) (*ProvisionerBlock, hcl.Diagnostics) { +func (p *Parser) decodeProvisioner(block *hcl.Block, ectx *hcl.EvalContext) (*ProvisionerBlock, hcl.Diagnostics) { var b struct { Name string `hcl:"name,optional"` PauseBefore string `hcl:"pause_before,optional"` @@ -85,7 +85,7 @@ func (p *Parser) decodeProvisioner(block *hcl.Block, cfg *PackerConfig) (*Provis Override cty.Value `hcl:"override,optional"` Rest hcl.Body `hcl:",remain"` } - diags := gohcl.DecodeBody(block.Body, cfg.EvalContext(BuildContext, nil), &b) + diags := gohcl.DecodeBody(block.Body, ectx, &b) if diags.HasErrors() { return nil, diags } diff --git a/hcl2template/types.build_test.go b/hcl2template/types.build_test.go index 09271ed3dbe..b5123a03967 100644 --- a/hcl2template/types.build_test.go +++ b/hcl2template/types.build_test.go @@ -534,6 +534,120 @@ func TestParse_build(t *testing.T) { []packersdk.Build{}, false, }, + {"use build.name in post-processor block", + defaultParser, + parseTestArgs{"testdata/build/post-processor_build_name_interpolation.pkr.hcl", nil, nil}, + &PackerConfig{ + CorePackerVersionString: lockedVersion, + Basedir: filepath.Join("testdata", "build"), + Sources: map[SourceRef]SourceBlock{ + refVBIsoUbuntu1204: {Type: "virtualbox-iso", Name: "ubuntu-1204"}, + }, + Builds: Builds{ + &BuildBlock{ + Name: "test-build", + Sources: []SourceUseBlock{ + { + SourceRef: refVBIsoUbuntu1204, + }, + }, + PostProcessorsLists: [][]*PostProcessorBlock{ + { + { + PName: "test-build", + PType: "manifest", + }, + }, + }, + }, + }, + }, + false, false, + []packersdk.Build{ + &packer.CoreBuild{ + BuildName: "test-build", + Type: "virtualbox-iso.ubuntu-1204", + Prepared: true, + Builder: emptyMockBuilder, + Provisioners: []packer.CoreBuildProvisioner{}, + PostProcessors: [][]packer.CoreBuildPostProcessor{ + { + { + PName: "test-build", + PType: "manifest", + PostProcessor: &HCL2PostProcessor{ + PostProcessor: &MockPostProcessor{ + Config: MockConfig{ + NestedMockConfig: NestedMockConfig{ + Tags: []MockTag{}, + SliceString: []string{lockedVersion, "test-build"}, + }, + NestedSlice: []NestedMockConfig{}, + }, + }, + }, + }, + }, + }, + }, + }, + false, + }, + {"use build.name in provisioner block", + defaultParser, + parseTestArgs{"testdata/build/provisioner_build_name_interpolation.pkr.hcl", nil, nil}, + &PackerConfig{ + CorePackerVersionString: lockedVersion, + Basedir: filepath.Join("testdata", "build"), + Sources: map[SourceRef]SourceBlock{ + refVBIsoUbuntu1204: {Type: "virtualbox-iso", Name: "ubuntu-1204"}, + }, + Builds: Builds{ + &BuildBlock{ + Name: "build-name-test", + Sources: []SourceUseBlock{ + { + SourceRef: refVBIsoUbuntu1204, + }, + }, + ProvisionerBlocks: []*ProvisionerBlock{ + { + PName: "build-name-test", + PType: "shell", + }, + }, + }, + }, + }, + false, false, + []packersdk.Build{ + &packer.CoreBuild{ + BuildName: "build-name-test", + Type: "virtualbox-iso.ubuntu-1204", + Prepared: true, + Builder: emptyMockBuilder, + Provisioners: []packer.CoreBuildProvisioner{ + { + PName: "build-name-test", + PType: "shell", + Provisioner: &HCL2Provisioner{ + Provisioner: &MockProvisioner{ + Config: MockConfig{ + NestedMockConfig: NestedMockConfig{ + Tags: []MockTag{}, + SliceString: []string{"build-name-test"}, + }, + NestedSlice: []NestedMockConfig{}, + }, + }, + }, + }, + }, + PostProcessors: [][]packer.CoreBuildPostProcessor{}, + }, + }, + false, + }, } testParse(t, tests) }