diff --git a/vault/resource_generic_secret.go b/vault/resource_generic_secret.go index d9c3b69be..98eb740cf 100644 --- a/vault/resource_generic_secret.go +++ b/vault/resource_generic_secret.go @@ -4,8 +4,12 @@ import ( "encoding/json" "fmt" "log" + "net/http" + "time" + "github.com/cenkalti/backoff/v4" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/vault/api" "github.com/hashicorp/terraform-provider-vault/internal/consts" "github.com/hashicorp/terraform-provider-vault/internal/provider" @@ -145,10 +149,24 @@ func genericSecretResourceWrite(d *schema.ResourceData, meta interface{}) error } - log.Printf("[DEBUG] Writing generic Vault secret to %s", path) - _, err = client.Logical().Write(path, data) - if err != nil { - return fmt.Errorf("error writing to Vault: %s", err) + writeData := func() error { + if _, err := client.Logical().Write(path, data); err != nil { + if respErr, ok := err.(*api.ResponseError); ok && (respErr.StatusCode == http.StatusBadRequest) { + return err + } else { + return backoff.Permanent(err) + } + } + return nil + } + + bo := backoff.WithMaxRetries(backoff.NewConstantBackOff(time.Millisecond*500), 10) + + log.Printf("[DEBUG] Writing generic Vault secret to %s", path) + if err := backoff.RetryNotify(writeData, bo, func(err error, duration time.Duration) { + log.Printf("[WARN] create generic secret %q failed, retrying in %s", path, duration) + }); err != nil { + return fmt.Errorf("error creating generic secret: %s", err) } d.SetId(originalPath)