give correct error when variable is unset

This commit is contained in:
Adrien Delorme 2020-02-17 17:15:52 +01:00
parent 79867ca26e
commit cebfb1c735
5 changed files with 26 additions and 14 deletions

View File

@ -101,6 +101,11 @@ func (p *Parser) parse(filename string, vars map[string]string) (*PackerConfig,
}
}
_, moreDiags := cfg.InputVariables.Values()
diags = append(diags, moreDiags...)
_, moreDiags = cfg.LocalVariables.Values()
diags = append(diags, moreDiags...)
// parse var files
{
hclVarFiles, jsonVarFiles, moreDiags := GetHCL2Files(filename, hcl2VarFileExt, hcl2VarJsonFileExt)

View File

@ -60,6 +60,9 @@ func (p *Parser) decodeBuildConfig(block *hcl.Block) (*BuildBlock, hcl.Diagnosti
Config hcl.Body `hcl:",remain"`
}
diags := gohcl.DecodeBody(block.Body, nil, &b)
if diags.HasErrors() {
return nil, diags
}
for _, buildFrom := range b.FromSources {
ref := sourceRefFromString(buildFrom)
@ -84,6 +87,9 @@ func (p *Parser) decodeBuildConfig(block *hcl.Block) (*BuildBlock, hcl.Diagnosti
content, moreDiags := b.Config.Content(buildSchema)
diags = append(diags, moreDiags...)
if diags.HasErrors() {
return nil, diags
}
for _, block := range content.Blocks {
switch block.Type {
case buildProvisionerLabel:

View File

@ -30,11 +30,13 @@ type PackerConfig struct {
// decoder in order to tell what is the actual value of a var or a local and
// the list of defined functions.
func (cfg *PackerConfig) EvalContext() *hcl.EvalContext {
v, _ := cfg.InputVariables.Values()
l, _ := cfg.LocalVariables.Values()
ectx := &hcl.EvalContext{
Functions: Functions(cfg.Basedir),
Variables: map[string]cty.Value{
"var": cty.ObjectVal(cfg.InputVariables.Values()),
"local": cty.ObjectVal(cfg.LocalVariables.Values()),
"var": cty.ObjectVal(v),
"local": cty.ObjectVal(l),
},
}
return ectx

View File

@ -56,10 +56,11 @@ func (v *Variable) Value() (cty.Value, *hcl.Diagnostic) {
return value, nil
}
}
return cty.NilVal, &hcl.Diagnostic{
return cty.UnknownVal(v.Type), &hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Unset variable",
Detail: "A used variable must be set; see " +
Detail: "A used variable must be set or have a default value; see " +
"https://packer.io/docs/configuration/from-1.5/syntax.html for details.",
Context: v.block.DefRange.Ptr(),
}
@ -67,12 +68,15 @@ func (v *Variable) Value() (cty.Value, *hcl.Diagnostic) {
type Variables map[string]*Variable
func (variables Variables) Values() map[string]cty.Value {
func (variables Variables) Values() (map[string]cty.Value, hcl.Diagnostics) {
res := map[string]cty.Value{}
var diags hcl.Diagnostics
for k, v := range variables {
res[k], _ = v.Value()
var diag *hcl.Diagnostic
res[k], diag = v.Value()
diags = append(diags, diag)
}
return res
return res, diags
}
// decodeConfig decodes a "variables" section the way packer 1 used to

View File

@ -10,7 +10,6 @@ import (
"github.com/zclconf/go-cty/cty/convert"
"github.com/hashicorp/hcl/v2"
"github.com/hashicorp/packer/builder/null"
"github.com/hashicorp/packer/packer"
)
@ -119,12 +118,8 @@ func TestParse_variables(t *testing.T) {
},
},
false, false,
[]packer.Build{
&packer.CoreBuild{
Builder: &null.Builder{},
},
},
false,
[]packer.Build{},
true,
},
}
testParse(t, tests)