@@ -85,8 +85,13 @@ func resourceTencentCloudClbServerAttachment() *schema.Resource {
8585 Schema : map [string ]* schema.Schema {
8686 "instance_id" : {
8787 Type : schema .TypeString ,
88- Required : true ,
89- Description : "Id of the backend server." ,
88+ Optional : true ,
89+ Description : "CVM Instance Id of the backend server, conflict with `eni_ip` but must specify one of them." ,
90+ },
91+ "eni_ip" : {
92+ Type : schema .TypeString ,
93+ Optional : true ,
94+ Description : "Eni IP address of the backend server, conflict with `instance_id` but must specify one of them." ,
9095 },
9196 "port" : {
9297 Type : schema .TypeInt ,
@@ -147,7 +152,7 @@ func resourceTencentCloudClbServerAttachmentCreate(d *schema.ResourceData, meta
147152 break
148153 }
149154 inst := insList [index ].(map [string ]interface {})
150- request .Targets = append (request .Targets , clbNewTarget (inst ["instance_id" ], inst ["port" ], inst ["weight" ]))
155+ request .Targets = append (request .Targets , clbNewTarget (inst ["instance_id" ], inst ["eni_ip" ], inst [ " port" ], inst ["weight" ]))
151156 }
152157
153158 err := resource .Retry (writeRetryTimeout , func () * resource.RetryError {
@@ -220,7 +225,7 @@ func resourceTencentCloudClbServerAttachmentDelete(d *schema.ResourceData, meta
220225 break
221226 }
222227 inst := insList [index ].(map [string ]interface {})
223- request .Targets = append (request .Targets , clbNewTarget (inst ["instance_id" ], inst ["port" ], inst ["weight" ]))
228+ request .Targets = append (request .Targets , clbNewTarget (inst ["instance_id" ], inst ["eni_ip" ], inst [ " port" ], inst ["weight" ]))
224229 }
225230
226231 err := resource .Retry (writeRetryTimeout , func () * resource.RetryError {
@@ -318,9 +323,9 @@ func resourceTencentCloudClbServerAttachmentAdd(d *schema.ResourceData, meta int
318323 }
319324 }
320325
321- for _ , inst_ := range add {
322- inst := inst_ .(map [string ]interface {})
323- request .Targets = append (request .Targets , clbNewTarget (inst ["instance_id" ], inst ["port" ], inst ["weight" ]))
326+ for _ , v := range add {
327+ inst := v .(map [string ]interface {})
328+ request .Targets = append (request .Targets , clbNewTarget (inst ["instance_id" ], inst ["eni_ip" ], inst [ " port" ], inst ["weight" ]))
324329 }
325330 err := resource .Retry (writeRetryTimeout , func () * resource.RetryError {
326331 requestId := ""
@@ -432,21 +437,44 @@ func resourceTencentCloudClbServerAttachmentRead(d *schema.ResourceData, meta in
432437 //this may cause problems when there are members in two dimensions array
433438 //need to read state of the tfstate file to clear the relationships
434439 //in this situation, import action is not supported
440+ // TL,DR: just update partial targets which this resource declared.
435441 stateTargets := d .Get ("targets" ).(* schema.Set )
436442 if stateTargets .Len () != 0 {
437443 //the old state exist
438444 //create a new attachment with state
439- exactTargets := make ([]* clb.Backend , 0 )
440- for _ , v := range onlineTargets {
441- if stateTargets .Contains (map [string ]interface {}{
442- "weight" : int (* v .Weight ),
443- "port" : int (* v .Port ),
444- "instance_id" : * v .InstanceId ,
445- }) {
446- exactTargets = append (exactTargets , v )
445+ exactTargets := make ([]interface {}, 0 )
446+ for i := range onlineTargets {
447+ v := onlineTargets [i ]
448+ if * v .Type == "CVM" && v .InstanceId != nil {
449+ target := map [string ]interface {}{
450+ "weight" : int (* v .Weight ),
451+ "port" : int (* v .Port ),
452+ "instance_id" : * v .InstanceId ,
453+ }
454+ if stateTargets .Contains (target ) {
455+ exactTargets = append (exactTargets , map [string ]interface {}{
456+ "weight" : int (* v .Weight ),
457+ "port" : int (* v .Port ),
458+ "instance_id" : * v .InstanceId ,
459+ })
460+ }
461+
462+ } else if len (v .PrivateIpAddresses ) > 0 && * v .PrivateIpAddresses [0 ] != "" {
463+ target := map [string ]interface {}{
464+ "weight" : int (* v .Weight ),
465+ "port" : int (* v .Port ),
466+ "eni_ip" : * v .PrivateIpAddresses [0 ],
467+ }
468+ if stateTargets .Contains (target ) {
469+ exactTargets = append (exactTargets , map [string ]interface {}{
470+ "weight" : int (* v .Weight ),
471+ "port" : int (* v .Port ),
472+ "eni_ip" : * v .PrivateIpAddresses [0 ],
473+ })
474+ }
447475 }
448476 }
449- _ = d .Set ("targets" , flattenBackendList ( exactTargets ) )
477+ _ = d .Set ("targets" , exactTargets )
450478 } else {
451479 _ = d .Set ("targets" , flattenBackendList (onlineTargets ))
452480 }
@@ -466,22 +494,50 @@ func getRemoveCandidates(ctx context.Context, clbService ClbService, clbId strin
466494
467495 for _ , item := range remove {
468496 target := item .(map [string ]interface {})
469- if targetGroupContainsInstance (existTargetGroups , target ["instance_id" ].( string ) ) {
497+ if targetGroupContainsInstance (existTargetGroups , target ["instance_id" ]) || targetGroupContainsEni ( existTargetGroups , target [ "eni_ip" ] ) {
470498 removeCandidates = append (removeCandidates , target )
471499 }
472500 }
473501
474502 return removeCandidates
475503}
476504
477- func targetGroupContainsInstance (targets []* clb.Backend , instanceId string ) (contains bool ) {
505+ func targetGroupContainsInstance (targets []* clb.Backend , instanceId interface {} ) (contains bool ) {
478506 contains = false
507+ id , ok := instanceId .(string )
508+ if ! ok || id == "" {
509+ return
510+ }
479511 for _ , target := range targets {
480- if instanceId == * target .InstanceId {
481- log .Printf ("[WARN] Instance %s applied." , instanceId )
512+ if target .InstanceId == nil {
513+ continue
514+ }
515+ if id == * target .InstanceId {
516+ log .Printf ("[WARN] Instance %s applied." , id )
482517 return true
483518 }
484519 }
485- log .Printf ("[WARN] Instance %s not exist, skip deregister." , instanceId )
520+ log .Printf ("[WARN] Instance %s not exist, skip deregister." , id )
521+
522+ return
523+ }
524+
525+ func targetGroupContainsEni (targets []* clb.Backend , eniIp interface {}) (contains bool ) {
526+ contains = false
527+ ip , ok := eniIp .(string )
528+ if ! ok || ip == "" {
529+ return
530+ }
531+ for _ , target := range targets {
532+ if len (target .PrivateIpAddresses ) > 0 && target .PrivateIpAddresses [0 ] != nil {
533+ continue
534+ }
535+ if ip == * target .PrivateIpAddresses [0 ] {
536+ log .Printf ("[WARN] IP %s applied." , ip )
537+ return true
538+ }
539+ }
540+ log .Printf ("[WARN] IP %s not exist, skip deregister." , ip )
541+
486542 return
487543}
0 commit comments