diff --git a/.changelog/2707.txt b/.changelog/2707.txt new file mode 100644 index 0000000000..85214c0bfa --- /dev/null +++ b/.changelog/2707.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_apm_instance: add retry operator +``` diff --git a/tencentcloud/services/apm/resource_tc_apm_instance.go b/tencentcloud/services/apm/resource_tc_apm_instance.go index 6b1a9668bc..78ea9806d9 100644 --- a/tencentcloud/services/apm/resource_tc_apm_instance.go +++ b/tencentcloud/services/apm/resource_tc_apm_instance.go @@ -68,13 +68,13 @@ func resourceTencentCloudApmInstanceCreate(d *schema.ResourceData, meta interfac defer tccommon.LogElapsed("resource.tencentcloud_apm_instance.create")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - var ( + logId = tccommon.GetLogId(tccommon.ContextNil) request = apm.NewCreateApmInstanceRequest() response = apm.NewCreateApmInstanceResponse() instanceId string ) + if v, ok := d.GetOk("name"); ok { request.Name = helper.String(v.(string)) } @@ -102,9 +102,11 @@ func resourceTencentCloudApmInstanceCreate(d *schema.ResourceData, meta interfac } else { log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) } + response = result return nil }) + if err != nil { log.Printf("[CRITAL]%s create apm instance failed, reason:%+v", logId, err) return err @@ -130,15 +132,24 @@ func resourceTencentCloudApmInstanceRead(d *schema.ResourceData, meta interface{ defer tccommon.LogElapsed("resource.tencentcloud_apm_instance.read")() 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 = ApmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + instance *apm.ApmInstanceDetail + instanceId = d.Id() + ) - service := ApmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + result, err := service.DescribeApmInstanceById(ctx, instanceId) + if err != nil { + return tccommon.RetryError(err) + } - instanceId := d.Id() + instance = result + return nil + }) - instance, err := service.DescribeApmInstanceById(ctx, instanceId) if err != nil { return err } @@ -184,18 +195,16 @@ func resourceTencentCloudApmInstanceUpdate(d *schema.ResourceData, meta interfac defer tccommon.LogElapsed("resource.tencentcloud_apm_instance.update")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - - request := apm.NewModifyApmInstanceRequest() + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + request = apm.NewModifyApmInstanceRequest() + instanceId = d.Id() + ) needChange := false - - instanceId := d.Id() - request.InstanceId = &instanceId mutableArgs := []string{"name", "description", "trace_duration", "span_daily_counters", "pay_mode"} - for _, v := range mutableArgs { if d.HasChange(v) { needChange = true @@ -204,7 +213,6 @@ func resourceTencentCloudApmInstanceUpdate(d *schema.ResourceData, meta interfac } if needChange { - if v, ok := d.GetOk("name"); ok { request.Name = helper.String(v.(string)) } @@ -232,13 +240,14 @@ func resourceTencentCloudApmInstanceUpdate(d *schema.ResourceData, meta interfac } 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 apm instance failed, reason:%+v", logId, err) return err } - } if d.HasChange("tags") { @@ -260,11 +269,12 @@ func resourceTencentCloudApmInstanceDelete(d *schema.ResourceData, meta interfac defer tccommon.LogElapsed("resource.tencentcloud_apm_instance.delete")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - service := ApmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} - instanceId := d.Id() + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = ApmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + instanceId = d.Id() + ) if err := service.DeleteApmInstanceById(ctx, instanceId); err != nil { return err diff --git a/tencentcloud/services/apm/resource_tc_apm_instance.md b/tencentcloud/services/apm/resource_tc_apm_instance.md index c2ad72996e..f8d8674afa 100644 --- a/tencentcloud/services/apm/resource_tc_apm_instance.md +++ b/tencentcloud/services/apm/resource_tc_apm_instance.md @@ -5,13 +5,13 @@ Provides a resource to create a apm instance Example Usage ```hcl -resource "tencentcloud_apm_instance" "instance" { - name = "terraform-test" - description = "for terraform test" - trace_duration = 15 - span_daily_counters = 20 +resource "tencentcloud_apm_instance" "example" { + name = "tf-example" + description = "desc." + trace_duration = 15 + span_daily_counters = 0 tags = { - "createdBy" = "terraform" + createdBy = "terraform" } } ``` @@ -21,5 +21,5 @@ Import apm instance can be imported using the id, e.g. ``` -terraform import tencentcloud_apm_instance.instance instance_id -``` \ No newline at end of file +terraform import tencentcloud_apm_instance.example apm-IMVrxXl1K +``` diff --git a/tencentcloud/services/apm/resource_tc_apm_instance_test.go b/tencentcloud/services/apm/resource_tc_apm_instance_test.go index dcccd6923a..a72d6295cf 100644 --- a/tencentcloud/services/apm/resource_tc_apm_instance_test.go +++ b/tencentcloud/services/apm/resource_tc_apm_instance_test.go @@ -8,6 +8,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) +// go test -i; go test -test.run TestAccTencentCloudApmInstanceResource_basic -v func TestAccTencentCloudApmInstanceResource_basic(t *testing.T) { t.Parallel() resource.Test(t, resource.TestCase{ @@ -18,17 +19,26 @@ func TestAccTencentCloudApmInstanceResource_basic(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccApmInstance, - Check: resource.ComposeTestCheckFunc(resource.TestCheckResourceAttrSet("tencentcloud_apm_instance.instance", "id")), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_apm_instance.example", "id"), + resource.TestCheckResourceAttr("tencentcloud_apm_instance.example", "name", "tf-example"), + resource.TestCheckResourceAttr("tencentcloud_apm_instance.example", "description", "desc."), + resource.TestCheckResourceAttr("tencentcloud_apm_instance.example", "trace_duration", "15"), + resource.TestCheckResourceAttr("tencentcloud_apm_instance.example", "span_daily_counters", "20"), + ), }, { Config: testAccApmInstanceUpdate, Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttrSet("tencentcloud_apm_instance.instance", "id"), - resource.TestCheckResourceAttr("tencentcloud_apm_instance.instance", "name", "terraform-for-test"), + resource.TestCheckResourceAttrSet("tencentcloud_apm_instance.example", "id"), + resource.TestCheckResourceAttr("tencentcloud_apm_instance.example", "name", "tf-example-update"), + resource.TestCheckResourceAttr("tencentcloud_apm_instance.example", "description", "desc update."), + resource.TestCheckResourceAttr("tencentcloud_apm_instance.example", "trace_duration", "15"), + resource.TestCheckResourceAttr("tencentcloud_apm_instance.example", "span_daily_counters", "20"), ), }, { - ResourceName: "tencentcloud_apm_instance.instance", + ResourceName: "tencentcloud_apm_instance.example", ImportState: true, ImportStateVerify: true, }, @@ -37,23 +47,25 @@ func TestAccTencentCloudApmInstanceResource_basic(t *testing.T) { } const testAccApmInstance = ` - -resource "tencentcloud_apm_instance" "instance" { - name = "terraform-test" - description = "for terraform test" - trace_duration = 15 - span_daily_counters = 20 +resource "tencentcloud_apm_instance" "example" { + name = "tf-example" + description = "desc." + trace_duration = 15 + span_daily_counters = 0 + tags = { + createdBy = "terraform" + } } - ` const testAccApmInstanceUpdate = ` - -resource "tencentcloud_apm_instance" "instance" { - name = "terraform-for-test" - description = "for terraform test" - trace_duration = 15 - span_daily_counters = 20 +resource "tencentcloud_apm_instance" "example" { + name = "tf-example-update" + description = "desc update." + trace_duration = 15 + span_daily_counters = 0 + tags = { + createdBy = "terraform" + } } - ` diff --git a/website/docs/r/apm_instance.html.markdown b/website/docs/r/apm_instance.html.markdown index 0f3fe5187d..67fb593024 100644 --- a/website/docs/r/apm_instance.html.markdown +++ b/website/docs/r/apm_instance.html.markdown @@ -16,13 +16,13 @@ Provides a resource to create a apm instance ## Example Usage ```hcl -resource "tencentcloud_apm_instance" "instance" { - name = "terraform-test" - description = "for terraform test" +resource "tencentcloud_apm_instance" "example" { + name = "tf-example" + description = "desc." trace_duration = 15 - span_daily_counters = 20 + span_daily_counters = 0 tags = { - "createdBy" = "terraform" + createdBy = "terraform" } } ``` @@ -51,6 +51,6 @@ In addition to all arguments above, the following attributes are exported: apm instance can be imported using the id, e.g. ``` -terraform import tencentcloud_apm_instance.instance instance_id +terraform import tencentcloud_apm_instance.example apm-IMVrxXl1K ```