@@ -250,7 +250,7 @@ func resourceTencentCloudClbServerAttachmentDelete(d *schema.ResourceData, meta
250
250
return nil
251
251
}
252
252
253
- func resourceTencentCloudClbServerAttachementRemove (d * schema.ResourceData , meta interface {}, remove []interface {}) error {
253
+ func resourceTencentCloudClbServerAttachmentRemove (d * schema.ResourceData , meta interface {}, remove []interface {}) error {
254
254
defer logElapsed ("resource.tencentcloud_clb_attachment.remove" )()
255
255
256
256
logId := getLogId (contextNil )
@@ -276,7 +276,11 @@ func resourceTencentCloudClbServerAttachementRemove(d *schema.ResourceData, meta
276
276
}
277
277
278
278
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 )
280
284
if e != nil {
281
285
return retryError (e )
282
286
}
@@ -291,7 +295,7 @@ func resourceTencentCloudClbServerAttachementRemove(d *schema.ResourceData, meta
291
295
return nil
292
296
}
293
297
294
- func resourceTencentCloudClbServerAttachementAdd (d * schema.ResourceData , meta interface {}, add []interface {}) error {
298
+ func resourceTencentCloudClbServerAttachmentAdd (d * schema.ResourceData , meta interface {}, add []interface {}) error {
295
299
defer logElapsed ("resource.tencentcloud_clb_attachment.add" )()
296
300
logId := getLogId (contextNil )
297
301
@@ -349,13 +353,13 @@ func resourceTencentCloudClbServerAttachmentUpdate(d *schema.ResourceData, meta
349
353
add := ns .Difference (os ).List ()
350
354
remove := os .Difference (ns ).List ()
351
355
if len (remove ) > 0 {
352
- err := resourceTencentCloudClbServerAttachementRemove (d , meta , remove )
356
+ err := resourceTencentCloudClbServerAttachmentRemove (d , meta , remove )
353
357
if err != nil {
354
358
return err
355
359
}
356
360
}
357
361
if len (add ) > 0 {
358
- err := resourceTencentCloudClbServerAttachementAdd (d , meta , add )
362
+ err := resourceTencentCloudClbServerAttachmentAdd (d , meta , add )
359
363
if err != nil {
360
364
return err
361
365
}
@@ -443,3 +447,35 @@ func resourceTencentCloudClbServerAttachmentRead(d *schema.ResourceData, meta in
443
447
444
448
return nil
445
449
}
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