Skip to content

Commit caa6061

Browse files
authored
feat: mysql - support retry with client token (#1330)
* feat: mysql - support retry with client token * changelog 1330 * fix: mysql shadowed response leads to npe * fix: mysql - testcase names format * fix: mysql - set client token retry auto * fix: mysql - rename testcase fn
1 parent 667d227 commit caa6061

11 files changed

+56
-22
lines changed

.changelog/1330.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
resource/tencentcloud_mysql_instance: Support retry creating with client token
3+
```

tencentcloud/data_source_tc_mysql_backup_list_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
77
)
88

9-
func TestAccDataSourceMysqlBackupList_basic(t *testing.T) {
9+
func TestAccDataSourceMysqlBackupListDataSource_basic(t *testing.T) {
1010
t.Parallel()
1111
resource.Test(t, resource.TestCase{
1212
PreCheck: func() { testAccPreCheck(t) },

tencentcloud/data_source_tc_mysql_default_params_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
77
)
88

9-
func TestAccTencentCloudDataSourceMysqlDefaultParams(t *testing.T) {
9+
func TestAccTencentCloudDataSourceMysqlDefaultParamsDataSource(t *testing.T) {
1010
t.Parallel()
1111
resource.Test(t, resource.TestCase{
1212
PreCheck: func() { testAccPreCheck(t) },

tencentcloud/data_source_tc_mysql_zone_config_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
77
)
88

9-
func TestAccDataSourceMysqlZoneConfig_basic(t *testing.T) {
9+
func TestAccDataSourceMysqlZoneConfigDataSource_basic(t *testing.T) {
1010
t.Parallel()
1111

1212
resource.Test(t, resource.TestCase{

tencentcloud/resource_tc_mysql_account_privilege_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
sdkError "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
1414
)
1515

16-
func TestAccTencentCloudMysqlAccountPrivilege(t *testing.T) {
16+
func TestAccTencentCloudMysqlAccountPrivilegeResource(t *testing.T) {
1717
t.Parallel()
1818
resource.Test(t, resource.TestCase{
1919
PreCheck: func() { testAccPreCheck(t) },

tencentcloud/resource_tc_mysql_account_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ func init() {
7777
})
7878
}
7979

80-
func TestAccTencentCloudMysqlAccountResource(t *testing.T) {
80+
func TestAccTencentCloudMysqlAccountResource_basic(t *testing.T) {
8181
t.Parallel()
8282
resource.Test(t, resource.TestCase{
8383
PreCheck: func() { testAccPreCheck(t) },

tencentcloud/resource_tc_mysql_backup_policy_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
1111
)
1212

13-
func TestAccTencentCloudMysqlBackupPolicy(t *testing.T) {
13+
func TestAccTencentCloudMysqlBackupPolicyResource_basic(t *testing.T) {
1414
t.Parallel()
1515

1616
resource.Test(t, resource.TestCase{

tencentcloud/resource_tc_mysql_instance.go

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,6 @@ func TencentMsyqlBasicInfo() map[string]*schema.Schema {
195195
Optional: true,
196196
Description: "Instance tags.",
197197
},
198-
199198
"force_delete": {
200199
Type: schema.TypeBool,
201200
Optional: true,
@@ -557,6 +556,8 @@ func mysqlCreateInstancePayByMonth(ctx context.Context, d *schema.ResourceData,
557556
logId := getLogId(ctx)
558557

559558
request := cdb.NewCreateDBInstanceRequest()
559+
clientToken := helper.BuildToken()
560+
request.ClientToken = &clientToken
560561

561562
payType, oldOk := d.GetOkExists("pay_type")
562563
var period int
@@ -578,15 +579,30 @@ func mysqlCreateInstancePayByMonth(ctx context.Context, d *schema.ResourceData,
578579
return err
579580
}
580581

581-
response, err := meta.(*TencentCloudClient).apiV3Conn.UseMysqlClient().CreateDBInstance(request)
582+
var response *cdb.CreateDBInstanceResponse
583+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
584+
// shadowed response will not pass to outside
585+
r, inErr := meta.(*TencentCloudClient).apiV3Conn.UseMysqlClient().CreateDBInstance(request)
586+
if inErr != nil {
587+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
588+
logId, request.GetAction(), request.ToJsonString(), inErr.Error())
589+
return retryError(inErr)
590+
}
591+
592+
if response.Response.InstanceIds == nil && clientToken != "" {
593+
return resource.RetryableError(fmt.Errorf("%s returns nil instanceIds but client token provided, retrying", request.GetAction()))
594+
}
595+
596+
response = r
597+
598+
return nil
599+
})
600+
582601
if err != nil {
583-
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
584-
logId, request.GetAction(), request.ToJsonString(), err.Error())
585602
return err
586-
} else {
587-
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
588-
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
589603
}
604+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
605+
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
590606
if len(response.Response.InstanceIds) != 1 {
591607
return fmt.Errorf("mysql CreateDBInstance return len(InstanceIds) is not 1,but %d", len(response.Response.InstanceIds))
592608
}
@@ -598,6 +614,8 @@ func mysqlCreateInstancePayByUse(ctx context.Context, d *schema.ResourceData, me
598614

599615
logId := getLogId(ctx)
600616
request := cdb.NewCreateDBInstanceHourRequest()
617+
clientToken := helper.BuildToken()
618+
request.ClientToken = &clientToken
601619

602620
if err := mysqlAllInstanceRoleSet(ctx, request, d, meta); err != nil {
603621
return err
@@ -607,15 +625,28 @@ func mysqlCreateInstancePayByUse(ctx context.Context, d *schema.ResourceData, me
607625
return err
608626
}
609627

610-
response, err := meta.(*TencentCloudClient).apiV3Conn.UseMysqlClient().CreateDBInstanceHour(request)
628+
var response *cdb.CreateDBInstanceHourResponse
629+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
630+
// shadowed response will not pass to outside
631+
r, inErr := meta.(*TencentCloudClient).apiV3Conn.UseMysqlClient().CreateDBInstanceHour(request)
632+
if inErr != nil {
633+
return retryError(inErr)
634+
}
635+
if r.Response.InstanceIds == nil && clientToken != "" {
636+
return resource.RetryableError(fmt.Errorf("%s returns nil instanceIds but client token provided, retrying", request.GetAction()))
637+
}
638+
response = r
639+
return nil
640+
})
611641
if err != nil {
612642
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
613643
logId, request.GetAction(), request.ToJsonString(), err.Error())
614644
return err
615-
} else {
616-
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
617-
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
618645
}
646+
647+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
648+
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
649+
619650
if len(response.Response.InstanceIds) != 1 {
620651
return fmt.Errorf("mysql CreateDBInstanceHour return len(InstanceIds) is not 1,but %d", len(response.Response.InstanceIds))
621652
}

tencentcloud/resource_tc_mysql_instance_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func testSweepMySQLInstance(region string) error {
9595
return nil
9696
}
9797

98-
func TestAccTencentCloudMysqlDeviceType(t *testing.T) {
98+
func TestAccTencentCloudMysqlInstanceResource_DeviceType(t *testing.T) {
9999
resource.Test(t, resource.TestCase{
100100
PreCheck: func() { testAccPreCheck(t) },
101101
Providers: testAccProviders,
@@ -125,7 +125,7 @@ func TestAccTencentCloudMysqlDeviceType(t *testing.T) {
125125
})
126126
}
127127

128-
func TestAccTencentCloudMysqlMasterInstance_fullslave(t *testing.T) {
128+
func TestAccTencentCloudMysqlInstanceResource_MasterInstance_fullslave(t *testing.T) {
129129
resource.Test(t, resource.TestCase{
130130
PreCheck: func() { testAccPreCheck(t) },
131131
Providers: testAccProviders,
@@ -147,7 +147,7 @@ func TestAccTencentCloudMysqlMasterInstance_fullslave(t *testing.T) {
147147
})
148148
}
149149

150-
func TestAccTencentCloudMysqlMasterInstance_basic_and_update(t *testing.T) {
150+
func TestAccTencentCloudMysqlInstanceResource_MasterInstance_basic_and_update(t *testing.T) {
151151
resource.Test(t, resource.TestCase{
152152
PreCheck: func() { testAccPreCheck(t) },
153153
Providers: testAccProviders,

tencentcloud/resource_tc_mysql_privilege_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import (
1818
var testAccTencentCloudMysqlPrivilegeType = "tencentcloud_mysql_privilege"
1919
var testAccTencentCloudMysqlPrivilegeName = testAccTencentCloudMysqlPrivilegeType + ".privilege"
2020

21-
func TestAccTencentCloudMysqlPrivilege(t *testing.T) {
21+
func TestAccTencentCloudMysqlPrivilegeResource(t *testing.T) {
2222
t.Parallel()
2323
resource.Test(t, resource.TestCase{
2424
PreCheck: func() { testAccPreCheck(t) },

0 commit comments

Comments
 (0)