helper/schema: skip StateFunc when value is nil

This takes the nil checking burden off of StateFunc.

fixes #3586, see that issue for further discussion
This commit is contained in:
Paul Hinze 2015-11-20 14:02:20 -06:00
parent 5ec446718a
commit c7dc1c10a3
2 changed files with 32 additions and 2 deletions

View File

@ -919,7 +919,7 @@ func (m schemaMap) diffString(
var originalN interface{} var originalN interface{}
var os, ns string var os, ns string
o, n, _, _ := d.diffChange(k) o, n, _, _ := d.diffChange(k)
if schema.StateFunc != nil { if schema.StateFunc != nil && n != nil {
originalN = n originalN = n
n = schema.StateFunc(n) n = schema.StateFunc(n)
} }

View File

@ -321,7 +321,7 @@ func TestSchemaMap_Diff(t *testing.T) {
Err: false, Err: false,
}, },
"#7 String with StateFunc": { "String with StateFunc": {
Schema: map[string]*Schema{ Schema: map[string]*Schema{
"availability_zone": &Schema{ "availability_zone": &Schema{
Type: TypeString, Type: TypeString,
@ -352,6 +352,36 @@ func TestSchemaMap_Diff(t *testing.T) {
Err: false, Err: false,
}, },
"StateFunc not called with nil value": {
Schema: map[string]*Schema{
"availability_zone": &Schema{
Type: TypeString,
Optional: true,
Computed: true,
StateFunc: func(a interface{}) string {
t.Fatalf("should not get here!")
return ""
},
},
},
State: nil,
Config: map[string]interface{}{},
Diff: &terraform.InstanceDiff{
Attributes: map[string]*terraform.ResourceAttrDiff{
"availability_zone": &terraform.ResourceAttrDiff{
Old: "",
New: "",
NewComputed: true,
},
},
},
Err: false,
},
"#8 Variable (just checking)": { "#8 Variable (just checking)": {
Schema: map[string]*Schema{ Schema: map[string]*Schema{
"availability_zone": &Schema{ "availability_zone": &Schema{