From 2df21496b36799b2dbcb96862acd50351030fc92 Mon Sep 17 00:00:00 2001 From: Adrien Delorme Date: Wed, 29 Apr 2020 16:15:42 +0200 Subject: [PATCH] hcl2template: let PackerConfig actually start a builder/provisioner/post-processor --- hcl2template/common_test.go | 3 ++- hcl2template/parser.go | 5 ++++- hcl2template/types.build.post-processor.go | 4 ++-- hcl2template/types.build.provisioners.go | 4 ++-- hcl2template/types.packer_config.go | 24 ++++++++++++++-------- hcl2template/types.source.go | 4 ++-- 6 files changed, 27 insertions(+), 17 deletions(-) diff --git a/hcl2template/common_test.go b/hcl2template/common_test.go index 752055fc4..d0a88a6ee 100644 --- a/hcl2template/common_test.go +++ b/hcl2template/common_test.go @@ -68,6 +68,7 @@ func testParse(t *testing.T, tests []parseTest) { } if diff := cmp.Diff(tt.parseWantCfg, gotCfg, cmpopts.IgnoreUnexported( + PackerConfig{}, cty.Value{}, cty.Type{}, Variable{}, @@ -115,7 +116,7 @@ func testParse(t *testing.T, tests []parseTest) { return } - gotBuilds, gotDiags := tt.parser.getBuilds(gotCfg, nil, nil) + gotBuilds, gotDiags := gotCfg.getBuilds(nil, nil) if tt.getBuildsWantDiags == (gotDiags == nil) { t.Fatalf("Parser.getBuilds() unexpected diagnostics. %s", gotDiags) } diff --git a/hcl2template/parser.go b/hcl2template/parser.go index d27ee74a0..f621f32dc 100644 --- a/hcl2template/parser.go +++ b/hcl2template/parser.go @@ -89,7 +89,10 @@ func (p *Parser) parse(filename string, varFiles []string, argVars map[string]st basedir = filepath.Dir(basedir) } cfg := &PackerConfig{ - Basedir: basedir, + Basedir: basedir, + builderSchemas: p.BuilderSchemas, + provisionersSchemas: p.ProvisionersSchemas, + postProcessorsSchemas: p.PostProcessorsSchemas, } // Decode variable blocks so that they are available later on. Here locals diff --git a/hcl2template/types.build.post-processor.go b/hcl2template/types.build.post-processor.go index 5c0c7004d..8add11514 100644 --- a/hcl2template/types.build.post-processor.go +++ b/hcl2template/types.build.post-processor.go @@ -49,11 +49,11 @@ func (p *Parser) decodePostProcessor(block *hcl.Block) (*PostProcessorBlock, hcl return postProcessor, diags } -func (p *Parser) startPostProcessor(source *SourceBlock, pp *PostProcessorBlock, ectx *hcl.EvalContext, generatedVars map[string]string) (packer.PostProcessor, hcl.Diagnostics) { +func (cfg *PackerConfig) startPostProcessor(source *SourceBlock, pp *PostProcessorBlock, ectx *hcl.EvalContext, generatedVars map[string]string) (packer.PostProcessor, hcl.Diagnostics) { // ProvisionerBlock represents a detected but unparsed provisioner var diags hcl.Diagnostics - postProcessor, err := p.PostProcessorsSchemas.Start(pp.PType) + postProcessor, err := cfg.postProcessorsSchemas.Start(pp.PType) if err != nil { diags = append(diags, &hcl.Diagnostic{ Summary: fmt.Sprintf("Failed loading %s", pp.PType), diff --git a/hcl2template/types.build.provisioners.go b/hcl2template/types.build.provisioners.go index 706f154a0..df10d77dc 100644 --- a/hcl2template/types.build.provisioners.go +++ b/hcl2template/types.build.provisioners.go @@ -77,10 +77,10 @@ func (p *Parser) decodeProvisioner(block *hcl.Block) (*ProvisionerBlock, hcl.Dia return provisioner, diags } -func (p *Parser) startProvisioner(source *SourceBlock, pb *ProvisionerBlock, ectx *hcl.EvalContext, generatedVars map[string]string) (packer.Provisioner, hcl.Diagnostics) { +func (cfg *PackerConfig) startProvisioner(source *SourceBlock, pb *ProvisionerBlock, ectx *hcl.EvalContext, generatedVars map[string]string) (packer.Provisioner, hcl.Diagnostics) { var diags hcl.Diagnostics - provisioner, err := p.ProvisionersSchemas.Start(pb.PType) + provisioner, err := cfg.provisionersSchemas.Start(pb.PType) if err != nil { diags = append(diags, &hcl.Diagnostic{ Summary: fmt.Sprintf("failed loading %s", pb.PType), diff --git a/hcl2template/types.packer_config.go b/hcl2template/types.packer_config.go index ead2d66b1..940defe92 100644 --- a/hcl2template/types.packer_config.go +++ b/hcl2template/types.packer_config.go @@ -31,6 +31,12 @@ type PackerConfig struct { // Builds is the list of Build blocks defined in the config files. Builds Builds + + builderSchemas packer.BuilderStore + + provisionersSchemas packer.ProvisionerStore + + postProcessorsSchemas packer.PostProcessorStore } type ValidationOptions struct { @@ -188,11 +194,11 @@ func (c *PackerConfig) evaluateLocalVariable(local *Local) hcl.Diagnostics { // getCoreBuildProvisioners takes a list of provisioner block, starts according // provisioners and sends parsed HCL2 over to it. -func (p *Parser) getCoreBuildProvisioners(source *SourceBlock, blocks []*ProvisionerBlock, ectx *hcl.EvalContext, generatedVars map[string]string) ([]packer.CoreBuildProvisioner, hcl.Diagnostics) { +func (cfg *PackerConfig) getCoreBuildProvisioners(source *SourceBlock, blocks []*ProvisionerBlock, ectx *hcl.EvalContext, generatedVars map[string]string) ([]packer.CoreBuildProvisioner, hcl.Diagnostics) { var diags hcl.Diagnostics res := []packer.CoreBuildProvisioner{} for _, pb := range blocks { - provisioner, moreDiags := p.startProvisioner(source, pb, ectx, generatedVars) + provisioner, moreDiags := cfg.startProvisioner(source, pb, ectx, generatedVars) diags = append(diags, moreDiags...) if moreDiags.HasErrors() { continue @@ -228,11 +234,11 @@ func (p *Parser) getCoreBuildProvisioners(source *SourceBlock, blocks []*Provisi // getCoreBuildProvisioners takes a list of post processor block, starts // according provisioners and sends parsed HCL2 over to it. -func (p *Parser) getCoreBuildPostProcessors(source *SourceBlock, blocks []*PostProcessorBlock, ectx *hcl.EvalContext, generatedVars map[string]string) ([]packer.CoreBuildPostProcessor, hcl.Diagnostics) { +func (cfg *PackerConfig) getCoreBuildPostProcessors(source *SourceBlock, blocks []*PostProcessorBlock, ectx *hcl.EvalContext, generatedVars map[string]string) ([]packer.CoreBuildPostProcessor, hcl.Diagnostics) { var diags hcl.Diagnostics res := []packer.CoreBuildPostProcessor{} for _, ppb := range blocks { - postProcessor, moreDiags := p.startPostProcessor(source, ppb, ectx, generatedVars) + postProcessor, moreDiags := cfg.startPostProcessor(source, ppb, ectx, generatedVars) diags = append(diags, moreDiags...) if moreDiags.HasErrors() { continue @@ -250,7 +256,7 @@ func (p *Parser) getCoreBuildPostProcessors(source *SourceBlock, blocks []*PostP // getBuilds will return a list of packer Build based on the HCL2 parsed build // blocks. All Builders, Provisioners and Post Processors will be started and // configured. -func (p *Parser) getBuilds(cfg *PackerConfig, onlyGlobs []glob.Glob, exceptGlobs []glob.Glob) ([]packer.Build, hcl.Diagnostics) { +func (cfg *PackerConfig) getBuilds(onlyGlobs []glob.Glob, exceptGlobs []glob.Glob) ([]packer.Build, hcl.Diagnostics) { res := []packer.Build{} var diags hcl.Diagnostics @@ -297,7 +303,7 @@ func (p *Parser) getBuilds(cfg *PackerConfig, onlyGlobs []glob.Glob, exceptGlobs } } - builder, moreDiags, generatedVars := p.startBuilder(src, cfg.EvalContext(nil)) + builder, moreDiags, generatedVars := cfg.startBuilder(src, cfg.EvalContext(nil)) diags = append(diags, moreDiags...) if moreDiags.HasErrors() { continue @@ -323,12 +329,12 @@ func (p *Parser) getBuilds(cfg *PackerConfig, onlyGlobs []glob.Glob, exceptGlobs } } - provisioners, moreDiags := p.getCoreBuildProvisioners(src, build.ProvisionerBlocks, cfg.EvalContext(variables), generatedPlaceholderMap) + provisioners, moreDiags := cfg.getCoreBuildProvisioners(src, build.ProvisionerBlocks, cfg.EvalContext(variables), generatedPlaceholderMap) diags = append(diags, moreDiags...) if moreDiags.HasErrors() { continue } - postProcessors, moreDiags := p.getCoreBuildPostProcessors(src, build.PostProcessors, cfg.EvalContext(variables), generatedPlaceholderMap) + postProcessors, moreDiags := cfg.getCoreBuildPostProcessors(src, build.PostProcessors, cfg.EvalContext(variables), generatedPlaceholderMap) pps := [][]packer.CoreBuildPostProcessor{} if len(postProcessors) > 0 { pps = [][]packer.CoreBuildPostProcessor{postProcessors} @@ -404,6 +410,6 @@ func (p *Parser) Parse(path string, varFiles []string, argVars map[string]string return nil, diags } - builds, moreDiags := p.getBuilds(cfg, onlyGlobs, exceptGlobs) + builds, moreDiags := cfg.getBuilds(onlyGlobs, exceptGlobs) return builds, append(diags, moreDiags...) } diff --git a/hcl2template/types.source.go b/hcl2template/types.source.go index f81dd768b..c44fb2687 100644 --- a/hcl2template/types.source.go +++ b/hcl2template/types.source.go @@ -38,10 +38,10 @@ func (p *Parser) decodeSource(block *hcl.Block) (*SourceBlock, hcl.Diagnostics) return source, diags } -func (p *Parser) startBuilder(source *SourceBlock, ectx *hcl.EvalContext) (packer.Builder, hcl.Diagnostics, []string) { +func (cfg *PackerConfig) startBuilder(source *SourceBlock, ectx *hcl.EvalContext) (packer.Builder, hcl.Diagnostics, []string) { var diags hcl.Diagnostics - builder, err := p.BuilderSchemas.Start(source.Type) + builder, err := cfg.builderSchemas.Start(source.Type) if err != nil { diags = append(diags, &hcl.Diagnostic{ Summary: "Failed to load " + sourceLabel + " type",