Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/3420.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
resource/tencentcloud_ckafka_user: optmize read function code logic
```
56 changes: 31 additions & 25 deletions tencentcloud/services/ckafka/resource_tc_ckafka_user.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,43 +57,45 @@ 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)
}

func resourceTencentCloudCkafkaUserRead(d *schema.ResourceData, meta interface{}) error {
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)
Expand All @@ -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)
Expand All @@ -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
}
12 changes: 6 additions & 6 deletions tencentcloud/services/ckafka/resource_tc_ckafka_user.md
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
```

Expand All @@ -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
```
$ terraform import tencentcloud_ckafka_user.example ckafka-7k5nbnem#tf-example
```
67 changes: 45 additions & 22 deletions tencentcloud/services/ckafka/service_tencentcloud_ckafka.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 5 additions & 5 deletions website/docs/r/ckafka_user.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
```

Expand All @@ -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
```

Loading