From 8cfb57c236319c110c394e0762f3d6781b7243ec Mon Sep 17 00:00:00 2001 From: Ludwig Patte Date: Fri, 2 Jun 2023 13:45:53 +0000 Subject: [PATCH] add retry in kafka topic + clean dead code --- ovh/resource_cloud_project_database.go | 4 - ...urce_cloud_project_database_integration.go | 4 - ...urce_cloud_project_database_kafka_topic.go | 96 ++++++++++++------- ...e_cloud_project_database_m3db_namespace.go | 4 - ...ource_cloud_project_database_redis_user.go | 4 - 5 files changed, 60 insertions(+), 52 deletions(-) diff --git a/ovh/resource_cloud_project_database.go b/ovh/resource_cloud_project_database.go index 8e4d95200..0726a62fd 100644 --- a/ovh/resource_cloud_project_database.go +++ b/ovh/resource_cloud_project_database.go @@ -313,7 +313,6 @@ func resourceCloudProjectDatabaseRead(ctx context.Context, d *schema.ResourceDat res.AdvancedConfiguration = *advancedConfigMap } - diags := make(diag.Diagnostics, 0) for k, v := range res.ToMap() { if k != "id" { d.Set(k, v) @@ -322,9 +321,6 @@ func resourceCloudProjectDatabaseRead(ctx context.Context, d *schema.ResourceDat } } - if len(diags) > 0 { - return diags - } return nil } diff --git a/ovh/resource_cloud_project_database_integration.go b/ovh/resource_cloud_project_database_integration.go index 0de011f49..aacd974a1 100644 --- a/ovh/resource_cloud_project_database_integration.go +++ b/ovh/resource_cloud_project_database_integration.go @@ -170,7 +170,6 @@ func resourceCloudProjectDatabaseIntegrationRead(ctx context.Context, d *schema. return diag.FromErr(helpers.CheckDeleted(d, err, endpoint)) } - diags := make(diag.Diagnostics, 0) for k, v := range res.ToMap() { if k != "id" { d.Set(k, v) @@ -179,9 +178,6 @@ func resourceCloudProjectDatabaseIntegrationRead(ctx context.Context, d *schema. } } - if len(diags) > 0 { - return diags - } return nil } diff --git a/ovh/resource_cloud_project_database_kafka_topic.go b/ovh/resource_cloud_project_database_kafka_topic.go index 9f528cf61..b34a30670 100644 --- a/ovh/resource_cloud_project_database_kafka_topic.go +++ b/ovh/resource_cloud_project_database_kafka_topic.go @@ -9,7 +9,9 @@ import ( "time" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/ovh/go-ovh/ovh" "github.com/ovh/terraform-provider-ovh/ovh/helpers" ) @@ -123,22 +125,35 @@ func resourceCloudProjectDatabaseKafkaTopicCreate(ctx context.Context, d *schema params := (&CloudProjectDatabaseKafkaTopicCreateOpts{}).FromResource(d) res := &CloudProjectDatabaseKafkaTopicResponse{} - log.Printf("[DEBUG] Will create topic: %+v for cluster %s from project %s", params, clusterId, serviceName) - err := config.OVHClient.Post(endpoint, params, res) - if err != nil { - return diag.Errorf("calling Post %s with params %+v:\n\t %q", endpoint, params, err) - } - - log.Printf("[DEBUG] Waiting for topic %s to be READY", res.Id) - err = waitForCloudProjectDatabaseKafkaTopicReady(ctx, config.OVHClient, serviceName, clusterId, res.Id, d.Timeout(schema.TimeoutCreate)) - if err != nil { - return diag.Errorf("timeout while waiting topic %s to be READY: %s", res.Id, err.Error()) - } - log.Printf("[DEBUG] topic %s is READY", res.Id) - - d.SetId(res.Id) - - return resourceCloudProjectDatabaseKafkaTopicRead(ctx, d, meta) + return diag.FromErr( + resource.RetryContext(ctx, d.Timeout(schema.TimeoutCreate), + func() *resource.RetryError { + log.Printf("[DEBUG] Will create topic: %+v for cluster %s from project %s", params, clusterId, serviceName) + err := config.OVHClient.Post(endpoint, params, res) + if err != nil { + if errOvh, ok := err.(*ovh.APIError); ok && (errOvh.Code == 409) { + return resource.RetryableError(err) + } + return resource.NonRetryableError(fmt.Errorf("calling Post %s with params %+v:\n\t %q", endpoint, params, err)) + } + + log.Printf("[DEBUG] Waiting for topic %s to be READY", res.Id) + err = waitForCloudProjectDatabaseKafkaTopicReady(ctx, config.OVHClient, serviceName, clusterId, res.Id, d.Timeout(schema.TimeoutCreate)) + if err != nil { + return resource.NonRetryableError(fmt.Errorf("timeout while waiting topic %s to be READY: %s", res.Id, err.Error())) + } + log.Printf("[DEBUG] topic %s is READY", res.Id) + + d.SetId(res.Id) + readDiags := resourceCloudProjectDatabaseKafkaTopicRead(ctx, d, meta) + err = diagnosticsToError(readDiags) + if err != nil { + return resource.NonRetryableError(err) + } + return nil + }, + ), + ) } func resourceCloudProjectDatabaseKafkaTopicRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { @@ -159,7 +174,6 @@ func resourceCloudProjectDatabaseKafkaTopicRead(ctx context.Context, d *schema.R return diag.FromErr(helpers.CheckDeleted(d, err, endpoint)) } - diags := make(diag.Diagnostics, 0) for k, v := range res.ToMap() { if k != "id" { d.Set(k, v) @@ -168,9 +182,6 @@ func resourceCloudProjectDatabaseKafkaTopicRead(ctx context.Context, d *schema.R } } - if len(diags) > 0 { - return diags - } return nil } @@ -186,20 +197,33 @@ func resourceCloudProjectDatabaseKafkaTopicDelete(ctx context.Context, d *schema url.PathEscape(id), ) - log.Printf("[DEBUG] Will delete topic %s from cluster %s from project %s", id, clusterId, serviceName) - err := config.OVHClient.Delete(endpoint, nil) - if err != nil { - return diag.FromErr(helpers.CheckDeleted(d, err, endpoint)) - } - - log.Printf("[DEBUG] Waiting for topic %s to be DELETED", id) - err = waitForCloudProjectDatabaseKafkaTopicDeleted(ctx, config.OVHClient, serviceName, clusterId, id, d.Timeout(schema.TimeoutDelete)) - if err != nil { - return diag.Errorf("timeout while waiting topic %s to be DELETED: %s", id, err.Error()) - } - log.Printf("[DEBUG] topic %s is DELETED", id) - - d.SetId("") - - return nil + return diag.FromErr( + resource.RetryContext(ctx, d.Timeout(schema.TimeoutDelete), + func() *resource.RetryError { + log.Printf("[DEBUG] Will delete topic %s from cluster %s from project %s", id, clusterId, serviceName) + err := config.OVHClient.Delete(endpoint, nil) + if err != nil { + if errOvh, ok := err.(*ovh.APIError); ok && (errOvh.Code == 409) { + return resource.RetryableError(err) + } + err = helpers.CheckDeleted(d, err, endpoint) + if err != nil { + return resource.NonRetryableError(err) + } + return nil + } + + log.Printf("[DEBUG] Waiting for topic %s to be DELETED", id) + err = waitForCloudProjectDatabaseKafkaTopicDeleted(ctx, config.OVHClient, serviceName, clusterId, id, d.Timeout(schema.TimeoutDelete)) + if err != nil { + return resource.NonRetryableError(fmt.Errorf("timeout while waiting topic %s to be DELETED: %s", id, err.Error())) + } + log.Printf("[DEBUG] topic %s is DELETED", id) + + d.SetId("") + + return nil + }, + ), + ) } diff --git a/ovh/resource_cloud_project_database_m3db_namespace.go b/ovh/resource_cloud_project_database_m3db_namespace.go index 2ae258092..1c6fa6be3 100644 --- a/ovh/resource_cloud_project_database_m3db_namespace.go +++ b/ovh/resource_cloud_project_database_m3db_namespace.go @@ -184,7 +184,6 @@ func resourceCloudProjectDatabaseM3dbNamespaceRead(ctx context.Context, d *schem return diag.FromErr(helpers.CheckDeleted(d, err, endpoint)) } - diags := make(diag.Diagnostics, 0) for k, v := range res.ToMap() { if k != "id" { d.Set(k, v) @@ -193,9 +192,6 @@ func resourceCloudProjectDatabaseM3dbNamespaceRead(ctx context.Context, d *schem } } - if len(diags) > 0 { - return diags - } return nil } diff --git a/ovh/resource_cloud_project_database_redis_user.go b/ovh/resource_cloud_project_database_redis_user.go index e97d563c6..831c708f4 100644 --- a/ovh/resource_cloud_project_database_redis_user.go +++ b/ovh/resource_cloud_project_database_redis_user.go @@ -132,7 +132,6 @@ func resourceCloudProjectDatabaseRedisUserRead(ctx context.Context, d *schema.Re return diag.FromErr(helpers.CheckDeleted(d, err, endpoint)) } - diags := make(diag.Diagnostics, 0) for k, v := range res.ToMap() { if k != "id" { d.Set(k, v) @@ -141,9 +140,6 @@ func resourceCloudProjectDatabaseRedisUserRead(ctx context.Context, d *schema.Re } } - if len(diags) > 0 { - return diags - } return nil }