Maison >développement back-end >Golang >Développement du fournisseur Terraform : tfstate se met à jour même en cas d'échec de la mise à jour

Développement du fournisseur Terraform : tfstate se met à jour même en cas d'échec de la mise à jour

PHPz
PHPzavant
2024-02-10 20:00:091047parcourir

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

Éditeur PHP Apple Lors du développement du fournisseur Terraform, nous rencontrons souvent des échecs de mise à jour. Cependant, même si la mise à jour échoue, le fichier tfstate sera mis à jour. En effet, Terraform utilise des fichiers tfstate pour suivre l'état et les informations de configuration des ressources. Qu'une ressource soit créée, mise à jour ou supprimée, Terraform enregistrera le statut correspondant dans le fichier tfstate. Cette conception garantit que même si un problème survient pendant le processus de mise à jour, nous pouvons toujours obtenir le dernier état des ressources via le fichier tfstate, garantissant ainsi cohérence et fiabilité.

Contenu de la question

Je suis donc curieux de savoir comment développer un fournisseur Terraform et j'ai rencontré un problème que je ne peux pas expliquer.

Mon CRUD est très simple, je crée la ressource et mets à jour ses métadonnées au cours du cycle de vie puis la supprime sur la commande destroy.

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
}

Comme vous pouvez le voir, la fonction de mise à jour renvoie une erreur, ce qui était mon problème. Je fais intentionnellement échouer le processus, mais tfstate est toujours mis à jour (je modifie une variable dans la déclaration de ressource pour voir ce changement).

Voici le relevé complet des ressources

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",
            },
        },
    }
}

Qu'est-ce que j'ai raté ? Je pensais que tfstate ne devrait pas être mis à jour après l'échec de l'opération de mise à jour, mais c'est le cas. J'ai essayé les méthodes CRUD et CRUDContext et cela se comporte de la même manière dans les deux cas.

P/S/ terraform版本 Terraform v1.6.5,用于提供商开发使用hashicorp/terraform-plugin-sdk/v2/

Solution de contournement

Cela semble être un comportement attendu selon le article de blog : 一个>

"Si le rappel Update revient avec ou sans erreurs, enregistrez l'état complet

."

De plus, j'ai trouvé de vrais exemples fonctionnels qui renvoient tous Update 中返回 Read dans le rappel Read.

Fournisseur Cloudflare Par exemple, Fournisseur GitHub

Ils font tous ça :

func resourceCloudflareAccountMemberUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {

    return resourceCloudflareAccountMemberRead(ctx, d, meta)
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer