diff --git a/.changelog/3425.txt b/.changelog/3425.txt new file mode 100644 index 0000000000..b26b9e53f3 --- /dev/null +++ b/.changelog/3425.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_trocket_rocketmq_topic: optmize read function code logic +``` diff --git a/tencentcloud/services/trocket/resource_tc_trocket_rocketmq_topic.go b/tencentcloud/services/trocket/resource_tc_trocket_rocketmq_topic.go index 94c8ea3028..9bd32e2999 100644 --- a/tencentcloud/services/trocket/resource_tc_trocket_rocketmq_topic.go +++ b/tencentcloud/services/trocket/resource_tc_trocket_rocketmq_topic.go @@ -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.", }, }, @@ -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)) } @@ -100,18 +100,27 @@ 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) } @@ -119,16 +128,17 @@ func resourceTencentCloudTrocketRocketmqTopicRead(d *schema.ResourceData, meta i 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] @@ -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 } @@ -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) @@ -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] diff --git a/tencentcloud/services/trocket/resource_tc_trocket_rocketmq_topic.md b/tencentcloud/services/trocket/resource_tc_trocket_rocketmq_topic.md index d8005be4fb..5e4f7b32ce 100644 --- a/tencentcloud/services/trocket/resource_tc_trocket_rocketmq_topic.md +++ b/tencentcloud/services/trocket/resource_tc_trocket_rocketmq_topic.md @@ -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 -``` \ No newline at end of file +terraform import tencentcloud_trocket_rocketmq_topic.example rmq-1zj5vokgn#tf-example +``` diff --git a/tencentcloud/services/trocket/service_tencentcloud_trocket.go b/tencentcloud/services/trocket/service_tencentcloud_trocket.go index d8b2c836a6..1ee436ea3c 100644 --- a/tencentcloud/services/trocket/service_tencentcloud_trocket.go +++ b/tencentcloud/services/trocket/service_tencentcloud_trocket.go @@ -2,6 +2,7 @@ package trocket import ( "context" + "fmt" "log" tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" @@ -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"), @@ -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 @@ -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 } @@ -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 } diff --git a/website/docs/r/trocket_rocketmq_topic.html.markdown b/website/docs/r/trocket_rocketmq_topic.html.markdown index c974bc5c26..e7b380fa57 100644 --- a/website/docs/r/trocket_rocketmq_topic.html.markdown +++ b/website/docs/r/trocket_rocketmq_topic.html.markdown @@ -4,35 +4,56 @@ layout: "tencentcloud" page_title: "TencentCloud: tencentcloud_trocket_rocketmq_topic" sidebar_current: "docs-tencentcloud-resource-trocket_rocketmq_topic" description: |- - Provides a resource to create a trocket rocketmq_topic + Provides a resource to create a TROCKET rocketmq topic --- # tencentcloud_trocket_rocketmq_topic -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" +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 = "rocketmq" - tag_value = "5.x" + 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." } ``` @@ -56,9 +77,9 @@ In addition to all arguments above, the following attributes are exported: ## 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 ```