Skip to content

Commit 57d2064

Browse files
authored
Feat/support dcdb feature (#1865)
* support dcdb: config resource * support dcdb: hourdb instance related operation resource * 1.add changelog. 2.adjust dcn logic for the hourdb and prepaid instance. * e2e case * fix golangci-lint issues * add docs * support dcdb: operation resource * adjust dcn logic
1 parent ac5359e commit 57d2064

21 files changed

+919
-37
lines changed

.changelog/1865.txt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
```release-note:new-resource
2+
tencentcloud_dcdb_activate_hour_instance_operation
3+
```
4+
5+
```release-note:new-resource
6+
tencentcloud_dcdb_isolate_hour_instance_operation
7+
```
8+
9+
```release-note:new-resource
10+
tencentcloud_dcdb_cancel_dcn_job_operation
11+
```
12+
13+
```release-note:enhancement
14+
resource/tencentcloud_dcdb_hourdb_instance: support `dcn_region` and `dcn_instance_id` fields.
15+
```
16+
17+
```release-note:enhancement
18+
resource/tencentcloud_dcdb_db_instance: optimize the processing logic of dcn.
19+
```

tencentcloud/basic_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,26 @@ const (
838838
defaultDcdbSGName = "default"
839839
)
840840

841+
// ref with `local.dcdb_id`
842+
const CommonPresetDcdb = `
843+
844+
variable "availability_zone" {
845+
default = "` + defaultAZone + `"
846+
}
847+
variable "region" {
848+
default = "` + defaultRegion + `"
849+
}
850+
851+
data "tencentcloud_dcdb_instances" "dcdb" {
852+
search_name = "instancename"
853+
search_key = "` + defaultDcdbInstanceName + `"
854+
}
855+
856+
locals {
857+
dcdb_id = data.tencentcloud_dcdb_instances.dcdb.list.0.instance_id
858+
}
859+
`
860+
841861
// End of DCDB
842862
// SES
843863
const (

tencentcloud/extension_dcdb.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package tencentcloud
2+
3+
const (
4+
DCDB_DCN_FLAG_MASTER = 1
5+
DCDB_DCN_FLAG_SLAVE = 2
6+
)

tencentcloud/provider.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1111,6 +1111,9 @@ TDSQL for MySQL(DCDB)
11111111
tencentcloud_dcdb_db_parameters
11121112
tencentcloud_dcdb_db_sync_mode_config
11131113
tencentcloud_dcdb_encrypt_attributes_config
1114+
tencentcloud_dcdb_cancel_dcn_job_operation
1115+
tencentcloud_dcdb_activate_hour_instance_operation
1116+
tencentcloud_dcdb_isolate_hour_instance_operation
11141117
11151118
Short Message Service(SMS)
11161119
Resource
@@ -2418,6 +2421,9 @@ func Provider() *schema.Provider {
24182421
"tencentcloud_dcdb_db_parameters": resourceTencentCloudDcdbDbParameters(),
24192422
"tencentcloud_dcdb_encrypt_attributes_config": resourceTencentCloudDcdbEncryptAttributesConfig(),
24202423
"tencentcloud_dcdb_db_sync_mode_config": resourceTencentCloudDcdbDbSyncModeConfig(),
2424+
"tencentcloud_dcdb_activate_hour_instance_operation": resourceTencentCloudDcdbActivateHourInstanceOperation(),
2425+
"tencentcloud_dcdb_isolate_hour_instance_operation": resourceTencentCloudDcdbIsolateHourInstanceOperation(),
2426+
"tencentcloud_dcdb_cancel_dcn_job_operation": resourceTencentCloudDcdbCancelDcnJobOperation(),
24212427
"tencentcloud_cat_task_set": resourceTencentCloudCatTaskSet(),
24222428
"tencentcloud_mariadb_dedicatedcluster_db_instance": resourceTencentCloudMariadbDedicatedclusterDbInstance(),
24232429
"tencentcloud_mariadb_instance": resourceTencentCloudMariadbInstance(),

tencentcloud/resource_tc_dcdb_account.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"fmt"
3030
"log"
3131
"strings"
32+
"time"
3233

3334
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
3435
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -241,7 +242,30 @@ func resourceTencentCloudDcdbAccountUpdate(d *schema.ResourceData, meta interfac
241242
}
242243

243244
if d.HasChange("password") {
244-
return fmt.Errorf("`password` do not support change now.")
245+
// return fmt.Errorf("`password` do not support change now.")
246+
if v, ok := d.GetOk("password"); ok {
247+
request := dcdb.NewResetAccountPasswordRequest()
248+
request.InstanceId = &instanceId
249+
request.UserName = &userName
250+
if v, ok := d.GetOk("host"); ok {
251+
request.Host = helper.String(v.(string))
252+
}
253+
request.Password = helper.String(v.(string))
254+
255+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
256+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseDcdbClient().ResetAccountPassword(request)
257+
if e != nil {
258+
return retryError(e)
259+
} else {
260+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
261+
}
262+
return nil
263+
})
264+
if err != nil {
265+
log.Printf("[CRITAL]%s operate dcdb resetAccountPasswordOperation failed, reason:%+v", logId, err)
266+
return err
267+
}
268+
}
245269
}
246270

247271
if d.HasChange("read_only") {
@@ -307,5 +331,10 @@ func resourceTencentCloudDcdbAccountDelete(d *schema.ResourceData, meta interfac
307331
return err
308332
}
309333

334+
conf := BuildStateChangeConf([]string{}, []string{"deleted"}, readRetryTimeout, time.Second, service.DcdbAccountRefreshFunc(instanceId, userName, []string{}))
335+
if _, e := conf.WaitForState(); e != nil {
336+
return e
337+
}
338+
310339
return nil
311340
}

tencentcloud/resource_tc_dcdb_account_test.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"strings"
77
"testing"
8+
"time"
89

910
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1011
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
@@ -47,20 +48,20 @@ func testSweepDCDBAccount(r string) error {
4748
return nil
4849
}
4950

50-
func TestAcc_NOT_Ready_TencentCloudDCDBAccountResource(t *testing.T) {
51+
func TestAccTencentCloudDcdbAccountResource_basic(t *testing.T) {
5152
t.Parallel()
52-
53+
timestamp := time.Now().Nanosecond()
5354
resource.Test(t, resource.TestCase{
5455
PreCheck: func() { testAccPreCheck(t) },
5556
Providers: testAccProviders,
5657
CheckDestroy: testAccCheckDcdbAccountDestroy,
5758
Steps: []resource.TestStep{
5859
{
59-
Config: fmt.Sprintf(testAccDcdbAccount_basic, defaultDcdbInstanceId),
60+
Config: fmt.Sprintf(testAccDcdbAccount_basic, defaultDcdbInstanceId, timestamp),
6061
Check: resource.ComposeTestCheckFunc(
6162
testAccCheckDcdbAccountExists("tencentcloud_dcdb_account.basic"),
6263
resource.TestCheckResourceAttrSet("tencentcloud_dcdb_account.basic", "instance_id"),
63-
resource.TestCheckResourceAttr("tencentcloud_dcdb_account.basic", "user_name", "mysql"),
64+
resource.TestCheckResourceAttrSet("tencentcloud_dcdb_account.basic", "user_name"),
6465
resource.TestCheckResourceAttr("tencentcloud_dcdb_account.basic", "host", "127.0.0.1"),
6566
resource.TestCheckResourceAttr("tencentcloud_dcdb_account.basic", "password", "===password==="),
6667
resource.TestCheckResourceAttr("tencentcloud_dcdb_account.basic", "description", "this is a test account"),
@@ -69,12 +70,13 @@ func TestAcc_NOT_Ready_TencentCloudDCDBAccountResource(t *testing.T) {
6970
),
7071
},
7172
{
72-
Config: fmt.Sprintf(testAccDcdbAccount_update, defaultDcdbInstanceId),
73+
Config: fmt.Sprintf(testAccDcdbAccount_update, defaultDcdbInstanceId, timestamp),
7374
Check: resource.ComposeTestCheckFunc(
7475
testAccCheckDcdbAccountExists("tencentcloud_dcdb_account.basic"),
7576
resource.TestCheckResourceAttrSet("tencentcloud_dcdb_account.basic", "instance_id"),
76-
resource.TestCheckResourceAttr("tencentcloud_dcdb_account.basic", "user_name", "mysql"),
77+
resource.TestCheckResourceAttrSet("tencentcloud_dcdb_account.basic", "user_name"),
7778
resource.TestCheckResourceAttr("tencentcloud_dcdb_account.basic", "host", "127.0.0.1"),
79+
resource.TestCheckResourceAttr("tencentcloud_dcdb_account.basic", "password", "===password===updated==="),
7880
resource.TestCheckResourceAttr("tencentcloud_dcdb_account.basic", "description", "this is a changed test account"),
7981
resource.TestCheckResourceAttr("tencentcloud_dcdb_account.basic", "read_only", "0"),
8082
),
@@ -104,7 +106,7 @@ func testAccCheckDcdbAccountDestroy(s *terraform.State) error {
104106
if err != nil {
105107
return err
106108
}
107-
if account.Users != nil && len(account.Users) > 0 {
109+
if account != nil && len(account.Users) > 0 {
108110
return fmt.Errorf("dcdb account still exists: %s", rs.Primary.ID)
109111
}
110112
}
@@ -143,7 +145,7 @@ const testAccDcdbAccount_basic = `
143145
144146
resource "tencentcloud_dcdb_account" "basic" {
145147
instance_id = "%s"
146-
user_name = "mysql"
148+
user_name = "mysql_%d"
147149
host = "127.0.0.1"
148150
password = "===password==="
149151
read_only = 0
@@ -156,9 +158,9 @@ const testAccDcdbAccount_update = `
156158
157159
resource "tencentcloud_dcdb_account" "basic" {
158160
instance_id = "%s"
159-
user_name = "mysql"
161+
user_name = "mysql_%d"
160162
host = "127.0.0.1"
161-
password = "===password==="
163+
password = "===password===updated==="
162164
read_only = 0
163165
description = "this is a changed test account"
164166
max_user_connections = 10
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/*
2+
Provides a resource to create a dcdb activate_hour_instance_operation
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_dcdb_activate_hour_instance_operation" "activate_hour_instance_operation" {
8+
instance_id = local.dcdb_id
9+
}
10+
```
11+
*/
12+
package tencentcloud
13+
14+
import (
15+
"log"
16+
17+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
18+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
19+
dcdb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dcdb/v20180411"
20+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
21+
)
22+
23+
func resourceTencentCloudDcdbActivateHourInstanceOperation() *schema.Resource {
24+
return &schema.Resource{
25+
Create: resourceTencentCloudDcdbActivateHourInstanceOperationCreate,
26+
Read: resourceTencentCloudDcdbActivateHourInstanceOperationRead,
27+
Delete: resourceTencentCloudDcdbActivateHourInstanceOperationDelete,
28+
Schema: map[string]*schema.Schema{
29+
"instance_id": {
30+
Required: true,
31+
ForceNew: true,
32+
Type: schema.TypeString,
33+
Description: "instance ID in the format of dcdbt-ow728lmc, which can be obtained through the `DescribeDCDBInstances` API.",
34+
},
35+
},
36+
}
37+
}
38+
39+
func resourceTencentCloudDcdbActivateHourInstanceOperationCreate(d *schema.ResourceData, meta interface{}) error {
40+
defer logElapsed("resource.tencentcloud_dcdb_activate_hour_instance_operation.create")()
41+
defer inconsistentCheck(d, meta)()
42+
43+
logId := getLogId(contextNil)
44+
45+
var (
46+
request = dcdb.NewActiveHourDCDBInstanceRequest()
47+
instanceId string
48+
)
49+
if v, ok := d.GetOk("instance_id"); ok {
50+
instanceId = v.(string)
51+
request.InstanceIds = []*string{helper.String(instanceId)}
52+
}
53+
54+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
55+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseDcdbClient().ActiveHourDCDBInstance(request)
56+
if e != nil {
57+
return retryError(e)
58+
} else {
59+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
60+
}
61+
return nil
62+
})
63+
if err != nil {
64+
log.Printf("[CRITAL]%s operate dcdb activateHourInstanceOperation failed, reason:%+v", logId, err)
65+
return err
66+
}
67+
68+
d.SetId(instanceId)
69+
70+
return resourceTencentCloudDcdbActivateHourInstanceOperationRead(d, meta)
71+
}
72+
73+
func resourceTencentCloudDcdbActivateHourInstanceOperationRead(d *schema.ResourceData, meta interface{}) error {
74+
defer logElapsed("resource.tencentcloud_dcdb_activate_hour_instance_operation.read")()
75+
defer inconsistentCheck(d, meta)()
76+
77+
return nil
78+
}
79+
80+
func resourceTencentCloudDcdbActivateHourInstanceOperationDelete(d *schema.ResourceData, meta interface{}) error {
81+
defer logElapsed("resource.tencentcloud_dcdb_activate_hour_instance_operation.delete")()
82+
defer inconsistentCheck(d, meta)()
83+
84+
return nil
85+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package tencentcloud
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
8+
)
9+
10+
func TestAccTencentCloudDcdbActivateHourInstanceOperationResource_basic(t *testing.T) {
11+
t.Parallel()
12+
resource.Test(t, resource.TestCase{
13+
PreCheck: func() {
14+
testAccPreCheck(t)
15+
},
16+
Providers: testAccProviders,
17+
Steps: []resource.TestStep{
18+
{
19+
Config: fmt.Sprintf(testAccDcdbIsolateHourInstanceOperation, "oper_isolate"),
20+
Check: resource.ComposeTestCheckFunc(
21+
resource.TestCheckResourceAttrSet("tencentcloud_dcdb_isolate_hour_instance_operation.isolate_operation", "id"),
22+
resource.TestCheckResourceAttrSet("tencentcloud_dcdb_isolate_hour_instance_operation.isolate_operation", "instance_id"),
23+
),
24+
},
25+
{
26+
Config: fmt.Sprintf(testAccDcdbActivateHourInstanceOperation, "oper_isolate"),
27+
Check: resource.ComposeTestCheckFunc(
28+
resource.TestCheckResourceAttrSet("tencentcloud_dcdb_activate_hour_instance_operation.activate_operation", "id"),
29+
resource.TestCheckResourceAttrSet("tencentcloud_dcdb_activate_hour_instance_operation.activate_operation", "instance_id"),
30+
),
31+
},
32+
},
33+
})
34+
}
35+
36+
const testAccDcdbHourInsOperation = defaultAzVariable + `
37+
data "tencentcloud_security_groups" "internal" {
38+
name = "default"
39+
}
40+
41+
data "tencentcloud_vpc_instances" "vpc" {
42+
name ="Default-VPC"
43+
}
44+
45+
data "tencentcloud_vpc_subnets" "subnet" {
46+
vpc_id = data.tencentcloud_vpc_instances.vpc.instance_list.0.vpc_id
47+
}
48+
49+
locals {
50+
vpc_id = data.tencentcloud_vpc_subnets.subnet.instance_list.0.vpc_id
51+
subnet_id = data.tencentcloud_vpc_subnets.subnet.instance_list.0.subnet_id
52+
sg_id = data.tencentcloud_security_groups.internal.security_groups.0.security_group_id
53+
}
54+
55+
resource "tencentcloud_dcdb_hourdb_instance" "hourdb_instance" {
56+
instance_name = "test_dcdb_db_hourdb_instance_%s"
57+
zones = [var.default_az]
58+
shard_memory = "2"
59+
shard_storage = "10"
60+
shard_node_count = "2"
61+
shard_count = "2"
62+
vpc_id = local.vpc_id
63+
subnet_id = local.subnet_id
64+
security_group_id = local.sg_id
65+
db_version_id = "8.0"
66+
resource_tags {
67+
tag_key = "aaa"
68+
tag_value = "bbb"
69+
}
70+
}
71+
72+
locals {
73+
dcdb_id = tencentcloud_dcdb_hourdb_instance.hourdb_instance.id
74+
}
75+
`
76+
77+
const testAccDcdbActivateHourInstanceOperation = testAccDcdbHourInsOperation + `
78+
79+
resource "tencentcloud_dcdb_activate_hour_instance_operation" "activate_operation" {
80+
instance_id = local.dcdb_id
81+
}
82+
83+
`
84+
85+
const testAccDcdbIsolateHourInstanceOperation = testAccDcdbHourInsOperation + `
86+
87+
resource "tencentcloud_dcdb_isolate_hour_instance_operation" "isolate_operation" {
88+
instance_id = local.dcdb_id
89+
}
90+
91+
`

0 commit comments

Comments
 (0)