POC for enforced provisioner.

karthik/enforced_provisioners_poc
karthik P 7 months ago
parent 0a7c8c1078
commit f990d4c5fe

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

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

@ -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() {

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

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

@ -68,6 +68,7 @@ type Handler interface {
ConfigFixer
ConfigInspector
PluginBinaryDetector
EnforceProvisioners()
}
//go:generate enumer -type FixConfigMode

Loading…
Cancel
Save