Move to using ectx to preload build names (#11432)

* Add basic post-processor test

Closes #11411
pull/11435/head
Wilken Rivera 5 years ago committed by GitHub
parent 58fa1f96e2
commit 760169b34e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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" {
}

@ -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" {
}

@ -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

@ -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
}

@ -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
}

@ -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)
}

Loading…
Cancel
Save