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

Set ends up with additional empty elements

Open eddycharly opened this issue 3 years ago • 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 ?

eddycharly avatar Dec 07 '20 15:12 eddycharly

Potentially related: https://github.com/hashicorp/terraform-plugin-sdk/issues/588

bflad avatar Dec 09 '20 03:12 bflad

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.

eddycharly avatar Dec 09 '20 07:12 eddycharly

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

prashantv avatar Mar 28 '22 02:03 prashantv

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.

prashantv avatar Sep 01 '22 15:09 prashantv