hashicorp / hashicorp/terraform-plugin-framework

Multiple computed BoolAttributes with defaults in SetNestedAttribute cause flip-flopping plan on every apply

Open
#867 3 comments 5 reactions 0 assignees View on GitHub
bug
Dominant language
Go
Stars
384
Forks
107
Avg merge
3m
Merged PRs (30d)
1

Description

### Module version

```
1.4.2
```

### Relevant provider source code

```go
func (r *setNestedExampleResource) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) {
resp.Schema = schema.Schema{
Attributes: map[string]schema.Attribute{
"set": schema.SetNestedAttribute{
Required: true,
NestedObject: schema.NestedAttributeObject{
Attributes: map[string]schema.Attribute{
"name": schema.StringAttribute{
Required: true,
},
"bool_one": schema.BoolAttribute{
Optional: true,
Computed: true,
Default: booldefault.StaticBool(false),
},
"bool_two": schema.BoolAttribute{
Optional: true,
Computed: true,
Default: booldefault.StaticBool(false),
},
},
},
},
},
}
}

func (r *setNestedExampleResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
resp.State.Raw = req.Plan.Raw
}

func (r *setNestedExampleResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) {
resp.State.Raw = req.State.Raw
}

func (r *setNestedExampleResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) {
resp.State.Raw = req.Plan.Raw
}
```

### Terraform Configuration Files

```hcl
resource "example_set_nested_example" "myExample" {
set = [
{
name = "test2"
bool_two = true
}
]
}
```

### Debug Output

### Expected Behavior
The provider would not produce any plan after the first apply.

### Actual Behavior
The first apply succeeds, and everything looks right in the state. On every subsequent apply, the generated plan flips the `bool_two` value to its opposite value.

First plan for example:
```
# example_set_nested_example.myExample will be created
+ resource "example_set_nested_example" "myExample" {
+ set = [
+ {
+ bool_one = false
+ bool_two = true
+ name = "test2"
},
]
}
```

Second plan with no changes to HCL:
```
# example_set_nested_example.myExample will be updated in-place
~ resource "example_set_nested_example" "myExample" {
~ set = [
- {
- bool_one = false -> null
- bool_two = true -> null
- name = "test2" -> null
},
+ {
+ bool_one = false
+ bool_two = false
+ name = "test2"
},
]
}
```

Third plan:
```
# example_set_nested_example.myExample will be updated in-place
~ resource "example_set_nested_example" "myExample" {
~ set = [
- {
- bool_one = false -> null
- bool_two = false -> null
- name = "test2" -> null
},
+ {
+ bool_one = false
+ bool_two = true
+ name = "test2"
},
]
}
```

The plans will continue to cycle between setting `bool_two` to true and to false.

### Steps to Reproduce
Apply the provided HCL multiple times

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.