helper/schema: When having a StateFunc, make sure NewExtra contains
original
This commit is contained in:
parent
ba68be5672
commit
50026a6d5c
|
@ -201,10 +201,6 @@ func (d *ResourceData) diffChange(k string) (interface{}, interface{}, bool) {
|
||||||
n.Value = nil
|
n.Value = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if n.Exists && n.Schema.StateFunc != nil {
|
|
||||||
n.Value = n.Schema.StateFunc(n.Value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the old, new, and whether there is a change
|
// Return the old, new, and whether there is a change
|
||||||
return o.Value, n.Value, !reflect.DeepEqual(o.Value, n.Value)
|
return o.Value, n.Value, !reflect.DeepEqual(o.Value, n.Value)
|
||||||
}
|
}
|
||||||
|
@ -512,6 +508,13 @@ func (d *ResourceData) getPrimitive(
|
||||||
attrD, ok := d.diff.Attributes[k]
|
attrD, ok := d.diff.Attributes[k]
|
||||||
if ok && !attrD.NewComputed {
|
if ok && !attrD.NewComputed {
|
||||||
result = attrD.New
|
result = attrD.New
|
||||||
|
if attrD.NewExtra != nil {
|
||||||
|
err := mapstructure.WeakDecode(attrD.NewExtra, &result)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
resultSet = true
|
resultSet = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,6 +68,32 @@ func TestResourceDataGet(t *testing.T) {
|
||||||
Value: "foo",
|
Value: "foo",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
Schema: map[string]*Schema{
|
||||||
|
"availability_zone": &Schema{
|
||||||
|
Type: TypeString,
|
||||||
|
Optional: true,
|
||||||
|
Computed: true,
|
||||||
|
ForceNew: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
State: nil,
|
||||||
|
|
||||||
|
Diff: &terraform.ResourceDiff{
|
||||||
|
Attributes: map[string]*terraform.ResourceAttrDiff{
|
||||||
|
"availability_zone": &terraform.ResourceAttrDiff{
|
||||||
|
Old: "",
|
||||||
|
New: "foo!",
|
||||||
|
NewExtra: "foo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
Key: "availability_zone",
|
||||||
|
Value: "foo",
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
Schema: map[string]*Schema{
|
Schema: map[string]*Schema{
|
||||||
"availability_zone": &Schema{
|
"availability_zone": &Schema{
|
||||||
|
|
|
@ -386,8 +386,13 @@ func (m schemaMap) diffString(
|
||||||
schema *Schema,
|
schema *Schema,
|
||||||
diff *terraform.ResourceDiff,
|
diff *terraform.ResourceDiff,
|
||||||
d *ResourceData) error {
|
d *ResourceData) error {
|
||||||
|
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 {
|
||||||
|
originalN = n
|
||||||
|
n = schema.StateFunc(n)
|
||||||
|
}
|
||||||
if err := mapstructure.WeakDecode(o, &os); err != nil {
|
if err := mapstructure.WeakDecode(o, &os); err != nil {
|
||||||
return fmt.Errorf("%s: %s", k, err)
|
return fmt.Errorf("%s: %s", k, err)
|
||||||
}
|
}
|
||||||
|
@ -411,6 +416,7 @@ func (m schemaMap) diffString(
|
||||||
diff.Attributes[k] = schema.finalizeDiff(&terraform.ResourceAttrDiff{
|
diff.Attributes[k] = schema.finalizeDiff(&terraform.ResourceAttrDiff{
|
||||||
Old: os,
|
Old: os,
|
||||||
New: ns,
|
New: ns,
|
||||||
|
NewExtra: originalN,
|
||||||
NewRemoved: removed,
|
NewRemoved: removed,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -98,8 +98,9 @@ func TestSchemaMap_Diff(t *testing.T) {
|
||||||
Diff: &terraform.ResourceDiff{
|
Diff: &terraform.ResourceDiff{
|
||||||
Attributes: map[string]*terraform.ResourceAttrDiff{
|
Attributes: map[string]*terraform.ResourceAttrDiff{
|
||||||
"availability_zone": &terraform.ResourceAttrDiff{
|
"availability_zone": &terraform.ResourceAttrDiff{
|
||||||
Old: "",
|
Old: "",
|
||||||
New: "foo!",
|
New: "foo!",
|
||||||
|
NewExtra: "foo",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue