hashicorp/terraform-plugin-sdk

Set ends up with additional empty elements

eddycharly opened this issue · 4 comments

When using a schema.Set, i end up with additional elements in the set (on update) with all fields initialized with default values.

Let's say i have a configuration like this (instance_group is the set here):

resource "cluster" "cluster" {
  instance_group {
    name = "compute-0"
    // ...
  }
  instance_group {
    name = "compute-1"
    // ...
  }
}

And i want to change it to something like this:

resource "cluster" "cluster" {
  instance_group {
    name = "node-0"
    // ...
  }
  instance_group {
    name = "node-1"
    // ...
  }
}

When i apply this change, the set contains node-0 and node-1 instance groups plus one empty element. I would expect the set to contain only node-0 and node-1.

SDK version

	github.com/hashicorp/terraform-plugin-sdk/v2 v2.3.0

Expected Behavior

Given the example above i would have expected to receive only node-0 and node-1 in the set elements when update function is invoked.

Actual Behavior

Update function receives node-0, node-1 and an additional empty element in the set elements.

Not sure it this behavior is expected, it looks a bit unnatural to me but maybe i'm missing something.
Correct me if i'm wrong, there's nothing bad returning a set when terraform calls the read function to refresh the state ?

bflad commented

Potentially related: #588

Thanks, it looks the same indeed.
Is there a known workaround ? So many plugins rely on sets, i can't believe this issue went unnoticed.

In case anyone is looking for a workaround, copying a mitigation (that I originally posted in #895) -- use a list instead of a set.

After this hitting this issue again in a scenario where we couldn't use a list, I spent some time investigating and think I have a fix: #1042. I'm not very familiar with this codebase, so it may not be the right fix, but it would be great to get some eyes on the fix.