packer: default user var values needn't be strings [GH-456]

This commit is contained in:
Mitchell Hashimoto 2013-09-24 22:59:44 +02:00
parent 9cb397339a
commit f0d0621855
3 changed files with 28 additions and 11 deletions

View File

@ -1,6 +1,8 @@
## 0.3.9 (unreleased) ## 0.3.9 (unreleased)
BUG FIXES:
* core: default user variable values don't need to be strings. [GH-456]
## 0.3.8 (September 22, 2013) ## 0.3.8 (September 22, 2013)

View File

@ -124,18 +124,24 @@ func ParseTemplate(data []byte) (t *Template, err error) {
// Gather all the variables // Gather all the variables
for k, v := range rawTpl.Variables { for k, v := range rawTpl.Variables {
var variable RawVariable var variable RawVariable
variable.Default = ""
variable.Required = v == nil variable.Required = v == nil
if v != nil { // Create a new mapstructure decoder in order to decode the default
def, ok := v.(string) // value since this is the only value in the regular template that
if !ok { // can be weakly typed.
errors = append(errors, decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
fmt.Errorf("variable '%s': default value must be string or null", k)) Result: &variable.Default,
continue WeaklyTypedInput: true,
} })
if err != nil {
// This should never happen.
panic(err)
}
variable.Default = def err = decoder.Decode(v)
if err != nil {
errors = append(errors,
fmt.Errorf("Error decoding default value for user var '%s': %s", k, err))
} }
t.Variables[k] = variable t.Variables[k] = variable

View File

@ -391,7 +391,8 @@ func TestParseTemplate_Variables(t *testing.T) {
{ {
"variables": { "variables": {
"foo": "bar", "foo": "bar",
"bar": null "bar": null,
"baz": 27
}, },
"builders": [{"type": "something"}] "builders": [{"type": "something"}]
@ -403,7 +404,7 @@ func TestParseTemplate_Variables(t *testing.T) {
t.Fatalf("err: %s", err) t.Fatalf("err: %s", err)
} }
if result.Variables == nil || len(result.Variables) != 2 { if result.Variables == nil || len(result.Variables) != 3 {
t.Fatalf("bad vars: %#v", result.Variables) t.Fatalf("bad vars: %#v", result.Variables)
} }
@ -422,6 +423,14 @@ func TestParseTemplate_Variables(t *testing.T) {
if !result.Variables["bar"].Required { if !result.Variables["bar"].Required {
t.Fatal("bar should be required") t.Fatal("bar should be required")
} }
if result.Variables["baz"].Default != "27" {
t.Fatal("default should be empty")
}
if result.Variables["baz"].Required {
t.Fatal("baz should not be required")
}
} }
func TestParseTemplate_variablesBadDefault(t *testing.T) { func TestParseTemplate_variablesBadDefault(t *testing.T) {