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

Terraform Provider Development: tfstate updates even if update fails

PHPz
Release: 2024-02-10 20:00:09
forward
1052 people have browsed it

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
}
Copy after login

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",
            },
        },
    }
}
Copy after login

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)
}
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template