@@ -250,7 +250,7 @@ func resourceTencentCloudClbServerAttachmentDelete(d *schema.ResourceData, meta
250250 return nil
251251}
252252
253- func resourceTencentCloudClbServerAttachementRemove (d * schema.ResourceData , meta interface {}, remove []interface {}) error {
253+ func resourceTencentCloudClbServerAttachmentRemove (d * schema.ResourceData , meta interface {}, remove []interface {}) error {
254254 defer logElapsed ("resource.tencentcloud_clb_attachment.remove" )()
255255
256256 logId := getLogId (contextNil )
@@ -276,7 +276,11 @@ func resourceTencentCloudClbServerAttachementRemove(d *schema.ResourceData, meta
276276 }
277277
278278 err := resource .Retry (writeRetryTimeout , func () * resource.RetryError {
279- e := clbService .DeleteAttachmentById (ctx , clbId , listenerId , locationId , remove )
279+ removeCandidates := getRemoveCandidates (ctx , clbService , clbId , listenerId , locationId , remove )
280+ if len (removeCandidates ) == 0 {
281+ return nil
282+ }
283+ e := clbService .DeleteAttachmentById (ctx , clbId , listenerId , locationId , removeCandidates )
280284 if e != nil {
281285 return retryError (e )
282286 }
@@ -291,7 +295,7 @@ func resourceTencentCloudClbServerAttachementRemove(d *schema.ResourceData, meta
291295 return nil
292296}
293297
294- func resourceTencentCloudClbServerAttachementAdd (d * schema.ResourceData , meta interface {}, add []interface {}) error {
298+ func resourceTencentCloudClbServerAttachmentAdd (d * schema.ResourceData , meta interface {}, add []interface {}) error {
295299 defer logElapsed ("resource.tencentcloud_clb_attachment.add" )()
296300 logId := getLogId (contextNil )
297301
@@ -349,13 +353,13 @@ func resourceTencentCloudClbServerAttachmentUpdate(d *schema.ResourceData, meta
349353 add := ns .Difference (os ).List ()
350354 remove := os .Difference (ns ).List ()
351355 if len (remove ) > 0 {
352- err := resourceTencentCloudClbServerAttachementRemove (d , meta , remove )
356+ err := resourceTencentCloudClbServerAttachmentRemove (d , meta , remove )
353357 if err != nil {
354358 return err
355359 }
356360 }
357361 if len (add ) > 0 {
358- err := resourceTencentCloudClbServerAttachementAdd (d , meta , add )
362+ err := resourceTencentCloudClbServerAttachmentAdd (d , meta , add )
359363 if err != nil {
360364 return err
361365 }
@@ -443,3 +447,35 @@ func resourceTencentCloudClbServerAttachmentRead(d *schema.ResourceData, meta in
443447
444448 return nil
445449}
450+
451+ // Destroy CVM instance will dispatch async task to deregister target group from cloudApi backend. Duplicate deregister target groups here will cause Error response.
452+ // If remove diffs created, check existing cvm instance first, filter target groups which already deregister
453+ func getRemoveCandidates (ctx context.Context , clbService ClbService , clbId string , listenerId string , locationId string , remove []interface {}) []interface {} {
454+ removeCandidates := make ([]interface {}, 0 )
455+ existAttachments , err := clbService .DescribeAttachmentByPara (ctx , clbId , listenerId , locationId )
456+ if err != nil {
457+ return removeCandidates
458+ }
459+ existTargetGroups := existAttachments .Targets
460+
461+ for _ , item := range remove {
462+ target := item .(map [string ]interface {})
463+ if targetGroupContainsInstance (existTargetGroups , target ["instance_id" ].(string )) {
464+ removeCandidates = append (removeCandidates , target )
465+ }
466+ }
467+
468+ return removeCandidates
469+ }
470+
471+ func targetGroupContainsInstance (targets []* clb.Backend , instanceId string ) (contains bool ) {
472+ contains = false
473+ for _ , target := range targets {
474+ if instanceId == * target .InstanceId {
475+ log .Printf ("[WARN] Instance %s applied." , instanceId )
476+ return true
477+ }
478+ }
479+ log .Printf ("[WARN] Instance %s not exist, skip deregister." , instanceId )
480+ return
481+ }
0 commit comments