108 lines
2.7 KiB
Go
108 lines
2.7 KiB
Go
package hcl2template
|
|
|
|
import (
|
|
"github.com/hashicorp/hcl/v2"
|
|
"github.com/hashicorp/packer/packer"
|
|
)
|
|
|
|
// PackerConfig represents a loaded packer config
|
|
type PackerConfig struct {
|
|
Sources map[SourceRef]*Source
|
|
|
|
Variables PackerV1Variables
|
|
|
|
Builds Builds
|
|
}
|
|
|
|
func (p *Parser) CoreBuildProvisioners(blocks []*ProvisionerBlock, generatedVars []string) ([]packer.CoreBuildProvisioner, hcl.Diagnostics) {
|
|
var diags hcl.Diagnostics
|
|
res := []packer.CoreBuildProvisioner{}
|
|
for _, pb := range blocks {
|
|
provisioner, moreDiags := p.StartProvisioner(pb, generatedVars)
|
|
diags = append(diags, moreDiags...)
|
|
if moreDiags.HasErrors() {
|
|
continue
|
|
}
|
|
res = append(res, packer.CoreBuildProvisioner{
|
|
PType: pb.PType,
|
|
Provisioner: provisioner,
|
|
})
|
|
}
|
|
return res, diags
|
|
}
|
|
|
|
func (p *Parser) CoreBuildPostProcessors(blocks []*PostProcessorBlock) ([]packer.CoreBuildPostProcessor, hcl.Diagnostics) {
|
|
var diags hcl.Diagnostics
|
|
res := []packer.CoreBuildPostProcessor{}
|
|
for _, pp := range blocks {
|
|
postProcessor, moreDiags := p.StartPostProcessor(pp)
|
|
diags = append(diags, moreDiags...)
|
|
if moreDiags.HasErrors() {
|
|
continue
|
|
}
|
|
res = append(res, packer.CoreBuildPostProcessor{
|
|
PostProcessor: postProcessor,
|
|
PType: pp.PType,
|
|
})
|
|
}
|
|
|
|
return res, diags
|
|
}
|
|
|
|
func (p *Parser) getBuilds(cfg *PackerConfig) ([]packer.Build, hcl.Diagnostics) {
|
|
res := []packer.Build{}
|
|
var diags hcl.Diagnostics
|
|
|
|
for _, build := range cfg.Builds {
|
|
for _, from := range build.Froms {
|
|
src, found := cfg.Sources[from]
|
|
if !found {
|
|
diags = append(diags, &hcl.Diagnostic{
|
|
Summary: "Unknown " + sourceLabel + " " + from.String(),
|
|
Subject: build.HCL2Ref.DeclRange.Ptr(),
|
|
Severity: hcl.DiagError,
|
|
})
|
|
continue
|
|
}
|
|
builder, moreDiags, generatedVars := p.StartBuilder(src)
|
|
diags = append(diags, moreDiags...)
|
|
if moreDiags.HasErrors() {
|
|
continue
|
|
}
|
|
provisioners, moreDiags := p.CoreBuildProvisioners(build.ProvisionerBlocks, generatedVars)
|
|
diags = append(diags, moreDiags...)
|
|
if moreDiags.HasErrors() {
|
|
continue
|
|
}
|
|
postProcessors, moreDiags := p.CoreBuildPostProcessors(build.PostProcessors)
|
|
pps := [][]packer.CoreBuildPostProcessor{}
|
|
if len(postProcessors) > 0 {
|
|
pps = [][]packer.CoreBuildPostProcessor{postProcessors}
|
|
}
|
|
diags = append(diags, moreDiags...)
|
|
if moreDiags.HasErrors() {
|
|
continue
|
|
}
|
|
|
|
pcb := &packer.CoreBuild{
|
|
Type: src.Type,
|
|
Builder: builder,
|
|
Provisioners: provisioners,
|
|
PostProcessors: pps,
|
|
Variables: cfg.Variables,
|
|
}
|
|
res = append(res, pcb)
|
|
}
|
|
}
|
|
return res, diags
|
|
}
|
|
|
|
func (p *Parser) Parse(path string) ([]packer.Build, hcl.Diagnostics) {
|
|
cfg, diags := p.parse(path)
|
|
if diags.HasErrors() {
|
|
return nil, diags
|
|
}
|
|
|
|
return p.getBuilds(cfg)
|
|
}
|