Skip to content

Commit 8f1dfe8

Browse files
authored
fix(tcr): [134541193] tencentcloud_tcr_instance optimize code logic for update and delete function (#4132)
* add * add
1 parent 1cc74ae commit 8f1dfe8

4 files changed

Lines changed: 103 additions & 30 deletions

File tree

.changelog/4132.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_tcr_instance: optimize code logic for update and delete function
3+
```

tencentcloud/services/tcr/resource_tc_tcr_instance.go

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ func ResourceTencentCloudTcrInstance() *schema.Resource {
148148
Optional: true,
149149
Computed: true,
150150
ForceNew: true,
151-
Description: "Whether to enable COS bucket versioning. Default is `false`.",
151+
Description: "Whether to enable COS bucket versioning. Advanced Edition Instances: Default is `true` (versioning enabled); Standard / Basic Edition Instances: Default is `false` (disabled).",
152152
},
153153
//Computed values
154154
"status": {
@@ -609,21 +609,10 @@ func resourceTencentCloudTcrInstanceUpdate(d *schema.ResourceData, meta interfac
609609

610610
}
611611

612-
if d.HasChange("instance_type") || d.HasChange("deletion_protection") {
613-
var (
614-
instanceType string
615-
deletionProtection bool
616-
)
617-
618-
if d.HasChange("instance_type") {
619-
instanceType = d.Get("instance_type").(string)
620-
}
621-
622-
if v, ok := d.GetOkExists("deletion_protection"); ok {
623-
deletionProtection = v.(bool)
624-
}
612+
if d.HasChange("instance_type") {
613+
instanceType := d.Get("instance_type").(string)
625614

626-
if err := tcrService.ModifyInstance(ctx, d.Id(), instanceType, deletionProtection); err != nil {
615+
if err := tcrService.ModifyInstance(ctx, d.Id(), instanceType); err != nil {
627616
return err
628617
}
629618
err := resource.Retry(2*tccommon.ReadRetryTimeout, func() *resource.RetryError {
@@ -642,6 +631,17 @@ func resourceTencentCloudTcrInstanceUpdate(d *schema.ResourceData, meta interfac
642631
}
643632
}
644633

634+
if d.HasChange("deletion_protection") {
635+
var deletionProtection bool
636+
if v, ok := d.GetOkExists("deletion_protection"); ok {
637+
deletionProtection = v.(bool)
638+
}
639+
640+
if err := tcrService.ModifyInstanceDP(ctx, d.Id(), deletionProtection); err != nil {
641+
return err
642+
}
643+
}
644+
645645
if d.HasChange("instance_charge_type_prepaid_period") {
646646
var (
647647
chargeType int
@@ -717,7 +717,6 @@ func resourceTencentCloudTcrInstanceDelete(d *schema.ResourceData, meta interfac
717717
repRequest := tcr.NewDescribeReplicationInstancesRequest()
718718
repRequest.RegistryId = &instanceId
719719
replicas, outErr := tcrService.DescribeReplicationInstances(ctx, repRequest)
720-
721720
if outErr != nil {
722721
return outErr
723722
}
@@ -737,6 +736,32 @@ func resourceTencentCloudTcrInstanceDelete(d *schema.ResourceData, meta interfac
737736
})
738737
}
739738

739+
// Delete namespaces under the instance before deleting the instance itself.
740+
// Query all namespaces via DescribeNamespaces, then iterate to delete each one via DeleteNamespace.
741+
namespaces, outErr := tcrService.DescribeTCRNameSpaces(ctx, instanceId, "")
742+
if outErr != nil {
743+
return outErr
744+
}
745+
746+
for i := range namespaces {
747+
ns := namespaces[i]
748+
if ns == nil || ns.Name == nil {
749+
continue
750+
}
751+
nsName := *ns.Name
752+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
753+
e := tcrService.DeleteTCRNameSpace(ctx, instanceId, nsName)
754+
if e != nil {
755+
return tccommon.RetryError(e, tcr.INTERNALERROR_ERRORCONFLICT)
756+
}
757+
return nil
758+
})
759+
if err != nil {
760+
log.Printf("[CRITAL]%s delete tcr namespace [%s] under instance [%s] failed, reason:%+v", logId, nsName, instanceId, err)
761+
return err
762+
}
763+
}
764+
740765
outErr = tcrService.DeleteTCRInstance(ctx, instanceId, deleteBucket)
741766
if outErr != nil {
742767
outErr = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {

tencentcloud/services/tcr/service_tencentcloud_tcr.go

Lines changed: 58 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ func (me *TCRService) CreateTCRNameSpace(ctx context.Context, instanceId string,
329329
return
330330
}
331331

332-
func (me *TCRService) ModifyInstance(ctx context.Context, registryId, registryType string, deletionProtection bool) (errRet error) {
332+
func (me *TCRService) ModifyInstance(ctx context.Context, registryId, registryType string) (errRet error) {
333333
logId := tccommon.GetLogId(ctx)
334334
request := tcr.NewModifyInstanceRequest()
335335
defer func() {
@@ -342,6 +342,20 @@ func (me *TCRService) ModifyInstance(ctx context.Context, registryId, registryTy
342342
request.RegistryType = helper.String(registryType)
343343
}
344344

345+
ratelimit.Check(request.GetAction())
346+
_, err := me.client.UseTCRClient().ModifyInstance(request)
347+
return err
348+
}
349+
350+
func (me *TCRService) ModifyInstanceDP(ctx context.Context, registryId string, deletionProtection bool) (errRet error) {
351+
logId := tccommon.GetLogId(ctx)
352+
request := tcr.NewModifyInstanceRequest()
353+
defer func() {
354+
if errRet != nil {
355+
log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error())
356+
}
357+
}()
358+
request.RegistryId = helper.String(registryId)
345359
request.DeletionProtection = helper.Bool(deletionProtection)
346360
ratelimit.Check(request.GetAction())
347361
_, err := me.client.UseTCRClient().ModifyInstance(request)
@@ -414,15 +428,24 @@ func (me *TCRService) DescribeTCRNameSpaces(ctx context.Context, instanceId stri
414428
for {
415429
request.Offset = &offset
416430
request.Limit = &limit
417-
ratelimit.Check(request.GetAction())
418-
response, err := me.client.UseTCRClient().DescribeNamespaces(request)
419-
if err != nil {
420-
ee, ok := err.(*sdkErrors.TencentCloudSDKError)
421-
if !ok {
422-
errRet = err
423-
return
431+
432+
var response *tcr.DescribeNamespacesResponse
433+
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
434+
ratelimit.Check(request.GetAction())
435+
resp, e := me.client.UseTCRClient().DescribeNamespaces(request)
436+
if e != nil {
437+
// ResourceNotFound is a terminal condition, do not retry.
438+
if ee, ok := e.(*sdkErrors.TencentCloudSDKError); ok && ee.Code == "ResourceNotFound" {
439+
return resource.NonRetryableError(e)
440+
}
441+
return tccommon.RetryError(e)
424442
}
425-
if ee.Code == "ResourceNotFound" {
443+
response = resp
444+
return nil
445+
})
446+
447+
if err != nil {
448+
if ee, ok := err.(*sdkErrors.TencentCloudSDKError); ok && ee.Code == "ResourceNotFound" {
426449
errRet = nil
427450
} else {
428451
errRet = err
@@ -431,6 +454,7 @@ func (me *TCRService) DescribeTCRNameSpaces(ctx context.Context, instanceId stri
431454
}
432455
if response == nil || response.Response == nil {
433456
errRet = fmt.Errorf("TencentCloud SDK return nil response, %s", request.GetAction())
457+
return
434458
}
435459
namespaceList = append(namespaceList, response.Response.NamespaceList...)
436460
if len(response.Response.NamespaceList) < int(limit) {
@@ -999,8 +1023,16 @@ func (me *TCRService) DeleteReplicationInstance(ctx context.Context, request *tc
9991023
}
10001024
}()
10011025

1002-
ratelimit.Check(request.GetAction())
1003-
response, err := me.client.UseTCRClient().DeleteReplicationInstance(request)
1026+
var response *tcr.DeleteReplicationInstanceResponse
1027+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
1028+
ratelimit.Check(request.GetAction())
1029+
resp, e := me.client.UseTCRClient().DeleteReplicationInstance(request)
1030+
if e != nil {
1031+
return tccommon.RetryError(e, tcr.INTERNALERROR_ERRORCONFLICT)
1032+
}
1033+
response = resp
1034+
return nil
1035+
})
10041036
if err != nil {
10051037
errRet = err
10061038
return
@@ -1057,13 +1089,26 @@ func (me *TCRService) DescribeReplicationInstances(ctx context.Context, request
10571089
}
10581090
}()
10591091

1060-
ratelimit.Check(request.GetAction())
1061-
response, err := me.client.UseTCRClient().DescribeReplicationInstances(request)
1092+
var response *tcr.DescribeReplicationInstancesResponse
1093+
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
1094+
ratelimit.Check(request.GetAction())
1095+
resp, e := me.client.UseTCRClient().DescribeReplicationInstances(request)
1096+
if e != nil {
1097+
return tccommon.RetryError(e)
1098+
}
1099+
response = resp
1100+
return nil
1101+
})
10621102
if err != nil {
10631103
errRet = err
10641104
return
10651105
}
10661106

1107+
if response == nil || response.Response == nil {
1108+
errRet = fmt.Errorf("TencentCloud SDK return nil response, %s", request.GetAction())
1109+
return
1110+
}
1111+
10671112
list = response.Response.ReplicationRegistries
10681113

10691114
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",

website/docs/r/tcr_instance.html.markdown

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ The following arguments are supported:
108108
* `delete_bucket` - (Optional, Bool) Indicate to delete the COS bucket which is auto-created with the instance or not.
109109
* `deletion_protection` - (Optional, Bool) Whether to enable Instance Deletion Protection.
110110
* `enable_cos_maz` - (Optional, Bool, ForceNew) Whether to enable COS bucket multi-AZ feature. Default is `false`.
111-
* `enable_cos_versioning` - (Optional, Bool, ForceNew) Whether to enable COS bucket versioning. Default is `false`.
111+
* `enable_cos_versioning` - (Optional, Bool, ForceNew) Whether to enable COS bucket versioning. Advanced Edition Instances: Default is `true` (versioning enabled); Standard / Basic Edition Instances: Default is `false` (disabled).
112112
* `instance_charge_type_prepaid_period` - (Optional, Int) Length of time to purchase an instance (in month). Must set when registry_charge_type is prepaid.
113113
* `instance_charge_type_prepaid_renew_flag` - (Optional, Int) Auto renewal flag. 1: manual renewal, 2: automatic renewal, 3: no renewal and no notification. Must set when registry_charge_type is prepaid.
114114
* `open_public_operation` - (Optional, Bool) Control public network access.

0 commit comments

Comments
 (0)