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
É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é.
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/
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!