Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix for TypeSet applying with unexpected empty element #1042

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

prashantv
Copy link

@prashantv prashantv commented Aug 30, 2022

Fixes #652 (also reported by me in #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):

// If this attr diff is suppressed, we may still need it in the

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:

// removed items don't count either

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.

Fixes hashicorp#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 prashantv requested a review from a team as a code owner August 30, 2022 05:28
@hashicorp-cla
Copy link

hashicorp-cla commented Aug 30, 2022

CLA assistant check
All committers have signed the CLA.

@prashantv
Copy link
Author

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.

@eravin-ns1
Copy link

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

@prashantv
Copy link
Author

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
Copy link
Author

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Set ends up with additional empty elements
3 participants