diff --git a/helper/schema/resource_diff_test.go b/helper/schema/resource_diff_test.go index 52c02a6abe..aa3a4e7df0 100644 --- a/helper/schema/resource_diff_test.go +++ b/helper/schema/resource_diff_test.go @@ -599,6 +599,37 @@ func testDiffCases(t *testing.T, oldPrefix string, oldOffset int, computed bool) }, }, }, + resourceDiffTestCase{ + Name: "NewComputed should always propagate", + Schema: map[string]*Schema{ + "foo": &Schema{ + Type: TypeString, + Computed: true, + }, + }, + State: &terraform.InstanceState{ + Attributes: map[string]string{ + "foo": "", + }, + ID: "pre-existing", + }, + Config: testConfig(t, map[string]interface{}{}), + Diff: &terraform.InstanceDiff{Attributes: map[string]*terraform.ResourceAttrDiff{}}, + Key: "foo", + NewValue: "", + Expected: &terraform.InstanceDiff{ + Attributes: func() map[string]*terraform.ResourceAttrDiff { + if computed { + return map[string]*terraform.ResourceAttrDiff{ + "foo": &terraform.ResourceAttrDiff{ + NewComputed: computed, + }, + } + } + return map[string]*terraform.ResourceAttrDiff{} + }(), + }, + }, } } diff --git a/helper/schema/schema.go b/helper/schema/schema.go index 286762bb16..de05df66f9 100644 --- a/helper/schema/schema.go +++ b/helper/schema/schema.go @@ -1185,7 +1185,7 @@ func (m schemaMap) diffString( return fmt.Errorf("%s: %s", k, err) } - if os == ns && !all { + if os == ns && !all && !computed { // They're the same value. If there old value is not blank or we // have an ID, then return right away since we're already setup. if os != "" || d.Id() != "" { @@ -1193,7 +1193,7 @@ func (m schemaMap) diffString( } // Otherwise, only continue if we're computed - if !schema.Computed && !computed { + if !schema.Computed { return nil } } diff --git a/helper/schema/schema_test.go b/helper/schema/schema_test.go index 9c505255c2..a82f8b2d5e 100644 --- a/helper/schema/schema_test.go +++ b/helper/schema/schema_test.go @@ -3126,6 +3126,40 @@ func TestSchemaMap_Diff(t *testing.T) { Err: false, }, + { + Name: "NewComputed should always propagate with CustomizeDiff", + Schema: map[string]*Schema{ + "foo": &Schema{ + Type: TypeString, + Computed: true, + }, + }, + + State: &terraform.InstanceState{ + Attributes: map[string]string{ + "foo": "", + }, + ID: "pre-existing", + }, + + Config: map[string]interface{}{}, + + CustomizeDiff: func(d *ResourceDiff, meta interface{}) error { + d.SetNewComputed("foo") + return nil + }, + + Diff: &terraform.InstanceDiff{ + Attributes: map[string]*terraform.ResourceAttrDiff{ + "foo": &terraform.ResourceAttrDiff{ + NewComputed: true, + }, + }, + }, + + Err: false, + }, + { Name: "vetoing a diff", Schema: map[string]*Schema{