diff --git a/packer/build.go b/packer/build.go index d116f8684..7e405c546 100644 --- a/packer/build.go +++ b/packer/build.go @@ -126,14 +126,19 @@ func (b *coreBuild) Prepare(userVars map[string]string) (err error) { b.prepareCalled = true // Compile the variables + varErrs := make([]error, 0) variables := make(map[string]string) for k, v := range b.variables { - if !v.Required { - variables[k] = v.Default + variables[k] = v.Default + + if v.Required { + if _, ok := userVars[k]; !ok { + varErrs = append(varErrs, + fmt.Errorf("Required user variable '%s' not set", k)) + } } } - varErrs := make([]error, 0) if userVars != nil { for k, v := range userVars { if _, ok := variables[k]; !ok { @@ -146,18 +151,6 @@ func (b *coreBuild) Prepare(userVars map[string]string) (err error) { } } - // Verify all required variables have been set. - for k, v := range b.variables { - if !v.Required { - continue - } - - if _, ok := variables[k]; !ok { - varErrs = append( - varErrs, fmt.Errorf("Required user variable '%s' not set", k)) - } - } - // If there were any problem with variables, return an error right // away because we can't be certain anything else will actually work. if len(varErrs) > 0 { diff --git a/packer/build_test.go b/packer/build_test.go index ed05e8df7..d88218513 100644 --- a/packer/build_test.go +++ b/packer/build_test.go @@ -175,6 +175,14 @@ func TestBuildPrepare_variablesRequired(t *testing.T) { if err == nil { t.Fatal("should have had error") } + + // Test with setting the value + build = testBuild() + build.variables["foo"] = coreBuildVariable{Required: true} + err = build.Prepare(map[string]string{"foo": ""}) + if err != nil { + t.Fatalf("should not have error: %s", err) + } } func TestBuild_Run(t *testing.T) {