'Shall I use d.Set() for a computer attribute?
I'm adding a new resource to Terraform Provider using Terraform SDKv2 (can't use the new Terraform Plugin).
One of new resource's attributes is the following:
"foo_enabled": {
Type: schema.TypeBool,
// Computed: true,
Optional: true,
Default: false,
},
I absolutely want this attribute to be optional and have a default value since it's not very important and only applicable for advanced users.
In my code, I only use d.Get("foo_enabled")
in resourceCreate()
and that's it. However when I started testing it, I figured if I don't set it to any value in Terraform configuration, it's being saved as foo_enabled = null
in TF state file, when I set it to false / true in Terraform configuration, then it's being saved as foo_enabled = false / true
(not 100% sure but I think it's accurate, don't remember what the value is after importing -- maybe it's false / true for create but null after importing).
To make things worse, I run into an issue with testing:
{
// https://www.terraform.io/docs/extend/resources/import.html
ResourceName: ...,
ImportState: true,
ImportStateVerify: true,
},
It used to work but now ImportStateVerify
fails with actual: null, expected: true / false.
The main point is I'd rather have it as explicit true / false
in any scenario to avoid drifts null -> false, or false -> null.
So I'm thinking about setting it in resourceRead()
like
foo := d.Get("foo_enabled").(bool)
d.Set("foo_enabled", foo)
and marking a resource as Computed
to allow these d.Set()
calls. Is it a reasonable idea?
Related: Shall I set an empty string computed string attribute for Terraform resource?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|