Skip to content

Commit 684674d

Browse files
authored
fix(cdb): [118365336]support ro cross region (#2959)
* fix(cdb): [118365336]support ro cross region * fix: add changelog * fix: modiy client * fix: mysql mz region * fix: modify client
1 parent a80b633 commit 684674d

File tree

5 files changed

+93
-11
lines changed

5 files changed

+93
-11
lines changed

.changelog/2959.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
resource/tencentcloud_mysql_readonly_instance: Supports creating read-only instances across regions.
3+
```

tencentcloud/connectivity/client.go

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -394,10 +394,10 @@ func (me *TencentCloudClient) UseMysqlClient(iacExtInfo ...IacExtInfo) *cdb.Clie
394394
logRoundTripper.InstanceId = iacExtInfo[0].InstanceId
395395
}
396396

397-
if me.mysqlConn != nil {
398-
me.mysqlConn.WithHttpTransport(&logRoundTripper)
399-
return me.mysqlConn
400-
}
397+
// if me.mysqlConn != nil {
398+
// me.mysqlConn.WithHttpTransport(&logRoundTripper)
399+
// return me.mysqlConn
400+
// }
401401

402402
cpf := me.NewClientProfile(300)
403403
me.mysqlConn, _ = cdb.NewClient(me.Credential, me.Region, cpf)
@@ -406,6 +406,23 @@ func (me *TencentCloudClient) UseMysqlClient(iacExtInfo ...IacExtInfo) *cdb.Clie
406406
return me.mysqlConn
407407
}
408408

409+
func (me *TencentCloudClient) UseMysqlClientRegion(region string, iacExtInfo ...IacExtInfo) *cdb.Client {
410+
var logRoundTripper LogRoundTripper
411+
if len(iacExtInfo) != 0 {
412+
logRoundTripper.InstanceId = iacExtInfo[0].InstanceId
413+
}
414+
415+
cpf := me.NewClientProfile(300)
416+
if region != "" {
417+
me.mysqlConn, _ = cdb.NewClient(me.Credential, region, cpf)
418+
} else {
419+
me.mysqlConn, _ = cdb.NewClient(me.Credential, me.Region, cpf)
420+
}
421+
me.mysqlConn.WithHttpTransport(&logRoundTripper)
422+
423+
return me.mysqlConn
424+
}
425+
409426
// UseRedisClient returns redis client for service
410427
func (me *TencentCloudClient) UseRedisClient() *redis.Client {
411428
if me.redisConn != nil {

tencentcloud/services/cdb/resource_tc_mysql_readonly_instance.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func ResourceTencentCloudMysqlReadonlyInstance() *schema.Resource {
4646
Type: schema.TypeString,
4747
Optional: true,
4848
Computed: true,
49-
Description: "Read only group id. If rogroupId is empty, a new ro group is created by default. If it is not empty, the existing ro group is used.",
49+
Description: "Read only group id. If rogroupId is empty, a new ro group is created by default. If it is not empty, the existing ro group is used. Cross-region query requires master instance permission.",
5050
},
5151
}
5252

@@ -216,13 +216,18 @@ func resourceTencentCloudMysqlReadonlyInstanceCreate(d *schema.ResourceData, met
216216
logId := tccommon.GetLogId(tccommon.ContextNil)
217217
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
218218

219-
mysqlService := MysqlService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
219+
client := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
220+
mysqlService := MysqlService{client: client}
220221

221222
// the mysql master instance must have a backup before creating a read-only instance
222223
masterInstanceId := d.Get("master_instance_id").(string)
224+
masterRegion := ""
225+
if v, ok := d.GetOk("master_region"); ok {
226+
masterRegion = v.(string)
227+
}
223228

224229
err := resource.Retry(2*tccommon.ReadRetryTimeout, func() *resource.RetryError {
225-
backups, err := mysqlService.DescribeBackupsByMysqlId(ctx, masterInstanceId, 10)
230+
backups, err := mysqlService.DescribeBackupsByMysqlIdRegion(ctx, masterInstanceId, 10, masterRegion)
226231
if err != nil {
227232
return resource.NonRetryableError(err)
228233
}
@@ -297,6 +302,7 @@ func resourceTencentCloudMysqlReadonlyInstanceRead(d *schema.ResourceData, meta
297302
logId := tccommon.GetLogId(tccommon.ContextNil)
298303
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
299304
mysqlService := MysqlService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
305+
masterRegion := ""
300306
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
301307
mysqlInfo, e := tencentMsyqlBasicInfoRead(ctx, d, meta, false)
302308
if e != nil {
@@ -313,6 +319,7 @@ func resourceTencentCloudMysqlReadonlyInstanceRead(d *schema.ResourceData, meta
313319
_ = d.Set("master_instance_id", *mysqlInfo.MasterInfo.InstanceId)
314320
_ = d.Set("zone", *mysqlInfo.Zone)
315321
_ = d.Set("master_region", *mysqlInfo.MasterInfo.Region)
322+
masterRegion = *mysqlInfo.MasterInfo.Region
316323

317324
return nil
318325
})
@@ -394,7 +401,7 @@ func resourceTencentCloudMysqlReadonlyInstanceRead(d *schema.ResourceData, meta
394401
_ = d.Set("status", mysqlInfo.Status)
395402
_ = d.Set("task_status", mysqlInfo.TaskStatus)
396403

397-
roGroup, err := mysqlService.DescribeRoGroupByIdAndRoId(ctx, *mysqlInfo.MasterInfo.InstanceId, d.Id())
404+
roGroup, err := mysqlService.DescribeRoGroupByIdAndRoId(ctx, masterRegion, *mysqlInfo.MasterInfo.InstanceId, d.Id())
398405
if err != nil {
399406
return err
400407
}

tencentcloud/services/cdb/service_tencentcloud_mysql.go

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,61 @@ needMoreItems:
9898

9999
}
100100

101+
func (me *MysqlService) DescribeBackupsByMysqlIdRegion(ctx context.Context,
102+
mysqlId string,
103+
leftNumber int64, region string) (backupInfos []*cdb.BackupInfo, errRet error) {
104+
105+
logId := tccommon.GetLogId(ctx)
106+
107+
listInitSize := leftNumber
108+
if listInitSize > 500 {
109+
listInitSize = 500
110+
}
111+
backupInfos = make([]*cdb.BackupInfo, 0, listInitSize)
112+
113+
request := cdb.NewDescribeBackupsRequest()
114+
request.InstanceId = &mysqlId
115+
116+
var offset, limit int64 = 0, 50
117+
needMoreItems:
118+
if leftNumber <= 0 {
119+
return
120+
}
121+
if leftNumber < limit {
122+
limit = leftNumber
123+
}
124+
request.Limit = &limit
125+
request.Offset = &offset
126+
defer func() {
127+
if errRet != nil {
128+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
129+
logId, request.GetAction(), request.ToJsonString(), errRet.Error())
130+
}
131+
}()
132+
133+
ratelimit.Check(request.GetAction())
134+
135+
response, err := me.client.UseMysqlClientRegion(region).DescribeBackups(request)
136+
if err != nil {
137+
errRet = err
138+
return
139+
}
140+
141+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
142+
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
143+
144+
totalCount := *response.Response.TotalCount
145+
leftNumber = leftNumber - limit
146+
offset += limit
147+
148+
backupInfos = append(backupInfos, response.Response.Items...)
149+
if leftNumber > 0 && totalCount-offset > 0 {
150+
goto needMoreItems
151+
}
152+
return backupInfos, nil
153+
154+
}
155+
101156
func (me *MysqlService) CreateBackup(ctx context.Context, mysqlId string) (backupId int64, errRet error) {
102157

103158
logId := tccommon.GetLogId(ctx)
@@ -3154,7 +3209,7 @@ func (me *MysqlService) DescribeMysqlRoGroupById(ctx context.Context, instanceId
31543209
return
31553210
}
31563211

3157-
func (me *MysqlService) DescribeRoGroupByIdAndRoId(ctx context.Context, instanceId string, roInstanceId string) (roGroup *cdb.RoGroup, errRet error) {
3212+
func (me *MysqlService) DescribeRoGroupByIdAndRoId(ctx context.Context, region string, instanceId string, roInstanceId string) (roGroup *cdb.RoGroup, errRet error) {
31583213
logId := tccommon.GetLogId(ctx)
31593214

31603215
request := cdb.NewDescribeRoGroupsRequest()
@@ -3168,7 +3223,7 @@ func (me *MysqlService) DescribeRoGroupByIdAndRoId(ctx context.Context, instance
31683223

31693224
ratelimit.Check(request.GetAction())
31703225

3171-
response, err := me.client.UseMysqlClient().DescribeRoGroups(request)
3226+
response, err := me.client.UseMysqlClientRegion(region).DescribeRoGroups(request)
31723227
if err != nil {
31733228
errRet = err
31743229
return

website/docs/r/mysql_readonly_instance.html.markdown

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ The following arguments are supported:
101101
* `pay_type` - (Optional, Int, **Deprecated**) It has been deprecated from version 1.36.0. Please use `charge_type` instead. Pay type of instance. Valid values: `0`, `1`. `0`: prepaid, `1`: postpaid.
102102
* `period` - (Optional, Int, **Deprecated**) It has been deprecated from version 1.36.0. Please use `prepaid_period` instead. Period of instance. NOTES: Only supported prepaid instance.
103103
* `prepaid_period` - (Optional, Int) Period of instance. NOTES: Only supported prepaid instance.
104-
* `ro_group_id` - (Optional, String) Read only group id. If rogroupId is empty, a new ro group is created by default. If it is not empty, the existing ro group is used.
104+
* `ro_group_id` - (Optional, String) Read only group id. If rogroupId is empty, a new ro group is created by default. If it is not empty, the existing ro group is used. Cross-region query requires master instance permission.
105105
* `security_groups` - (Optional, Set: [`String`]) Security groups to use.
106106
* `slave_deploy_mode` - (Optional, Int) Availability zone deployment method. Available values: 0 - Single availability zone; 1 - Multiple availability zones.
107107
* `subnet_id` - (Optional, String) Private network ID. If `vpc_id` is set, this value is required.

0 commit comments

Comments
 (0)