Skip to content
Merged
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
1 change: 1 addition & 0 deletions tencentcloud/basic_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ resource "tencentcloud_mysql_instance" "default" {
engine_version = "5.7"
root_password = "0153Y474"
availability_zone = var.availability_zone
force_delete = true
}
`
const mysqlInstanceHighPerformanceTestCase = defaultVpcVariable + `
Expand Down
19 changes: 13 additions & 6 deletions tencentcloud/resource_tc_mysql_instance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ func testSweepMySQLInstance(region string) error {

request := cdb.NewDescribeDBInstancesRequest()
request.InstanceNames = []*string{
helper.String(defaultInsName),
helper.String(TestAccTencentCloudMysqlInstanceName),
helper.String(TestAccTencentCloudMysqlInstanceNameVersion1),
helper.String(TestAccTencentCloudMysqlInstanceNamePrepaid),
Expand Down Expand Up @@ -309,7 +310,7 @@ func testAccCheckMysqlMasterInstanceExists(n string) resource.TestCheckFunc {
func testAccMysqlMasterInstance_basic() string {
return `
resource "tencentcloud_mysql_instance" "mysql_master" {
pay_type = 1
charge_type = "POSTPAID"
mem_size = 1000
volume_size = 50
instance_name = "testAccMysql"
Expand All @@ -318,6 +319,7 @@ resource "tencentcloud_mysql_instance" "mysql_master" {
intranet_port = 3360
availability_zone = "ap-guangzhou-3"
first_slave_zone = "ap-guangzhou-3"
force_delete = true
}`
}

Expand Down Expand Up @@ -357,7 +359,7 @@ resource "tencentcloud_mysql_instance" "prepaid" {
func testAccMysqlMasterInstance_fullslave() string {
return `
resource "tencentcloud_mysql_instance" "mysql_master" {
pay_type = 1
charge_type = "POSTPAID"
mem_size = 1000
volume_size = 50
instance_name = "testAccMysql"
Expand All @@ -369,6 +371,7 @@ resource "tencentcloud_mysql_instance" "mysql_master" {
first_slave_zone = "ap-guangzhou-3"
second_slave_zone = "ap-guangzhou-3"
slave_sync_mode = 2
force_delete = true
}`
}

Expand All @@ -379,7 +382,7 @@ func testAccMysqlMasterInstance_internet_service(open bool) string {
}
return `
resource "tencentcloud_mysql_instance" "mysql_master" {
pay_type = 1
charge_type = "POSTPAID"
mem_size = 1000
volume_size = 50
instance_name = "testAccMysql"
Expand All @@ -389,14 +392,15 @@ resource "tencentcloud_mysql_instance" "mysql_master" {
availability_zone = "ap-guangzhou-3"
first_slave_zone = "ap-guangzhou-3"
internet_service = ` + tag + `
force_delete = true
}`

}

func testAccMysqlMasterInstance_parameters() string {
return `
resource "tencentcloud_mysql_instance" "mysql_master" {
pay_type = 1
charge_type = "POSTPAID"
mem_size = 1000
volume_size = 50
instance_name = "testAccMysql"
Expand All @@ -405,6 +409,7 @@ resource "tencentcloud_mysql_instance" "mysql_master" {
intranet_port = 3360
availability_zone = "ap-guangzhou-3"
first_slave_zone = "ap-guangzhou-3"
force_delete = true

parameters = {
max_connections = "1000"
Expand All @@ -415,7 +420,7 @@ resource "tencentcloud_mysql_instance" "mysql_master" {
func testAccMysqlMasterInstance_multiTags(value string) string {
return fmt.Sprintf(`
resource "tencentcloud_mysql_instance" "mysql_master" {
pay_type = 1
charge_type = "POSTPAID"
mem_size = 1000
volume_size = 50
instance_name = "testAccMysql"
Expand All @@ -424,6 +429,7 @@ resource "tencentcloud_mysql_instance" "mysql_master" {
intranet_port = 3360
availability_zone = "ap-guangzhou-3"
first_slave_zone = "ap-guangzhou-3"
force_delete = true
tags = {
test = "test-tf"
role = "%s"
Expand All @@ -435,7 +441,7 @@ resource "tencentcloud_mysql_instance" "mysql_master" {
func testAccMysqlMasterInstance_update(instance_name, instranet_port string) string {
tpl := `
resource "tencentcloud_mysql_instance" "mysql_master" {
pay_type = 1
charge_type = "POSTPAID"
mem_size = 1000
volume_size = 50
instance_name = "%s"
Expand All @@ -444,6 +450,7 @@ resource "tencentcloud_mysql_instance" "mysql_master" {
intranet_port = %s
availability_zone = "ap-guangzhou-3"
first_slave_zone = "ap-guangzhou-3"
force_delete = true
}`
return fmt.Sprintf(tpl, instance_name, instranet_port)
}
20 changes: 17 additions & 3 deletions tencentcloud/resource_tc_redis_instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -701,12 +701,26 @@ func resourceTencentCloudRedisInstanceUpdate(d *schema.ResourceData, meta interf
}

if d.HasChange("password") {
password := d.Get("password").(string)
taskId, err := redisService.ResetPassword(ctx, id, password)
var (
taskId int64
password = d.Get("password").(string)
err error
)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个地方为什么要修改哈?

// After redis spec modified, reset password may not successfully response immediately.
err = resource.Retry(writeRetryTimeout, func() *resource.RetryError {
taskId, err = redisService.ResetPassword(ctx, id, password)
if err != nil {
log.Printf("[CRITAL]%s redis change password error, reason:%s\n", logId, err.Error())
return retryError(err, redis.FAILEDOPERATION_SYSTEMERROR)
}
return nil
})

if err != nil {
log.Printf("[CRITAL]%s redis change password error, reason:%s\n", logId, err.Error())
return err
}

err = resource.Retry(2*readRetryTimeout, func() *resource.RetryError {
ok, err := redisService.DescribeTaskInfo(ctx, id, taskId)
if err != nil {
Expand Down
128 changes: 128 additions & 0 deletions tencentcloud/resource_tc_redis_instance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,141 @@ package tencentcloud
import (
"context"
"fmt"
"log"
"strings"
"testing"
"time"

sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"

"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/terraform"
)

func init() {
resource.AddTestSweepers("redis_instance", &resource.Sweeper{
Name: "redis_instance",
F: func(region string) error {
logId := getLogId(contextNil)
ctx := context.WithValue(context.TODO(), logIdKey, logId)
cli, _ := sharedClientForRegion(region)
client := cli.(*TencentCloudClient).apiV3Conn

service := RedisService{client: client}

instances, err := service.DescribeInstances(ctx, "ap-guangzhou-3", "", 0, 0)

if err != nil {
return err
}

for _, v := range instances {
name := v.Name
id := v.RedisId
if !strings.HasPrefix(name, "terrform_test") {
continue
}
// Collect infos before deleting action
var chargeType string
errQuery := resource.Retry(20*readRetryTimeout, func() *resource.RetryError {
has, online, info, err := service.CheckRedisOnlineOk(ctx, id)
if err != nil {
log.Printf("[CRITAL]%s redis querying before deleting fail, reason:%s\n", logId, err.Error())
return resource.NonRetryableError(err)
}
if !has {
return nil
}
if online {
chargeType = REDIS_CHARGE_TYPE_NAME[*info.BillingMode]
return nil
} else {
return resource.RetryableError(fmt.Errorf("Deleting ERROR: Creating redis task is processing."))
}
})
if errQuery != nil {
log.Printf("[CRITAL]%s redis querying before deleting task fail, reason:%s\n", logId, errQuery.Error())
return errQuery
}

var wait = func(action string, taskInfo interface{}) (errRet error) {

errRet = resource.Retry(writeRetryTimeout, func() *resource.RetryError {
var ok bool
var err error
switch v := taskInfo.(type) {
case int64:
ok, err = service.DescribeTaskInfo(ctx, id, v)
case string:
ok, _, err = service.DescribeInstanceDealDetail(ctx, v)
}
if err != nil {
if _, ok := err.(*sdkErrors.TencentCloudSDKError); !ok {
return resource.RetryableError(err)
} else {
return resource.NonRetryableError(err)
}
}
if ok {
return nil
} else {
return resource.RetryableError(fmt.Errorf("%s timeout.", action))
}
})

if errRet != nil {
log.Printf("[CRITAL]%s redis %s fail, reason:%s\n", logId, action, errRet.Error())
}
return errRet
}

if chargeType == REDIS_CHARGE_TYPE_POSTPAID {
taskId, err := service.DestroyPostpaidInstance(ctx, id)
if err != nil {
log.Printf("[CRITAL]%s redis %s fail, reason:%s\n", logId, "DestroyPostpaidInstance", err.Error())
return err
}
if err = wait("DestroyPostpaidInstance", taskId); err != nil {
return err
}

} else {
if _, err := service.DestroyPrepaidInstance(ctx, id); err != nil {
log.Printf("[CRITAL]%s redis %s fail, reason:%s\n", logId, "DestroyPrepaidInstance", err.Error())
return err
}

// Deal info only support create and renew and resize, need to check destroy status by describing api.
if errDestroyChecking := resource.Retry(20*readRetryTimeout, func() *resource.RetryError {
has, isolated, err := service.CheckRedisDestroyOk(ctx, id)
if err != nil {
log.Printf("[CRITAL]%s CheckRedisDestroyOk fail, reason:%s\n", logId, err.Error())
return resource.NonRetryableError(err)
}
if !has || isolated {
return nil
}
return resource.RetryableError(fmt.Errorf("instance is not ready to be destroyed"))
}); errDestroyChecking != nil {
log.Printf("[CRITAL]%s redis querying before deleting task fail, reason:%s\n", logId, errDestroyChecking.Error())
return errDestroyChecking
}
}

taskId, err := service.CleanUpInstance(ctx, id)
if err != nil {
log.Printf("[CRITAL]%s redis %s fail, reason:%s\n", logId, "CleanUpInstance", err.Error())
return err
}

wait("CleanUpInstance", taskId)
}

return nil
},
})
}

func TestAccTencentCloudRedisInstance(t *testing.T) {
t.Parallel()
resource.Test(t, resource.TestCase{
Expand Down
4 changes: 1 addition & 3 deletions tencentcloud/service_tencentcloud_mysql.go
Original file line number Diff line number Diff line change
Expand Up @@ -945,8 +945,7 @@ func (me *MysqlService) InitDBInstances(ctx context.Context, mysqlId, password,
}

paramsMap := map[string]string{
"character_set_server": "LATIN1", // ["utf8","latin1","gbk","utf8mb4"]
"lower_case_table_names": "1", // ["0","1"]
"character_set_server": "LATIN1", // ["utf8","latin1","gbk","utf8mb4"]
}

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

request.Parameters = make([]*cdb.ParamInfo, 0, len(paramsMap))
for k, v := range paramsMap {
name := k
value := v
Expand Down