diff --git a/.changelog/3420.txt b/.changelog/3420.txt new file mode 100644 index 0000000000..70758068c7 --- /dev/null +++ b/.changelog/3420.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_ckafka_user: optmize read function code logic +``` diff --git a/tencentcloud/services/ckafka/resource_tc_ckafka_user.go b/tencentcloud/services/ckafka/resource_tc_ckafka_user.go index b0b30ee638..dabe1e0555 100644 --- a/tencentcloud/services/ckafka/resource_tc_ckafka_user.go +++ b/tencentcloud/services/ckafka/resource_tc_ckafka_user.go @@ -57,21 +57,21 @@ func ResourceTencentCloudCkafkaUser() *schema.Resource { func resourceTencentCloudCkafkaUserCreate(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_ckafka_user.create")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + ckafkaService = CkafkaService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + ) instanceId := d.Get("instance_id").(string) accountName := d.Get("account_name").(string) password := d.Get("password").(string) - ckafkaService := CkafkaService{ - client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(), - } if err := ckafkaService.CreateUser(ctx, instanceId, accountName, password); err != nil { return fmt.Errorf("[CRITAL]%s create ckafka user failed, reason:%+v", logId, err) } - d.SetId(instanceId + tccommon.FILED_SP + accountName) + d.SetId(strings.Join([]string{instanceId, accountName}, tccommon.FILED_SP)) return resourceTencentCloudCkafkaUserRead(d, meta) } @@ -79,21 +79,23 @@ func resourceTencentCloudCkafkaUserRead(d *schema.ResourceData, meta interface{} defer tccommon.LogElapsed("resource.tencentcloud_ckafka_user.read")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - ckafkaService := CkafkaService{ - client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(), - } + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + ckafkaService = CkafkaService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + id = d.Id() + ) - id := d.Id() info, has, err := ckafkaService.DescribeUserByUserId(ctx, id) if err != nil { return err } + if !has { d.SetId("") return nil } + items := strings.Split(id, tccommon.FILED_SP) _ = d.Set("instance_id", items[0]) _ = d.Set("account_name", info.Name) @@ -106,20 +108,23 @@ func resourceTencentCloudCkafkaUserRead(d *schema.ResourceData, meta interface{} func resourceTencentCloudCkafkaUserUpdate(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_ckafka_user.update")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - ckafkaService := CkafkaService{ - client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(), - } + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + ckafkaService = CkafkaService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + ) - instanceId := d.Get("instance_id").(string) - user := d.Get("account_name").(string) if d.HasChange("password") { + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) + if len(idSplit) != 2 { + return fmt.Errorf("id is broken, id is %s", d.Id()) + } + + instanceId, user := idSplit[0], idSplit[1] old, new := d.GetChange("password") if err := ckafkaService.ModifyPassword(ctx, instanceId, user, old.(string), new.(string)); err != nil { return err } - } return resourceTencentCloudCkafkaUserRead(d, meta) @@ -128,14 +133,15 @@ func resourceTencentCloudCkafkaUserUpdate(d *schema.ResourceData, meta interface func resourceTencentCloudCkafkaUserDelete(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_ckafka_user.delete")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - ckafkaService := CkafkaService{ - client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(), - } + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + ckafkaService = CkafkaService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + ) if err := ckafkaService.DeleteUser(ctx, d.Id()); err != nil { return err } + return nil } diff --git a/tencentcloud/services/ckafka/resource_tc_ckafka_user.md b/tencentcloud/services/ckafka/resource_tc_ckafka_user.md index 0db7b7ce06..460effb986 100644 --- a/tencentcloud/services/ckafka/resource_tc_ckafka_user.md +++ b/tencentcloud/services/ckafka/resource_tc_ckafka_user.md @@ -5,10 +5,10 @@ Example Usage Ckafka User ```hcl -resource "tencentcloud_ckafka_user" "foo" { - instance_id = "ckafka-f9ife4zz" - account_name = "tf-test" - password = "test1234" +resource "tencentcloud_ckafka_user" "example" { + instance_id = "ckafka-7k5nbnem" + account_name = "tf-example" + password = "Password@123" } ``` @@ -17,5 +17,5 @@ Import Ckafka user can be imported using the instance_id#account_name, e.g. ``` -$ terraform import tencentcloud_ckafka_user.foo ckafka-f9ife4zz#tf-test -``` \ No newline at end of file +$ terraform import tencentcloud_ckafka_user.example ckafka-7k5nbnem#tf-example +``` diff --git a/tencentcloud/services/ckafka/service_tencentcloud_ckafka.go b/tencentcloud/services/ckafka/service_tencentcloud_ckafka.go index 2792750c4d..f76ef7a9dc 100644 --- a/tencentcloud/services/ckafka/service_tencentcloud_ckafka.go +++ b/tencentcloud/services/ckafka/service_tencentcloud_ckafka.go @@ -152,49 +152,72 @@ func (me *CkafkaService) OperateStatusCheck(ctx context.Context, result *ckafka. func (me *CkafkaService) DescribeUserByUserId(ctx context.Context, userId string) (userInfo *ckafka.User, has bool, errRet error) { logId := tccommon.GetLogId(ctx) - items := strings.Split(userId, tccommon.FILED_SP) if len(items) != 2 { errRet = fmt.Errorf("id of resource.tencentcloud_ckafka_user is wrong") return } - instanceId, user := items[0], items[1] + instanceId, user := items[0], items[1] if _, has, _ = me.DescribeInstanceById(ctx, instanceId); !has { return } request := ckafka.NewDescribeUserRequest() + response := ckafka.NewDescribeUserResponse() request.InstanceId = &instanceId request.SearchWord = &user - var response *ckafka.DescribeUserResponse - var err error - err = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { - response, err = me.client.UseCkafkaClient().DescribeUser(request) + var ( + userInfoList []*ckafka.User + offset int64 = 0 + limit int64 = 100 + ) + + for { + request.Offset = &offset + request.Limit = &limit + + err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseCkafkaClient().DescribeUser(request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil { + return resource.NonRetryableError(fmt.Errorf("Describe user failed, Response is nil.")) + } + + response = result + return nil + }) + if err != nil { - return tccommon.RetryError(err) + errRet = fmt.Errorf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]", logId, request.GetAction(), request.ToJsonString(), err.Error()) + return } - return nil - }) - if err != nil { - errRet = fmt.Errorf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]", logId, request.GetAction(), request.ToJsonString(), err.Error()) - return + if response.Response.Result == nil || response.Response.Result.Users == nil { + break + } + + userInfoList = append(userInfoList, response.Response.Result.Users...) + if len(response.Response.Result.Users) < int(limit) { + break + } + + offset += limit } - if response != nil && response.Response != nil && response.Response.Result != nil && response.Response.Result.Users != nil { - if len(response.Response.Result.Users) < 1 { - has = false - return - } else if len(response.Response.Result.Users) > 1 { - errRet = fmt.Errorf("[CRITAL]%s dumplicated users found", logId) + for _, item := range userInfoList { + if *item.Name == user { + userInfo = item + has = true return } - - userInfo = response.Response.Result.Users[0] - has = true - return } return diff --git a/website/docs/r/ckafka_user.html.markdown b/website/docs/r/ckafka_user.html.markdown index 9f074f814f..85fdac00c6 100644 --- a/website/docs/r/ckafka_user.html.markdown +++ b/website/docs/r/ckafka_user.html.markdown @@ -16,10 +16,10 @@ Provides a resource to create a Ckafka user. ### Ckafka User ```hcl -resource "tencentcloud_ckafka_user" "foo" { - instance_id = "ckafka-f9ife4zz" - account_name = "tf-test" - password = "test1234" +resource "tencentcloud_ckafka_user" "example" { + instance_id = "ckafka-7k5nbnem" + account_name = "tf-example" + password = "Password@123" } ``` @@ -45,6 +45,6 @@ In addition to all arguments above, the following attributes are exported: Ckafka user can be imported using the instance_id#account_name, e.g. ``` -$ terraform import tencentcloud_ckafka_user.foo ckafka-f9ife4zz#tf-test +$ terraform import tencentcloud_ckafka_user.example ckafka-7k5nbnem#tf-example ```