terraform-plugin-sdk icon indicating copy to clipboard operation
terraform-plugin-sdk copied to clipboard

Fix for TypeSet applying with unexpected empty element

Open prashantv opened this issue 3 years ago • 6 comments

Fixes hashicorp/terraform-plugin-sdk#652 (also reported by me in hashicorp/terraform-plugin-sdk#895)

When calculating a diff, elements in sets are tracked as a delete of all old attributes with NewRemoved = true, and a create of all new attributes. When DiffSuppressFunc is used for an attribute, the ResourceAttrDiff is replaced with New = Old (no-op): https://github.com/hashicorp/terraform-plugin-sdk/blob/fa8d313665945816f6eb6c79182e4abdc1540504/helper/schema/schema.go#L1144

However, this also drops all other metadata about the attr diff, such as NewRemoved. This ends up affecting the InstanceDiff.applyBlockDiff which expects to drop removed items: https://github.com/hashicorp/terraform-plugin-sdk/blob/e14d3b611f2e257d2a0862e5ea0f90ea96fd5bf8/terraform/diff.go#L207

All attributes of the removed set element get removed here, except those with DiffSuppressFunc since the NewRemoved attribute was dropped.

Instead of dropping the metadata about the attr diff, clone the original attr diff, and just set New = Old.

The added test fails without this fix:

=== RUN   TestSchemaMap_Diff/30-Set_with_DiffSuppressFunc
    schema_test.go:3188: expected:
        *terraform.InstanceDiff{ [...]"rule.80.duration":*terraform.ResourceAttrDiff{Old:"", New:"", NewComputed:false, NewRemoved:true, [...]

        got:
        *terraform.InstanceDiff{ [...]"rule.80.duration":*terraform.ResourceAttrDiff{Old:"", New:"", NewComputed:false, [...] NewRemoved:false, [...]

Previously, NewRemoved was set to false for the sustain field even though it belonged to an element being removed.

prashantv avatar Aug 30 '22 05:08 prashantv

CLA assistant check
All committers have signed the CLA.

hashicorp-cla avatar Aug 30 '22 05:08 hashicorp-cla

Friendly bump, this is an issue that has affected many folks (e.g., #588). I think this issue has found the root-cause, and it would be great to get a review from the team on whether this is the right way to address the issue.

prashantv avatar Sep 14 '22 01:09 prashantv

Friendly ping, I've also run into this issue.

eravin-ns1 avatar Jan 05 '23 18:01 eravin-ns1

Friendly bump, this issue is still causing problems for set usage, can any of the maintainers review this -- it's small change with tests.

prashantv avatar Feb 06 '23 16:02 prashantv

Is there a process for getting a review from the maintainers, it'd be great to get this in as it seems to be affecting multiple users.

prashantv avatar Mar 05 '23 21:03 prashantv