terraform-plugin-sdk
terraform-plugin-sdk copied to clipboard
Fix for TypeSet applying with unexpected empty element
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.
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.
Friendly ping, I've also run into this issue.
Friendly bump, this issue is still causing problems for set usage, can any of the maintainers review this -- it's small change with tests.
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.