From 10d5bf64cdd41eee785977e3e99d877cff7cb0e7 Mon Sep 17 00:00:00 2001 From: Myroslav Vivcharyk Date: Thu, 9 Jan 2025 18:58:03 +0100 Subject: [PATCH] feat(kafka_quota): added retries to kafka_quota resource (#1983) --- .../sdkprovider/service/kafka/kafka_quota.go | 22 +++++++++++++++++-- .../service/kafka/kafka_quota_test.go | 18 +++++++-------- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/internal/sdkprovider/service/kafka/kafka_quota.go b/internal/sdkprovider/service/kafka/kafka_quota.go index db89dc72b..8c4687cc8 100644 --- a/internal/sdkprovider/service/kafka/kafka_quota.go +++ b/internal/sdkprovider/service/kafka/kafka_quota.go @@ -3,9 +3,11 @@ package kafka import ( "context" "fmt" + "time" avngen "github.com/aiven/go-client-codegen" "github.com/aiven/go-client-codegen/handler/kafka" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" @@ -120,7 +122,7 @@ func resourceKafkaQuotaCreate(ctx context.Context, d *schema.ResourceData, clien d.SetId(schemautil.BuildResourceID(project, service, clientID, user)) - return resourceKafkaQuotaRead(ctx, d, client) + return readKafkaQuotaWithRetry(ctx, d, client) } func resourceKafkaQuotaUpdate(ctx context.Context, d *schema.ResourceData, client avngen.Client) error { @@ -145,7 +147,7 @@ func resourceKafkaQuotaUpdate(ctx context.Context, d *schema.ResourceData, clien return err } - return resourceKafkaQuotaRead(ctx, d, client) + return readKafkaQuotaWithRetry(ctx, d, client) } func resourceKafkaQuotaRead(ctx context.Context, d *schema.ResourceData, client avngen.Client) error { @@ -209,3 +211,19 @@ func resourceKafkaQuotaDelete(ctx context.Context, d *schema.ResourceData, clien params..., ) } + +// readKafkaQuotaWithRetry is a helper function that retries reading a Kafka quota resource in case of a 404 error. +// We need to retry reading the resource because the Kafka quota may not be immediately available after creation. +func readKafkaQuotaWithRetry(ctx context.Context, d *schema.ResourceData, client avngen.Client) error { + return retry.RetryContext(ctx, 3*time.Second, func() *retry.RetryError { + err := resourceKafkaQuotaRead(ctx, d, client) + if err == nil { + return nil + } + + return &retry.RetryError{ + Err: err, + Retryable: avngen.IsNotFound(err), // retries not found errors only + } + }) +} diff --git a/internal/sdkprovider/service/kafka/kafka_quota_test.go b/internal/sdkprovider/service/kafka/kafka_quota_test.go index 68c9bfd6f..ca4d64b19 100644 --- a/internal/sdkprovider/service/kafka/kafka_quota_test.go +++ b/internal/sdkprovider/service/kafka/kafka_quota_test.go @@ -273,13 +273,13 @@ resource "aiven_kafka_quota" "{{ .resource_name }}" { ), }, { - // craete multiple resources with different configurations + // create multiple resources with different configurations Config: newComposition(). Add("kafka_quota", map[string]any{ "resource_name": "new_full", "service_name": serviceName, - "user": user, - "client_id": clientID, + "user": fmt.Sprintf("%s_1", user), + "client_id": fmt.Sprintf("%s_1", clientID), "consumer_byte_rate": 4000, "producer_byte_rate": 4000, "request_percentage": 40.5, @@ -287,28 +287,28 @@ resource "aiven_kafka_quota" "{{ .resource_name }}" { Add("kafka_quota", map[string]any{ "resource_name": "user", "service_name": serviceName, - "user": user, + "user": fmt.Sprintf("%s_2", user), "request_percentage": 20.22, }). Add("kafka_quota", map[string]any{ "resource_name": "client", "service_name": serviceName, - "client_id": clientID, + "client_id": fmt.Sprintf("%s_3", clientID), "producer_byte_rate": 2000, }). MustRender(t), Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttr(fmt.Sprintf("%s.new_full", kafkaQuotaResource), "project", projectName), resource.TestCheckResourceAttr(fmt.Sprintf("%s.new_full", kafkaQuotaResource), "service_name", serviceName), - resource.TestCheckResourceAttr(fmt.Sprintf("%s.new_full", kafkaQuotaResource), "user", user), - resource.TestCheckResourceAttr(fmt.Sprintf("%s.new_full", kafkaQuotaResource), "client_id", clientID), + resource.TestCheckResourceAttr(fmt.Sprintf("%s.new_full", kafkaQuotaResource), "user", fmt.Sprintf("%s_1", user)), + resource.TestCheckResourceAttr(fmt.Sprintf("%s.new_full", kafkaQuotaResource), "client_id", fmt.Sprintf("%s_1", clientID)), resource.TestCheckResourceAttr(fmt.Sprintf("%s.new_full", kafkaQuotaResource), "consumer_byte_rate", "4000"), resource.TestCheckResourceAttr(fmt.Sprintf("%s.new_full", kafkaQuotaResource), "producer_byte_rate", "4000"), resource.TestCheckResourceAttr(fmt.Sprintf("%s.new_full", kafkaQuotaResource), "request_percentage", "40.5"), resource.TestCheckResourceAttr(fmt.Sprintf("%s.user", kafkaQuotaResource), "project", projectName), resource.TestCheckResourceAttr(fmt.Sprintf("%s.user", kafkaQuotaResource), "service_name", serviceName), - resource.TestCheckResourceAttr(fmt.Sprintf("%s.user", kafkaQuotaResource), "user", user), + resource.TestCheckResourceAttr(fmt.Sprintf("%s.user", kafkaQuotaResource), "user", fmt.Sprintf("%s_2", user)), resource.TestCheckResourceAttr(fmt.Sprintf("%s.user", kafkaQuotaResource), "request_percentage", "20.22"), resource.TestCheckNoResourceAttr(fmt.Sprintf("%s.user", kafkaQuotaResource), "client_id"), resource.TestCheckNoResourceAttr(fmt.Sprintf("%s.user", kafkaQuotaResource), "consumer_byte_rate"), @@ -316,7 +316,7 @@ resource "aiven_kafka_quota" "{{ .resource_name }}" { resource.TestCheckResourceAttr(fmt.Sprintf("%s.client", kafkaQuotaResource), "project", projectName), resource.TestCheckResourceAttr(fmt.Sprintf("%s.client", kafkaQuotaResource), "service_name", serviceName), - resource.TestCheckResourceAttr(fmt.Sprintf("%s.client", kafkaQuotaResource), "client_id", clientID), + resource.TestCheckResourceAttr(fmt.Sprintf("%s.client", kafkaQuotaResource), "client_id", fmt.Sprintf("%s_3", clientID)), resource.TestCheckResourceAttr(fmt.Sprintf("%s.client", kafkaQuotaResource), "producer_byte_rate", "2000"), resource.TestCheckNoResourceAttr(fmt.Sprintf("%s.client", kafkaQuotaResource), "user"), resource.TestCheckNoResourceAttr(fmt.Sprintf("%s.client", kafkaQuotaResource), "consumer_byte_rate"),