@@ -5,17 +5,10 @@ Example Usage
55
66```hcl
77resource "tencentcloud_mysql_isolate_instance" "isolate_instance" {
8- instance_id = "cdb-c1nl9rpv"
8+ instance_id = "cdb-1tru99al"
9+ operate = "recover"
910}
1011```
11-
12- Import
13-
14- mysql isolate_instance can be imported using the id, e.g.
15-
16- ```
17- terraform import tencentcloud_mysql_isolate_instance.isolate_instance isolate_instance_id
18- ```
1912*/
2013package tencentcloud
2114
@@ -27,17 +20,17 @@ import (
2720 "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
2821 "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
2922 mysql "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb/v20170320"
23+ "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
3024 "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
3125)
3226
3327func resourceTencentCloudMysqlIsolateInstance () * schema.Resource {
3428 return & schema.Resource {
3529 Create : resourceTencentCloudMysqlIsolateInstanceCreate ,
3630 Read : resourceTencentCloudMysqlIsolateInstanceRead ,
31+ Update : resourceTencentCloudMysqlIsolateInstanceUpdate ,
3732 Delete : resourceTencentCloudMysqlIsolateInstanceDelete ,
38- Importer : & schema.ResourceImporter {
39- State : schema .ImportStatePassthrough ,
40- },
33+
4134 Schema : map [string ]* schema.Schema {
4235 "instance_id" : {
4336 Required : true ,
@@ -46,9 +39,16 @@ func resourceTencentCloudMysqlIsolateInstance() *schema.Resource {
4639 Description : "Instance ID, the format is: cdb-c1nl9rpv, which is the same as the instance ID displayed on the cloud database console page, and you can use the [query instance list] (https://cloud.tencent.com/document/api/236/15872) interface Gets the value of the field InstanceId in the output parameter." ,
4740 },
4841
42+ "operate" : {
43+ Required : true ,
44+ Type : schema .TypeString ,
45+ ValidateFunc : validateAllowedStringValue ([]string {"isolate" , "recover" }),
46+ Description : "Manipulate instance, `isolate` - isolate instance, `recover`- recover isolated instance." ,
47+ },
48+
4949 "status" : {
5050 Computed : true ,
51- Type : schema .TypeString ,
51+ Type : schema .TypeInt ,
5252 Description : "Instance status." ,
5353 },
5454 },
@@ -59,74 +59,28 @@ func resourceTencentCloudMysqlIsolateInstanceCreate(d *schema.ResourceData, meta
5959 defer logElapsed ("resource.tencentcloud_mysql_isolate_instance.create" )()
6060 defer inconsistentCheck (d , meta )()
6161
62- logId := getLogId (contextNil )
63- ctx := context .WithValue (context .TODO (), logIdKey , logId )
64-
65- var (
66- request = mysql .NewIsolateDBInstanceRequest ()
67- response = mysql .NewIsolateDBInstanceResponse ()
68- instanceId string
69- )
62+ var instanceId string
7063 if v , ok := d .GetOk ("instance_id" ); ok {
7164 instanceId = v .(string )
72- request .InstanceId = helper .String (v .(string ))
73- }
74-
75- err := resource .Retry (writeRetryTimeout , func () * resource.RetryError {
76- result , e := meta .(* TencentCloudClient ).apiV3Conn .UseMysqlClient ().IsolateDBInstance (request )
77- if e != nil {
78- return retryError (e )
79- } else {
80- log .Printf ("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n " , logId , request .GetAction (), request .ToJsonString (), result .ToJsonString ())
81- }
82- response = result
83- return nil
84- })
85- if err != nil {
86- log .Printf ("[CRITAL]%s create mysql isolateInstance failed, reason:%+v" , logId , err )
87- return err
8865 }
8966
9067 d .SetId (instanceId )
9168
92- asyncRequestId := * response .Response .AsyncRequestId
93- service := MysqlService {client : meta .(* TencentCloudClient ).apiV3Conn }
94- err = resource .Retry (readRetryTimeout , func () * resource.RetryError {
95- taskStatus , message , err := service .DescribeAsyncRequestInfo (ctx , asyncRequestId )
96- if err != nil {
97- return resource .NonRetryableError (err )
98- }
99- if taskStatus == MYSQL_TASK_STATUS_SUCCESS {
100- return nil
101- }
102- if taskStatus == MYSQL_TASK_STATUS_INITIAL || taskStatus == MYSQL_TASK_STATUS_RUNNING {
103- return resource .RetryableError (fmt .Errorf ("%s create mysql isolateInstance status is %s" , instanceId , taskStatus ))
104- }
105- err = fmt .Errorf ("%s create mysql isolateInstance is %s,we won't wait for it finish ,it show message:%s" , instanceId , taskStatus , message )
106- return resource .NonRetryableError (err )
107- })
108-
109- if err != nil {
110- log .Printf ("[CRITAL]%s create mysql isolateInstance fail, reason:%s\n " , logId , err .Error ())
111- return err
112- }
113-
114- return resourceTencentCloudMysqlIsolateInstanceRead (d , meta )
69+ return resourceTencentCloudMysqlIsolateInstanceUpdate (d , meta )
11570}
11671
11772func resourceTencentCloudMysqlIsolateInstanceRead (d * schema.ResourceData , meta interface {}) error {
11873 defer logElapsed ("resource.tencentcloud_mysql_isolate_instance.read" )()
11974 defer inconsistentCheck (d , meta )()
12075
12176 logId := getLogId (contextNil )
122-
12377 ctx := context .WithValue (context .TODO (), logIdKey , logId )
12478
12579 service := MysqlService {client : meta .(* TencentCloudClient ).apiV3Conn }
12680
12781 instanceId := d .Id ()
12882
129- isolateInstance , err := service .DescribeIsolatedDBInstanceById (ctx , instanceId )
83+ isolateInstance , err := service .DescribeDBInstanceById (ctx , instanceId )
13084 if err != nil {
13185 return err
13286 }
@@ -148,19 +102,103 @@ func resourceTencentCloudMysqlIsolateInstanceRead(d *schema.ResourceData, meta i
148102 return nil
149103}
150104
151- func resourceTencentCloudMysqlIsolateInstanceDelete (d * schema.ResourceData , meta interface {}) error {
152- defer logElapsed ("resource.tencentcloud_mysql_isolate_instance.delete " )()
105+ func resourceTencentCloudMysqlIsolateInstanceUpdate (d * schema.ResourceData , meta interface {}) error {
106+ defer logElapsed ("resource.tencentcloud_mysql_isolate_instance.update " )()
153107 defer inconsistentCheck (d , meta )()
154108
155109 logId := getLogId (contextNil )
156110 ctx := context .WithValue (context .TODO (), logIdKey , logId )
157111
158- service := MysqlService {client : meta .(* TencentCloudClient ).apiV3Conn }
159112 instanceId := d .Id ()
160113
161- if err := service .DeleteMysqlIsolateInstanceById (ctx , instanceId ); err != nil {
162- return err
114+ var operate string
115+ if v , ok := d .GetOk ("operate" ); ok {
116+ operate = v .(string )
117+ }
118+
119+ if operate == "isolate" {
120+ request := mysql .NewIsolateDBInstanceRequest ()
121+ request .InstanceId = helper .String (instanceId )
122+ err := resource .Retry (writeRetryTimeout , func () * resource.RetryError {
123+ result , e := meta .(* TencentCloudClient ).apiV3Conn .UseMysqlClient ().IsolateDBInstance (request )
124+ if e != nil {
125+ return retryError (e )
126+ } else {
127+ log .Printf ("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n " , logId , request .GetAction (), request .ToJsonString (), result .ToJsonString ())
128+ }
129+ return nil
130+ })
131+ if err != nil {
132+ log .Printf ("[CRITAL]%s create mysql isolateInstance failed, reason:%+v" , logId , err )
133+ return err
134+ }
135+
136+ service := MysqlService {client : meta .(* TencentCloudClient ).apiV3Conn }
137+ err = resource .Retry (7 * readRetryTimeout , func () * resource.RetryError {
138+ mysqlInfo , err := service .DescribeDBInstanceById (ctx , instanceId )
139+
140+ if err != nil {
141+ if _ , ok := err .(* errors.TencentCloudSDKError ); ! ok {
142+ return resource .RetryableError (err )
143+ } else {
144+ return resource .NonRetryableError (err )
145+ }
146+ }
147+ if mysqlInfo == nil {
148+ return nil
149+ }
150+ if * mysqlInfo .Status == MYSQL_STATUS_ISOLATING || * mysqlInfo .Status == MYSQL_STATUS_RUNNING {
151+ return resource .RetryableError (fmt .Errorf ("mysql isolating." ))
152+ }
153+ if * mysqlInfo .Status == MYSQL_STATUS_ISOLATED {
154+ return nil
155+ }
156+ return resource .NonRetryableError (fmt .Errorf ("after IsolateDBInstance mysql Status is %d" , * mysqlInfo .Status ))
157+ })
158+
159+ if err != nil {
160+ log .Printf ("[CRITAL]%s Isolate mysql isolateInstance fail, reason:%s\n " , logId , err .Error ())
161+ return err
162+ }
163+ } else if operate == "recover" {
164+ service := MysqlService {client : meta .(* TencentCloudClient ).apiV3Conn }
165+ if err := service .DeleteMysqlIsolateInstanceById (ctx , instanceId ); err != nil {
166+ return err
167+ }
168+ err := resource .Retry (7 * readRetryTimeout , func () * resource.RetryError {
169+ mysqlInfo , err := service .DescribeDBInstanceById (ctx , instanceId )
170+
171+ if err != nil {
172+ if _ , ok := err .(* errors.TencentCloudSDKError ); ! ok {
173+ return resource .RetryableError (err )
174+ } else {
175+ return resource .NonRetryableError (err )
176+ }
177+ }
178+ if mysqlInfo == nil {
179+ return nil
180+ }
181+ if * mysqlInfo .Status == MYSQL_STATUS_ISOLATED {
182+ return resource .RetryableError (fmt .Errorf ("mysql recovering." ))
183+ }
184+ if * mysqlInfo .Status == MYSQL_STATUS_RUNNING {
185+ return nil
186+ }
187+ return resource .NonRetryableError (fmt .Errorf ("after ReleaseIsolatedDBInstances mysql Status is %d" , * mysqlInfo .Status ))
188+ })
189+
190+ if err != nil {
191+ log .Printf ("[CRITAL]%s ReleaseIsolatedDBInstances mysql fail, reason:%s\n " , logId , err .Error ())
192+ return err
193+ }
163194 }
164195
196+ return resourceTencentCloudMysqlIsolateInstanceRead (d , meta )
197+ }
198+
199+ func resourceTencentCloudMysqlIsolateInstanceDelete (d * schema.ResourceData , meta interface {}) error {
200+ defer logElapsed ("resource.tencentcloud_mysql_isolate_instance.delete" )()
201+ defer inconsistentCheck (d , meta )()
202+
165203 return nil
166204}
0 commit comments