Skip to content

Commit f39ea1b

Browse files
authored
fix: mysql init and redis retry password reset (#904)
* fix: mysql init and redis retry password reset * fix: redis reset pwd retry and comment
1 parent 8974ade commit f39ea1b

File tree

5 files changed

+160
-12
lines changed

5 files changed

+160
-12
lines changed

tencentcloud/basic_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ resource "tencentcloud_mysql_instance" "default" {
147147
engine_version = "5.7"
148148
root_password = "0153Y474"
149149
availability_zone = var.availability_zone
150+
force_delete = true
150151
}
151152
`
152153
const mysqlInstanceHighPerformanceTestCase = defaultVpcVariable + `

tencentcloud/resource_tc_mysql_instance_test.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ func testSweepMySQLInstance(region string) error {
3737

3838
request := cdb.NewDescribeDBInstancesRequest()
3939
request.InstanceNames = []*string{
40+
helper.String(defaultInsName),
4041
helper.String(TestAccTencentCloudMysqlInstanceName),
4142
helper.String(TestAccTencentCloudMysqlInstanceNameVersion1),
4243
helper.String(TestAccTencentCloudMysqlInstanceNamePrepaid),
@@ -309,7 +310,7 @@ func testAccCheckMysqlMasterInstanceExists(n string) resource.TestCheckFunc {
309310
func testAccMysqlMasterInstance_basic() string {
310311
return `
311312
resource "tencentcloud_mysql_instance" "mysql_master" {
312-
pay_type = 1
313+
charge_type = "POSTPAID"
313314
mem_size = 1000
314315
volume_size = 50
315316
instance_name = "testAccMysql"
@@ -318,6 +319,7 @@ resource "tencentcloud_mysql_instance" "mysql_master" {
318319
intranet_port = 3360
319320
availability_zone = "ap-guangzhou-3"
320321
first_slave_zone = "ap-guangzhou-3"
322+
force_delete = true
321323
}`
322324
}
323325

@@ -357,7 +359,7 @@ resource "tencentcloud_mysql_instance" "prepaid" {
357359
func testAccMysqlMasterInstance_fullslave() string {
358360
return `
359361
resource "tencentcloud_mysql_instance" "mysql_master" {
360-
pay_type = 1
362+
charge_type = "POSTPAID"
361363
mem_size = 1000
362364
volume_size = 50
363365
instance_name = "testAccMysql"
@@ -369,6 +371,7 @@ resource "tencentcloud_mysql_instance" "mysql_master" {
369371
first_slave_zone = "ap-guangzhou-3"
370372
second_slave_zone = "ap-guangzhou-3"
371373
slave_sync_mode = 2
374+
force_delete = true
372375
}`
373376
}
374377

@@ -379,7 +382,7 @@ func testAccMysqlMasterInstance_internet_service(open bool) string {
379382
}
380383
return `
381384
resource "tencentcloud_mysql_instance" "mysql_master" {
382-
pay_type = 1
385+
charge_type = "POSTPAID"
383386
mem_size = 1000
384387
volume_size = 50
385388
instance_name = "testAccMysql"
@@ -389,14 +392,15 @@ resource "tencentcloud_mysql_instance" "mysql_master" {
389392
availability_zone = "ap-guangzhou-3"
390393
first_slave_zone = "ap-guangzhou-3"
391394
internet_service = ` + tag + `
395+
force_delete = true
392396
}`
393397

394398
}
395399

396400
func testAccMysqlMasterInstance_parameters() string {
397401
return `
398402
resource "tencentcloud_mysql_instance" "mysql_master" {
399-
pay_type = 1
403+
charge_type = "POSTPAID"
400404
mem_size = 1000
401405
volume_size = 50
402406
instance_name = "testAccMysql"
@@ -405,6 +409,7 @@ resource "tencentcloud_mysql_instance" "mysql_master" {
405409
intranet_port = 3360
406410
availability_zone = "ap-guangzhou-3"
407411
first_slave_zone = "ap-guangzhou-3"
412+
force_delete = true
408413
409414
parameters = {
410415
max_connections = "1000"
@@ -415,7 +420,7 @@ resource "tencentcloud_mysql_instance" "mysql_master" {
415420
func testAccMysqlMasterInstance_multiTags(value string) string {
416421
return fmt.Sprintf(`
417422
resource "tencentcloud_mysql_instance" "mysql_master" {
418-
pay_type = 1
423+
charge_type = "POSTPAID"
419424
mem_size = 1000
420425
volume_size = 50
421426
instance_name = "testAccMysql"
@@ -424,6 +429,7 @@ resource "tencentcloud_mysql_instance" "mysql_master" {
424429
intranet_port = 3360
425430
availability_zone = "ap-guangzhou-3"
426431
first_slave_zone = "ap-guangzhou-3"
432+
force_delete = true
427433
tags = {
428434
test = "test-tf"
429435
role = "%s"
@@ -435,7 +441,7 @@ resource "tencentcloud_mysql_instance" "mysql_master" {
435441
func testAccMysqlMasterInstance_update(instance_name, instranet_port string) string {
436442
tpl := `
437443
resource "tencentcloud_mysql_instance" "mysql_master" {
438-
pay_type = 1
444+
charge_type = "POSTPAID"
439445
mem_size = 1000
440446
volume_size = 50
441447
instance_name = "%s"
@@ -444,6 +450,7 @@ resource "tencentcloud_mysql_instance" "mysql_master" {
444450
intranet_port = %s
445451
availability_zone = "ap-guangzhou-3"
446452
first_slave_zone = "ap-guangzhou-3"
453+
force_delete = true
447454
}`
448455
return fmt.Sprintf(tpl, instance_name, instranet_port)
449456
}

tencentcloud/resource_tc_redis_instance.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -701,12 +701,26 @@ func resourceTencentCloudRedisInstanceUpdate(d *schema.ResourceData, meta interf
701701
}
702702

703703
if d.HasChange("password") {
704-
password := d.Get("password").(string)
705-
taskId, err := redisService.ResetPassword(ctx, id, password)
704+
var (
705+
taskId int64
706+
password = d.Get("password").(string)
707+
err error
708+
)
709+
710+
// After redis spec modified, reset password may not successfully response immediately.
711+
err = resource.Retry(writeRetryTimeout, func() *resource.RetryError {
712+
taskId, err = redisService.ResetPassword(ctx, id, password)
713+
if err != nil {
714+
log.Printf("[CRITAL]%s redis change password error, reason:%s\n", logId, err.Error())
715+
return retryError(err, redis.FAILEDOPERATION_SYSTEMERROR)
716+
}
717+
return nil
718+
})
719+
706720
if err != nil {
707-
log.Printf("[CRITAL]%s redis change password error, reason:%s\n", logId, err.Error())
708721
return err
709722
}
723+
710724
err = resource.Retry(2*readRetryTimeout, func() *resource.RetryError {
711725
ok, err := redisService.DescribeTaskInfo(ctx, id, taskId)
712726
if err != nil {

tencentcloud/resource_tc_redis_instance_test.go

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,141 @@ package tencentcloud
33
import (
44
"context"
55
"fmt"
6+
"log"
7+
"strings"
68
"testing"
79
"time"
810

11+
sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
12+
913
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
1014
"github.com/hashicorp/terraform-plugin-sdk/terraform"
1115
)
1216

17+
func init() {
18+
resource.AddTestSweepers("redis_instance", &resource.Sweeper{
19+
Name: "redis_instance",
20+
F: func(region string) error {
21+
logId := getLogId(contextNil)
22+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
23+
cli, _ := sharedClientForRegion(region)
24+
client := cli.(*TencentCloudClient).apiV3Conn
25+
26+
service := RedisService{client: client}
27+
28+
instances, err := service.DescribeInstances(ctx, "ap-guangzhou-3", "", 0, 0)
29+
30+
if err != nil {
31+
return err
32+
}
33+
34+
for _, v := range instances {
35+
name := v.Name
36+
id := v.RedisId
37+
if !strings.HasPrefix(name, "terrform_test") {
38+
continue
39+
}
40+
// Collect infos before deleting action
41+
var chargeType string
42+
errQuery := resource.Retry(20*readRetryTimeout, func() *resource.RetryError {
43+
has, online, info, err := service.CheckRedisOnlineOk(ctx, id)
44+
if err != nil {
45+
log.Printf("[CRITAL]%s redis querying before deleting fail, reason:%s\n", logId, err.Error())
46+
return resource.NonRetryableError(err)
47+
}
48+
if !has {
49+
return nil
50+
}
51+
if online {
52+
chargeType = REDIS_CHARGE_TYPE_NAME[*info.BillingMode]
53+
return nil
54+
} else {
55+
return resource.RetryableError(fmt.Errorf("Deleting ERROR: Creating redis task is processing."))
56+
}
57+
})
58+
if errQuery != nil {
59+
log.Printf("[CRITAL]%s redis querying before deleting task fail, reason:%s\n", logId, errQuery.Error())
60+
return errQuery
61+
}
62+
63+
var wait = func(action string, taskInfo interface{}) (errRet error) {
64+
65+
errRet = resource.Retry(writeRetryTimeout, func() *resource.RetryError {
66+
var ok bool
67+
var err error
68+
switch v := taskInfo.(type) {
69+
case int64:
70+
ok, err = service.DescribeTaskInfo(ctx, id, v)
71+
case string:
72+
ok, _, err = service.DescribeInstanceDealDetail(ctx, v)
73+
}
74+
if err != nil {
75+
if _, ok := err.(*sdkErrors.TencentCloudSDKError); !ok {
76+
return resource.RetryableError(err)
77+
} else {
78+
return resource.NonRetryableError(err)
79+
}
80+
}
81+
if ok {
82+
return nil
83+
} else {
84+
return resource.RetryableError(fmt.Errorf("%s timeout.", action))
85+
}
86+
})
87+
88+
if errRet != nil {
89+
log.Printf("[CRITAL]%s redis %s fail, reason:%s\n", logId, action, errRet.Error())
90+
}
91+
return errRet
92+
}
93+
94+
if chargeType == REDIS_CHARGE_TYPE_POSTPAID {
95+
taskId, err := service.DestroyPostpaidInstance(ctx, id)
96+
if err != nil {
97+
log.Printf("[CRITAL]%s redis %s fail, reason:%s\n", logId, "DestroyPostpaidInstance", err.Error())
98+
return err
99+
}
100+
if err = wait("DestroyPostpaidInstance", taskId); err != nil {
101+
return err
102+
}
103+
104+
} else {
105+
if _, err := service.DestroyPrepaidInstance(ctx, id); err != nil {
106+
log.Printf("[CRITAL]%s redis %s fail, reason:%s\n", logId, "DestroyPrepaidInstance", err.Error())
107+
return err
108+
}
109+
110+
// Deal info only support create and renew and resize, need to check destroy status by describing api.
111+
if errDestroyChecking := resource.Retry(20*readRetryTimeout, func() *resource.RetryError {
112+
has, isolated, err := service.CheckRedisDestroyOk(ctx, id)
113+
if err != nil {
114+
log.Printf("[CRITAL]%s CheckRedisDestroyOk fail, reason:%s\n", logId, err.Error())
115+
return resource.NonRetryableError(err)
116+
}
117+
if !has || isolated {
118+
return nil
119+
}
120+
return resource.RetryableError(fmt.Errorf("instance is not ready to be destroyed"))
121+
}); errDestroyChecking != nil {
122+
log.Printf("[CRITAL]%s redis querying before deleting task fail, reason:%s\n", logId, errDestroyChecking.Error())
123+
return errDestroyChecking
124+
}
125+
}
126+
127+
taskId, err := service.CleanUpInstance(ctx, id)
128+
if err != nil {
129+
log.Printf("[CRITAL]%s redis %s fail, reason:%s\n", logId, "CleanUpInstance", err.Error())
130+
return err
131+
}
132+
133+
wait("CleanUpInstance", taskId)
134+
}
135+
136+
return nil
137+
},
138+
})
139+
}
140+
13141
func TestAccTencentCloudRedisInstance(t *testing.T) {
14142
t.Parallel()
15143
resource.Test(t, resource.TestCase{

tencentcloud/service_tencentcloud_mysql.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -945,8 +945,7 @@ func (me *MysqlService) InitDBInstances(ctx context.Context, mysqlId, password,
945945
}
946946

947947
paramsMap := map[string]string{
948-
"character_set_server": "LATIN1", // ["utf8","latin1","gbk","utf8mb4"]
949-
"lower_case_table_names": "1", // ["0","1"]
948+
"character_set_server": "LATIN1", // ["utf8","latin1","gbk","utf8mb4"]
950949
}
951950

952951
if charset != "" {
@@ -957,7 +956,6 @@ func (me *MysqlService) InitDBInstances(ctx context.Context, mysqlId, password,
957956
paramsMap["lower_case_table_names"] = lowerCase // ["0","1"]
958957
}
959958

960-
request.Parameters = make([]*cdb.ParamInfo, 0, len(paramsMap))
961959
for k, v := range paramsMap {
962960
name := k
963961
value := v

0 commit comments

Comments
 (0)