Skip to content

Commit 9c1cb7a

Browse files
authored
Feat/support dts resource (#1845)
* update node pool import doc * add code * add docs * fix typo * update doc
1 parent 0d4a956 commit 9c1cb7a

14 files changed

+2720
-34
lines changed

.changelog/1845.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
```release-note:new-resource
2+
tencentcloud_dts_sync_config
3+
```
4+
5+
```release-note:new-data-source
6+
tencentcloud_dts_migrate_db_instances
7+
```
8+
9+
```release-note:enhancement
10+
resource/tencentcloud_cynosdb_cluster: adjust the delete logic
11+
```
Lines changed: 254 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,254 @@
1+
/*
2+
Use this data source to query detailed information of dts migrate_db_instances
3+
4+
Example Usage
5+
6+
```hcl
7+
data "tencentcloud_dts_migrate_db_instances" "migrate_db_instances" {
8+
database_type = "mysql"
9+
migrate_role = "src"
10+
instance_id = "cdb-ffulb2sg"
11+
instance_name = "cdb_test"
12+
limit = 10
13+
offset = 10
14+
account_mode = "self"
15+
tmp_secret_id = "AKIDvBDyVmna9TadcS4YzfBZmkU5TbX12345"
16+
tmp_secret_key = "ZswjGWWHm24qMeiX6QUJsELDpC12345"
17+
tmp_token = "JOqqCPVuWdNZvlVDLxxx"
18+
}
19+
```
20+
*/
21+
package tencentcloud
22+
23+
import (
24+
"context"
25+
26+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
27+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
28+
dts "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dts/v20211206"
29+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
30+
)
31+
32+
func dataSourceTencentCloudDtsMigrateDbInstances() *schema.Resource {
33+
return &schema.Resource{
34+
Read: dataSourceTencentCloudDtsMigrateDbInstancesRead,
35+
Schema: map[string]*schema.Schema{
36+
"database_type": {
37+
Required: true,
38+
Type: schema.TypeString,
39+
Description: "Database type.",
40+
},
41+
42+
"migrate_role": {
43+
Optional: true,
44+
Type: schema.TypeString,
45+
Description: "Whether the instance is the migration source or destination,src(for source), dst(for destination).",
46+
},
47+
48+
"instance_id": {
49+
Optional: true,
50+
Type: schema.TypeString,
51+
Description: "Database instance id.",
52+
},
53+
54+
"instance_name": {
55+
Optional: true,
56+
Type: schema.TypeString,
57+
Description: "Database instance name.",
58+
},
59+
60+
"limit": {
61+
Optional: true,
62+
Type: schema.TypeInt,
63+
Description: "Limit.",
64+
},
65+
66+
"offset": {
67+
Optional: true,
68+
Type: schema.TypeInt,
69+
Description: "Offset.",
70+
},
71+
72+
"account_mode": {
73+
Optional: true,
74+
Type: schema.TypeString,
75+
Description: "The owning account of the resource is null or self(resources in the self account), other(resources in the other account).",
76+
},
77+
78+
"tmp_secret_id": {
79+
Optional: true,
80+
Type: schema.TypeString,
81+
Description: "temporary secret id, used across account.",
82+
},
83+
84+
"tmp_secret_key": {
85+
Optional: true,
86+
Type: schema.TypeString,
87+
Description: "temporary secret key, used across account.",
88+
},
89+
90+
"tmp_token": {
91+
Optional: true,
92+
Type: schema.TypeString,
93+
Description: "temporary token, used across account.",
94+
},
95+
96+
"instances": {
97+
Computed: true,
98+
Type: schema.TypeList,
99+
Description: "Instance list.",
100+
Elem: &schema.Resource{
101+
Schema: map[string]*schema.Schema{
102+
"instance_id": {
103+
Type: schema.TypeString,
104+
Computed: true,
105+
Description: "Instance Id.",
106+
},
107+
"instance_name": {
108+
Type: schema.TypeString,
109+
Computed: true,
110+
Description: "Database instance name.",
111+
},
112+
"vip": {
113+
Type: schema.TypeString,
114+
Computed: true,
115+
Description: "Instance vip.",
116+
},
117+
"vport": {
118+
Type: schema.TypeInt,
119+
Computed: true,
120+
Description: "Instance port.",
121+
},
122+
"usable": {
123+
Type: schema.TypeInt,
124+
Computed: true,
125+
Description: "Can used in migration, 1-yes, 0-no.",
126+
},
127+
"hint": {
128+
Type: schema.TypeString,
129+
Computed: true,
130+
Description: "The reason of can't used in migration.",
131+
},
132+
},
133+
},
134+
},
135+
136+
"request_id": {
137+
Computed: true,
138+
Type: schema.TypeString,
139+
Description: "Unique request id, provide this when encounter a problem.",
140+
},
141+
142+
"result_output_file": {
143+
Type: schema.TypeString,
144+
Optional: true,
145+
Description: "Used to save results.",
146+
},
147+
},
148+
}
149+
}
150+
151+
func dataSourceTencentCloudDtsMigrateDbInstancesRead(d *schema.ResourceData, meta interface{}) error {
152+
defer logElapsed("data_source.tencentcloud_dts_migrate_db_instances.read")()
153+
defer inconsistentCheck(d, meta)()
154+
155+
logId := getLogId(contextNil)
156+
157+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
158+
159+
paramMap := make(map[string]interface{})
160+
if v, ok := d.GetOk("database_type"); ok {
161+
paramMap["DatabaseType"] = helper.String(v.(string))
162+
}
163+
164+
if v, ok := d.GetOk("migrate_role"); ok {
165+
paramMap["MigrateRole"] = helper.String(v.(string))
166+
}
167+
168+
if v, ok := d.GetOk("instance_id"); ok {
169+
paramMap["InstanceId"] = helper.String(v.(string))
170+
}
171+
172+
if v, ok := d.GetOk("instance_name"); ok {
173+
paramMap["InstanceName"] = helper.String(v.(string))
174+
}
175+
176+
if v, ok := d.GetOk("account_mode"); ok {
177+
paramMap["AccountMode"] = helper.String(v.(string))
178+
}
179+
180+
if v, ok := d.GetOk("tmp_secret_id"); ok {
181+
paramMap["TmpSecretId"] = helper.String(v.(string))
182+
}
183+
184+
if v, ok := d.GetOk("tmp_secret_key"); ok {
185+
paramMap["TmpSecretKey"] = helper.String(v.(string))
186+
}
187+
188+
if v, ok := d.GetOk("tmp_token"); ok {
189+
paramMap["TmpToken"] = helper.String(v.(string))
190+
}
191+
192+
service := DtsService{client: meta.(*TencentCloudClient).apiV3Conn}
193+
194+
var instances []*dts.MigrateDBItem
195+
196+
err := resource.Retry(readRetryTimeout, func() *resource.RetryError {
197+
result, e := service.DescribeDtsMigrateDbInstancesByFilter(ctx, paramMap)
198+
if e != nil {
199+
return retryError(e)
200+
}
201+
instances = result
202+
return nil
203+
})
204+
if err != nil {
205+
return err
206+
}
207+
208+
ids := make([]string, 0, len(instances))
209+
tmpList := make([]map[string]interface{}, 0, len(instances))
210+
211+
if instances != nil {
212+
for _, migrateDBItem := range instances {
213+
migrateDBItemMap := map[string]interface{}{}
214+
215+
if migrateDBItem.InstanceId != nil {
216+
migrateDBItemMap["instance_id"] = migrateDBItem.InstanceId
217+
}
218+
219+
if migrateDBItem.InstanceName != nil {
220+
migrateDBItemMap["instance_name"] = migrateDBItem.InstanceName
221+
}
222+
223+
if migrateDBItem.Vip != nil {
224+
migrateDBItemMap["vip"] = migrateDBItem.Vip
225+
}
226+
227+
if migrateDBItem.Vport != nil {
228+
migrateDBItemMap["vport"] = migrateDBItem.Vport
229+
}
230+
231+
if migrateDBItem.Usable != nil {
232+
migrateDBItemMap["usable"] = migrateDBItem.Usable
233+
}
234+
235+
if migrateDBItem.Hint != nil {
236+
migrateDBItemMap["hint"] = migrateDBItem.Hint
237+
}
238+
239+
ids = append(ids, *migrateDBItem.InstanceId)
240+
tmpList = append(tmpList, migrateDBItemMap)
241+
}
242+
243+
_ = d.Set("instances", tmpList)
244+
}
245+
246+
d.SetId(helper.DataResourceIdsHash(ids))
247+
output, ok := d.GetOk("result_output_file")
248+
if ok && output.(string) != "" {
249+
if e := writeToFile(output.(string), tmpList); e != nil {
250+
return e
251+
}
252+
}
253+
return nil
254+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package tencentcloud
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
func TestAccTencentCloudDtsMigrateDbInstancesDataSource_basic(t *testing.T) {
10+
t.Parallel()
11+
resource.Test(t, resource.TestCase{
12+
PreCheck: func() {
13+
testAccPreCheck(t)
14+
},
15+
Providers: testAccProviders,
16+
Steps: []resource.TestStep{
17+
{
18+
Config: testAccDtsMigrateDbInstancesDataSource,
19+
Check: resource.ComposeTestCheckFunc(
20+
testAccCheckTencentCloudDataSourceID("data.tencentcloud_dts_migrate_db_instances.migrate_db_instances")),
21+
},
22+
},
23+
})
24+
}
25+
26+
const testAccDtsMigrateDbInstancesDataSource = CommonPresetMysql + `
27+
28+
data "tencentcloud_dts_migrate_db_instances" "migrate_db_instances" {
29+
database_type = "mysql"
30+
migrate_role = "src"
31+
instance_id = local.mysql_id
32+
instance_name = "test"
33+
account_mode = "self"
34+
tmp_secret_id = "AKIDvBDyVmna9TadcS4YzfBZmkU5TbX12345"
35+
tmp_secret_key = "ZswjGWWHm24qMeiX6QUJsELDpC12345"
36+
tmp_token = "JOqqCPVuWdNZvlVDLxxx"
37+
}
38+
39+
`

tencentcloud/provider.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1194,6 +1194,7 @@ Data Transmission Service(DTS)
11941194
tencentcloud_dts_sync_jobs
11951195
tencentcloud_dts_migrate_jobs
11961196
tencentcloud_dts_compare_tasks
1197+
tencentcloud_dts_migrate_db_instances
11971198
11981199
Resource
11991200
tencentcloud_dts_sync_job
@@ -1204,6 +1205,7 @@ Data Transmission Service(DTS)
12041205
tencentcloud_dts_migrate_job_resume_operation
12051206
tencentcloud_dts_compare_task_stop_operation
12061207
tencentcloud_dts_migrate_job_config
1208+
tencentcloud_dts_sync_config
12071209
12081210
TDMQ for RocketMQ(trocket)
12091211
Data Source
@@ -1805,6 +1807,7 @@ func Provider() *schema.Provider {
18051807
"tencentcloud_dts_sync_jobs": dataSourceTencentCloudDtsSyncJobs(),
18061808
"tencentcloud_dts_compare_tasks": dataSourceTencentCloudDtsCompareTasks(),
18071809
"tencentcloud_dts_migrate_jobs": dataSourceTencentCloudDtsMigrateJobs(),
1810+
"tencentcloud_dts_migrate_db_instances": dataSourceTencentCloudDtsMigrateDbInstances(),
18081811
"tencentcloud_tdmq_rocketmq_cluster": dataSourceTencentCloudTdmqRocketmqCluster(),
18091812
"tencentcloud_tdmq_rocketmq_namespace": dataSourceTencentCloudTdmqRocketmqNamespace(),
18101813
"tencentcloud_tdmq_rocketmq_topic": dataSourceTencentCloudTdmqRocketmqTopic(),
@@ -2344,6 +2347,7 @@ func Provider() *schema.Provider {
23442347
"tencentcloud_rum_whitelist": resourceTencentCloudRumWhitelist(),
23452348
"tencentcloud_rum_offline_log_config_attachment": resourceTencentCloudRumOfflineLogConfigAttachment(),
23462349
"tencentcloud_dts_sync_job": resourceTencentCloudDtsSyncJob(),
2350+
"tencentcloud_dts_sync_config": resourceTencentCloudDtsSyncConfig(),
23472351
"tencentcloud_tdmq_rocketmq_cluster": resourceTencentCloudTdmqRocketmqCluster(),
23482352
"tencentcloud_tdmq_rocketmq_namespace": resourceTencentCloudTdmqRocketmqNamespace(),
23492353
"tencentcloud_tdmq_rocketmq_role": resourceTencentCloudTdmqRocketmqRole(),

tencentcloud/resource_tc_cynosdb_cluster.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ import (
6464
"context"
6565
"fmt"
6666
"log"
67+
"time"
6768

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

@@ -220,6 +221,11 @@ func resourceTencentCloudCynosdbClusterCreate(d *schema.ResourceData, meta inter
220221
dealRes, err = meta.(*TencentCloudClient).apiV3Conn.UseCynosdbClient().DescribeResourcesByDealName(dealReq)
221222
if err != nil {
222223
log.Printf("[CRITAL]%s api[%s] fail, reason:%s", logId, request.GetAction(), err.Error())
224+
if sdkErr, ok := err.(*sdkErrors.TencentCloudSDKError); ok {
225+
if sdkErr.Code == "InvalidParameterValue.DealNameNotFound" {
226+
return resource.RetryableError(fmt.Errorf("DealName[%s] Not Found, retry... reason: %s", *dealName, err.Error()))
227+
}
228+
}
223229
return retryError(err)
224230
}
225231
return nil
@@ -742,10 +748,22 @@ func resourceTencentCloudCynosdbClusterDelete(d *schema.ResourceData, meta inter
742748
return err
743749
}
744750

751+
conf := BuildStateChangeConf([]string{}, []string{"isolated"}, 2*readRetryTimeout, time.Second, cynosdbService.CynosdbInstanceIsolateStateRefreshFunc(d.Id(), []string{}))
752+
753+
if _, e := conf.WaitForState(); e != nil {
754+
return e
755+
}
756+
745757
if forceDelete {
746758
if err = cynosdbService.OfflineCluster(ctx, clusterID); err != nil {
747759
return err
748760
}
761+
762+
conf := BuildStateChangeConf([]string{}, []string{"offlined"}, 2*readRetryTimeout, time.Second, cynosdbService.CynosdbInstanceOfflineStateRefreshFunc(d.Id(), []string{}))
763+
764+
if _, e := conf.WaitForState(); e != nil {
765+
return e
766+
}
749767
}
750768

751769
return nil

0 commit comments

Comments
 (0)