diff --git a/command/build.go b/command/build.go index 9ccf9755b30..8eb9f4496a8 100644 --- a/command/build.go +++ b/command/build.go @@ -125,6 +125,9 @@ func (c *BuildCommand) RunContext(buildCtx context.Context, cla *BuildArgs) int defer hcpRegistry.VersionStatusSummary() err := hcpRegistry.PopulateVersion(buildCtx) + + packerStarter.EnforceProvisioners() + if err != nil { return writeDiags(c.Ui, nil, hcl.Diagnostics{ &hcl.Diagnostic{ diff --git a/hcl2template/parser.go b/hcl2template/parser.go index 1bc5d646732..7f8f414a177 100644 --- a/hcl2template/parser.go +++ b/hcl2template/parser.go @@ -5,6 +5,7 @@ package hcl2template import ( "fmt" + "log" "os" "path/filepath" "reflect" @@ -568,6 +569,25 @@ func (cfg *PackerConfig) Initialize(opts packer.InitializeOptions) hcl.Diagnosti return diags } +func (cfg *PackerConfig) EnforceProvisioners() { + // Fetch enforced provisioners from the HCP Packer registry. + // Parse the raw HCL configuration into ProvisionerBlock objects. + // Append the enforced provisioners to the build's execution plan. + + // for point of POC, i just created a Global variable for a provisioner block thats mentioned in the template + // we reattach the provisioner block to each build block. And as you can see, + //we are able to run "an enforced provisioner" + + if GlobalProvisioner != nil { + log.Printf("SETTING THE GLOBAL PROVISIONER\n") + for _, build := range cfg.Builds { + build.ProvisionerBlocks = append(build.ProvisionerBlocks, GlobalProvisioner) + + } + + } +} + // parseConfig looks in the found blocks for everything that is not a variable // block. func (p *Parser) parseConfig(f *hcl.File, cfg *PackerConfig) hcl.Diagnostics { diff --git a/hcl2template/types.build.go b/hcl2template/types.build.go index 6a3300eeced..3007c7a0af6 100644 --- a/hcl2template/types.build.go +++ b/hcl2template/types.build.go @@ -180,6 +180,7 @@ func (p *Parser) decodeBuildConfig(block *hcl.Block, cfg *PackerConfig) (*BuildB } build.Sources = append(build.Sources, ref) case buildProvisionerLabel: + p, moreDiags := p.decodeProvisioner(block, ectx) diags = append(diags, moreDiags...) if moreDiags.HasErrors() { diff --git a/hcl2template/types.build.provisioners.go b/hcl2template/types.build.provisioners.go index af846807c70..cc390a616b2 100644 --- a/hcl2template/types.build.provisioners.go +++ b/hcl2template/types.build.provisioners.go @@ -5,6 +5,7 @@ package hcl2template import ( "fmt" + "log" "strconv" "time" @@ -15,6 +16,8 @@ import ( "github.com/zclconf/go-cty/cty" ) +var GlobalProvisioner *ProvisionerBlock + // OnlyExcept is a struct that is meant to be embedded that contains the // logic required for "only" and "except" meta-parameters. type OnlyExcept struct { @@ -163,6 +166,8 @@ func (p *Parser) decodeProvisioner(block *hcl.Block, ectx *hcl.EvalContext) (*Pr provisioner.Timeout = timeout } + log.Printf("STORING PROVISIONER IN GLOBAL VARIABE") + GlobalProvisioner = provisioner return provisioner, diags } diff --git a/packer/core.go b/packer/core.go index 8be8e61b2bf..30a505ac951 100644 --- a/packer/core.go +++ b/packer/core.go @@ -162,6 +162,9 @@ func (c *Core) Initialize(_ InitializeOptions) hcl.Diagnostics { } return nil } +func (c *Core) EnforceProvisioners() { + log.Printf("******* INSIDE ENFORCE PROVISIONERS FROM CORE.. ********\n") +} func (core *Core) initialize() error { if err := core.validate(); err != nil { diff --git a/packer/run_interfaces.go b/packer/run_interfaces.go index c956f491859..57f9028f9a1 100644 --- a/packer/run_interfaces.go +++ b/packer/run_interfaces.go @@ -68,6 +68,7 @@ type Handler interface { ConfigFixer ConfigInspector PluginBinaryDetector + EnforceProvisioners() } //go:generate enumer -type FixConfigMode