From f990d4c5feb22c44c5791aa0774e176ce61026ae Mon Sep 17 00:00:00 2001 From: karthik P Date: Thu, 16 Oct 2025 17:40:28 +0530 Subject: [PATCH 1/3] POC for enforced provisioner. --- command/build.go | 3 +++ hcl2template/parser.go | 20 +++++++++++++++++ hcl2template/types.build.go | 1 + hcl2template/types.build.provisioners.go | 28 +++++++++++++++++++++++- packer/core.go | 3 +++ packer/run_interfaces.go | 1 + 6 files changed, 55 insertions(+), 1 deletion(-) 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..7d75a4d1e73 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() { + // make call to HCP Packer registry to fetch enforced provisioners + // we need to convert the fetched provisioners to ProvisionerBlock + // and append them to each build's provisioner blocks + + // 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..3e6f5c5e6b9 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 { @@ -162,7 +165,30 @@ func (p *Parser) decodeProvisioner(block *hcl.Block, ectx *hcl.EvalContext) (*Pr } provisioner.Timeout = timeout } - + log.Printf("Decoded provisioner details:\n"+ + "Type: %s\n"+ + "Name: %s\n"+ + "MaxRetries: %d\n"+ + "OnlyExcept: {Only: %v, Except: %v}\n"+ + "HCL2Ref: {DefRange: %v, TypeRange: %v, Labels: %v, LabelsRanges: %v}\n"+ + "Override: %v\n"+ + "PauseBefore: %v\n"+ + "Timeout: %v", + "REST: %+v\n", + provisioner.PType, + provisioner.PName, + provisioner.MaxRetries, + provisioner.OnlyExcept.Only, + provisioner.OnlyExcept.Except, + provisioner.HCL2Ref.DefRange, + provisioner.HCL2Ref.TypeRange, + provisioner.HCL2Ref.LabelsRanges, + provisioner.Override, + provisioner.PauseBefore, + provisioner.Timeout, + provisioner.Rest) + 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 From a78d832cd1ff3cc132ea201b5a6ec3103f06f741 Mon Sep 17 00:00:00 2001 From: karthik P Date: Thu, 16 Oct 2025 17:48:58 +0530 Subject: [PATCH 2/3] POC for enforced provisioner. --- hcl2template/types.build.provisioners.go | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/hcl2template/types.build.provisioners.go b/hcl2template/types.build.provisioners.go index 3e6f5c5e6b9..cc390a616b2 100644 --- a/hcl2template/types.build.provisioners.go +++ b/hcl2template/types.build.provisioners.go @@ -165,28 +165,7 @@ func (p *Parser) decodeProvisioner(block *hcl.Block, ectx *hcl.EvalContext) (*Pr } provisioner.Timeout = timeout } - log.Printf("Decoded provisioner details:\n"+ - "Type: %s\n"+ - "Name: %s\n"+ - "MaxRetries: %d\n"+ - "OnlyExcept: {Only: %v, Except: %v}\n"+ - "HCL2Ref: {DefRange: %v, TypeRange: %v, Labels: %v, LabelsRanges: %v}\n"+ - "Override: %v\n"+ - "PauseBefore: %v\n"+ - "Timeout: %v", - "REST: %+v\n", - provisioner.PType, - provisioner.PName, - provisioner.MaxRetries, - provisioner.OnlyExcept.Only, - provisioner.OnlyExcept.Except, - provisioner.HCL2Ref.DefRange, - provisioner.HCL2Ref.TypeRange, - provisioner.HCL2Ref.LabelsRanges, - provisioner.Override, - provisioner.PauseBefore, - provisioner.Timeout, - provisioner.Rest) + log.Printf("STORING PROVISIONER IN GLOBAL VARIABE") GlobalProvisioner = provisioner return provisioner, diags From 62b30f577d9c052dbf0add9cc8d48fb4f29ead0e Mon Sep 17 00:00:00 2001 From: karthik P Date: Thu, 16 Oct 2025 17:50:51 +0530 Subject: [PATCH 3/3] POC for enforced provisioner. --- hcl2template/parser.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hcl2template/parser.go b/hcl2template/parser.go index 7d75a4d1e73..7f8f414a177 100644 --- a/hcl2template/parser.go +++ b/hcl2template/parser.go @@ -570,9 +570,9 @@ func (cfg *PackerConfig) Initialize(opts packer.InitializeOptions) hcl.Diagnosti } func (cfg *PackerConfig) EnforceProvisioners() { - // make call to HCP Packer registry to fetch enforced provisioners - // we need to convert the fetched provisioners to ProvisionerBlock - // and append them to each build's provisioner blocks + // 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,