Home  >  Article  >  Backend Development  >  Terraform Provider Development: tfstate updates even if update fails

Terraform Provider Development: tfstate updates even if update fails

PHPz
PHPzforward
2024-02-10 20:00:091010browse

Terraform Provider Development:即使更新失败,tfstate 也会更新

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.

Question content

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/

Solution

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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete