php Editor Apple During the development of Terraform Provider, we often encounter update failures. However, even if the update fails, the tfstate file will be updated. This is because Terraform uses tfstate files to track the status and configuration information of resources. Whether a resource is created, updated, or deleted, Terraform will record the corresponding status in the tfstate file. This design ensures that even if a problem occurs during the update process, we can still obtain the latest resource status through the tfstate file, thus ensuring consistency and reliability.
So I'm curious about how to develop a terraform provider and ran into a problem that I can't explain.
My CRUD is very simple, I create the resource and update its metadata during the lifecycle and then delete it on the destroy command.
func resourceCreate(d *schema.ResourceData, m any) error { id, err := uuid.GenerateUUID() if err != nil { return err } d.SetId(id) return nil } func resourceRead(d *schema.ResourceData, m any) error { return nil } func resourceUpdate(d *schema.ResourceData, m any) error { return errors.New("failed") } func resourceDelete(d *schema.ResourceData, m any) error { d.SetId("") return nil }
As you can see, the update function returns an error, which is my problem. I intentionally made the process fail, but tfstate still updated (I was changing a variable in the resource declaration to see this change).
This is the complete resource declaration
func demoResource() *schema.Resource { return &schema.Resource{ Description: "descr", Create: resourceCreate, Read: resourceRead, Update: resourceUpdate, Delete: resourceDelete, // CreateContext: demoResCreate, // ReadContext: demoResRead, // UpdateContext: demoResUpdate, // DeleteContext: demoResDelete, Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(10 * time.Minute), Update: schema.DefaultTimeout(10 * time.Minute), Delete: schema.DefaultTimeout(10 * time.Minute), }, Schema: map[string]*schema.Schema{ "name": { Type: schema.TypeString, Required: true, Description: "name", }, }, } }
What did I miss? I thought tfstate should not be updated after the update operation failed, but it is. I tried CRUD and CRUDContext methods and it behaves the same in both cases.
P/S/
terraform version
Terraform v1.6.5, for provider development usehashicorp/terraform-plugin-sdk/v2/
according to Blog post, this seems to be expected behavior: 一个>
"If the Update
callback returns with or without errors, save the complete state."
Also, I found some real working examples that all return Read
in the Update
callback.
Cloudflare Provider For example, GitHub Provider
They all do this:
func resourceCloudflareAccountMemberUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { return resourceCloudflareAccountMemberRead(ctx, d, meta) }
The above is the detailed content of Terraform Provider Development: tfstate updates even if update fails. For more information, please follow other related articles on the PHP Chinese website!