Skip to content

fix(trocket): [125261403] tencentcloud_trocket_rocketmq_topic optmize read function code logic #3425

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
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/3425.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
resource/tencentcloud_trocket_rocketmq_topic: optmize read function code logic
```
91 changes: 53 additions & 38 deletions tencentcloud/services/trocket/resource_tc_trocket_rocketmq_topic.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,35 +26,35 @@ func ResourceTencentCloudTrocketRocketmqTopic() *schema.Resource {
},
Schema: map[string]*schema.Schema{
"instance_id": {
Required: true,
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "Instance Id.",
},

"topic": {
Required: true,
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "topic.",
},

"topic_type": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Type: schema.TypeString,
Description: "Topic type. `UNSPECIFIED`: not specified, `NORMAL`: normal message, `FIFO`: sequential message, `DELAY`: delayed message.",
},

"queue_num": {
Required: true,
Type: schema.TypeInt,
Required: true,
Description: "Number of queue. Must be greater than or equal to 3.",
},

"remark": {
Optional: true,
Type: schema.TypeString,
Optional: true,
Description: "remark.",
},
},
Expand All @@ -65,14 +65,14 @@ func resourceTencentCloudTrocketRocketmqTopicCreate(d *schema.ResourceData, meta
defer tccommon.LogElapsed("resource.tencentcloud_trocket_rocketmq_topic.create")()
defer tccommon.InconsistentCheck(d, meta)()

logId := tccommon.GetLogId(tccommon.ContextNil)

var (
logId = tccommon.GetLogId(tccommon.ContextNil)
request = trocket.NewCreateTopicRequest()
response = trocket.NewCreateTopicResponse()
instanceId string
topic string
)

if v, ok := d.GetOk("instance_id"); ok {
request.InstanceId = helper.String(v.(string))
}
Expand Down Expand Up @@ -100,35 +100,45 @@ func resourceTencentCloudTrocketRocketmqTopicCreate(d *schema.ResourceData, meta
} 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("Create trocket rocketmqTopic failed, Response is nil."))
}

response = result
return nil
})

if err != nil {
log.Printf("[CRITAL]%s create trocket rocketmqTopic failed, reason:%+v", logId, err)
return err
}

if response.Response.InstanceId == nil || response.Response.Topic == nil {
return fmt.Errorf("InstanceId or Topic is nil.")
}

instanceId = *response.Response.InstanceId
topic = *response.Response.Topic
d.SetId(instanceId + tccommon.FILED_SP + topic)

d.SetId(strings.Join([]string{instanceId, topic}, tccommon.FILED_SP))
return resourceTencentCloudTrocketRocketmqTopicRead(d, meta)
}

func resourceTencentCloudTrocketRocketmqTopicRead(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_trocket_rocketmq_topic.read")()
defer tccommon.InconsistentCheck(d, meta)()

logId := tccommon.GetLogId(tccommon.ContextNil)

ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)

service := TrocketService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
var (
logId = tccommon.GetLogId(tccommon.ContextNil)
ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
service = TrocketService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
)

idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
if len(idSplit) != 2 {
return fmt.Errorf("id is broken,%s", d.Id())
}

instanceId := idSplit[0]
topic := idSplit[1]

Expand All @@ -138,8 +148,8 @@ func resourceTencentCloudTrocketRocketmqTopicRead(d *schema.ResourceData, meta i
}

if rocketmqTopic == nil {
d.SetId("")
log.Printf("[WARN]%s resource `TrocketRocketmqTopic` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
d.SetId("")
return nil
}

Expand Down Expand Up @@ -170,44 +180,46 @@ func resourceTencentCloudTrocketRocketmqTopicUpdate(d *schema.ResourceData, meta
defer tccommon.LogElapsed("resource.tencentcloud_trocket_rocketmq_topic.update")()
defer tccommon.InconsistentCheck(d, meta)()

logId := tccommon.GetLogId(tccommon.ContextNil)

request := trocket.NewModifyTopicRequest()
var (
logId = tccommon.GetLogId(tccommon.ContextNil)
request = trocket.NewModifyTopicRequest()
)

idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
if len(idSplit) != 2 {
return fmt.Errorf("id is broken,%s", d.Id())
}

instanceId := idSplit[0]
topic := idSplit[1]

request.InstanceId = &instanceId
request.Topic = &topic
if d.HasChange("queue_num") || d.HasChange("remark") {
request.InstanceId = &instanceId
request.Topic = &topic

if d.HasChange("queue_num") {
if v, ok := d.GetOkExists("queue_num"); ok {
request.QueueNum = helper.IntInt64(v.(int))
}
}

if d.HasChange("remark") {
if v, ok := d.GetOk("remark"); ok {
request.Remark = helper.String(v.(string))
}
}

err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTrocketClient().ModifyTopic(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())
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTrocketClient().ModifyTopic(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())
}

return nil
})

if err != nil {
log.Printf("[CRITAL]%s update trocket rocketmqTopic failed, reason:%+v", logId, err)
return err
}
return nil
})
if err != nil {
log.Printf("[CRITAL]%s update trocket rocketmqTopic failed, reason:%+v", logId, err)
return err
}

return resourceTencentCloudTrocketRocketmqTopicRead(d, meta)
Expand All @@ -217,14 +229,17 @@ func resourceTencentCloudTrocketRocketmqTopicDelete(d *schema.ResourceData, meta
defer tccommon.LogElapsed("resource.tencentcloud_trocket_rocketmq_topic.delete")()
defer tccommon.InconsistentCheck(d, meta)()

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)
service = TrocketService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
)

service := TrocketService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
if len(idSplit) != 2 {
return fmt.Errorf("id is broken,%s", d.Id())
}

instanceId := idSplit[0]
topic := idSplit[1]

Expand Down
57 changes: 39 additions & 18 deletions tencentcloud/services/trocket/resource_tc_trocket_rocketmq_topic.md
Original file line number Diff line number Diff line change
@@ -1,34 +1,55 @@
Provides a resource to create a trocket rocketmq_topic
Provides a resource to create a TROCKET rocketmq topic

Example Usage

```hcl
resource "tencentcloud_trocket_rocketmq_instance" "rocketmq_instance" {
instance_type = "EXPERIMENT"
name = "test"
sku_code = "experiment_500"
remark = "test"
vpc_id = "vpc-xxxxx"
subnet_id = "subnet-xxxxx"
tags = {
tag_key = "rocketmq"
tag_value = "5.x"
variable "availability_zone" {
default = "ap-guangzhou-6"
}

// create vpc
resource "tencentcloud_vpc" "vpc" {
cidr_block = "10.0.0.0/16"
name = "vpc"
}

// create subnet
resource "tencentcloud_subnet" "subnet" {
vpc_id = tencentcloud_vpc.vpc.id
availability_zone = var.availability_zone
name = "subnet"
cidr_block = "10.0.1.0/24"
is_multicast = false
}

// create rocketmq instance
resource "tencentcloud_trocket_rocketmq_instance" "example" {
name = "tf-example"
instance_type = "BASIC"
sku_code = "basic_2k"
remark = "remark."
vpc_id = tencentcloud_vpc.vpc.id
subnet_id = tencentcloud_subnet.subnet.id
tags = {
tag_key = "createBy"
tag_value = "Terraform"
}
}

resource "tencentcloud_trocket_rocketmq_topic" "rocketmq_topic" {
instance_id = tencentcloud_trocket_rocketmq_instance.rocketmq_instance.id
topic = "test_topic"
// create topic
resource "tencentcloud_trocket_rocketmq_topic" "example" {
instance_id = tencentcloud_trocket_rocketmq_instance.example.id
topic = "tf-example"
topic_type = "NORMAL"
queue_num = 4
remark = "test for terraform"
remark = "remark."
}
```

Import

trocket rocketmq_topic can be imported using the id, e.g.
TROCKET rocketmq topic can be imported using the id, e.g.

```
terraform import tencentcloud_trocket_rocketmq_topic.rocketmq_topic instanceId#topic
```
terraform import tencentcloud_trocket_rocketmq_topic.example rmq-1zj5vokgn#tf-example
```
54 changes: 41 additions & 13 deletions tencentcloud/services/trocket/service_tencentcloud_trocket.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package trocket

import (
"context"
"fmt"
"log"

tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
Expand Down Expand Up @@ -91,6 +92,7 @@ func (me *TrocketService) DescribeTrocketRocketmqTopicById(ctx context.Context,
logId := tccommon.GetLogId(ctx)

request := trocket.NewDescribeTopicListRequest()
response := trocket.NewDescribeTopicListResponse()
request.InstanceId = &instanceId
filter := &trocket.Filter{
Name: helper.String("TopicName"),
Expand All @@ -104,26 +106,41 @@ func (me *TrocketService) DescribeTrocketRocketmqTopicById(ctx context.Context,
}
}()

ratelimit.Check(request.GetAction())

var (
offset int64 = 0
limit int64 = 100
offset int64 = 0
limit int64 = 100
instances = make([]*trocket.TopicItem, 0)
)
instances := make([]*trocket.TopicItem, 0)

for {
request.Offset = &offset
request.Limit = &limit
response, err := me.client.UseTrocketClient().DescribeTopicList(request)
ratelimit.Check(request.GetAction())
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
result, e := me.client.UseTrocketClient().DescribeTopicList(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 topicList failed, Response is nil."))
}

response = result
return nil
})

if err != nil {
errRet = err
return
}
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())

if response == nil || len(response.Response.Data) < 1 {
break
}

instances = append(instances, response.Response.Data...)
if len(response.Response.Data) < int(limit) {
break
Expand All @@ -132,10 +149,13 @@ func (me *TrocketService) DescribeTrocketRocketmqTopicById(ctx context.Context,
offset += limit
}

if len(instances) < 1 {
return
for _, item := range instances {
if *item.Topic == topic {
rocketmqTopic = item
break
}
}
rocketmqTopic = instances[0]

return
}

Expand All @@ -152,14 +172,22 @@ func (me *TrocketService) DeleteTrocketRocketmqTopicById(ctx context.Context, in
}
}()

ratelimit.Check(request.GetAction())
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
ratelimit.Check(request.GetAction())
result, e := me.client.UseTrocketClient().DeleteTopic(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())
}

return nil
})

response, err := me.client.UseTrocketClient().DeleteTopic(request)
if err != nil {
errRet = err
return
}
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())

return
}
Expand Down
Loading
Loading