@@ -14,6 +14,7 @@ import (
14
14
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
15
15
"github.com/pkg/errors"
16
16
clb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb/v20180317"
17
+ vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
17
18
18
19
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
19
20
)
@@ -218,6 +219,11 @@ func ResourceTencentCloudClbInstance() *schema.Resource {
218
219
Optional : true ,
219
220
Description : "If create dynamic vip CLB instance, `true` or `false`." ,
220
221
},
222
+ "eip_address_id" : {
223
+ Type : schema .TypeString ,
224
+ Optional : true ,
225
+ Description : "The unique ID of the EIP, such as eip-1v2rmbwk, is only applicable to the intranet load balancing binding EIP." ,
226
+ },
221
227
"domain" : {
222
228
Type : schema .TypeString ,
223
229
Computed : true ,
@@ -406,6 +412,10 @@ func resourceTencentCloudClbInstanceCreate(d *schema.ResourceData, meta interfac
406
412
request .DynamicVip = helper .Bool (v .(bool ))
407
413
}
408
414
415
+ if v , ok := d .GetOk ("eip_address_id" ); ok {
416
+ request .EipAddressId = helper .String (v .(string ))
417
+ }
418
+
409
419
if tags := helper .GetTags (d , "tags" ); len (tags ) > 0 {
410
420
for k , v := range tags {
411
421
tmpKey := k
@@ -675,6 +685,40 @@ func resourceTencentCloudClbInstanceRead(d *schema.ResourceData, meta interface{
675
685
_ = d .Set ("snat_pro" , instance .SnatPro )
676
686
}
677
687
688
+ if * instance .LoadBalancerType == "INTERNAL" {
689
+ request := vpc .NewDescribeAddressesRequest ()
690
+ request .Filters = []* vpc.Filter {
691
+ {
692
+ Name : helper .String ("instance-id" ),
693
+ Values : helper .Strings ([]string {clbId }),
694
+ },
695
+ }
696
+ err := resource .Retry (tccommon .WriteRetryTimeout , func () * resource.RetryError {
697
+ result , e := meta .(tccommon.ProviderMeta ).GetAPIV3Conn ().UseVpcClient ().DescribeAddresses (request )
698
+ if e != nil {
699
+ return tccommon .RetryError (e )
700
+ }
701
+
702
+ if result == nil || result .Response == nil || result .Response .AddressSet == nil {
703
+ e = fmt .Errorf ("Describe CLB instance EIP failed" )
704
+ return resource .NonRetryableError (e )
705
+ }
706
+
707
+ if len (result .Response .AddressSet ) == 1 {
708
+ if result .Response .AddressSet [0 ].AddressId != nil {
709
+ _ = d .Set ("eip_address_id" , result .Response .AddressSet [0 ].AddressId )
710
+ }
711
+ }
712
+
713
+ return nil
714
+ })
715
+
716
+ if err != nil {
717
+ log .Printf ("[CRITAL]%s Describe CLB instance EIP failed, reason:%+v" , logId , err )
718
+ return err
719
+ }
720
+ }
721
+
678
722
tcClient := meta .(tccommon.ProviderMeta ).GetAPIV3Conn ()
679
723
tagService := svctag .NewTagService (tcClient )
680
724
tags , err := tagService .DescribeResourceTags (ctx , "clb" , "clb" , tcClient .Region , d .Id ())
@@ -932,6 +976,102 @@ func resourceTencentCloudClbInstanceUpdate(d *schema.ResourceData, meta interfac
932
976
}
933
977
}
934
978
979
+ if d .HasChange ("eip_address_id" ) {
980
+ oldEip , newEip := d .GetChange ("eip_address_id" )
981
+ oldEipStr := oldEip .(string )
982
+ newEipStr := newEip .(string )
983
+ // delete old first
984
+ if oldEipStr != "" {
985
+ request := vpc .NewDisassociateAddressRequest ()
986
+ request .AddressId = helper .String (oldEipStr )
987
+ err := resource .Retry (tccommon .WriteRetryTimeout , func () * resource.RetryError {
988
+ _ , e := meta .(tccommon.ProviderMeta ).GetAPIV3Conn ().UseVpcClient ().DisassociateAddress (request )
989
+ if e != nil {
990
+ return tccommon .RetryError (e )
991
+ }
992
+
993
+ return nil
994
+ })
995
+
996
+ if err != nil {
997
+ log .Printf ("[CRITAL]%s Disassociate EIP failed, reason:%+v" , logId , err )
998
+ return err
999
+ }
1000
+
1001
+ // wait
1002
+ eipRequest := vpc .NewDescribeAddressesRequest ()
1003
+ eipRequest .AddressIds = helper .Strings ([]string {oldEipStr })
1004
+ err = resource .Retry (tccommon .WriteRetryTimeout , func () * resource.RetryError {
1005
+ result , e := meta .(tccommon.ProviderMeta ).GetAPIV3Conn ().UseVpcClient ().DescribeAddresses (eipRequest )
1006
+ if e != nil {
1007
+ return tccommon .RetryError (e )
1008
+ }
1009
+
1010
+ if result == nil || result .Response == nil || result .Response .AddressSet == nil || len (result .Response .AddressSet ) != 1 {
1011
+ e = fmt .Errorf ("Describe CLB instance EIP failed" )
1012
+ return resource .NonRetryableError (e )
1013
+ }
1014
+
1015
+ if * result .Response .AddressSet [0 ].AddressStatus != "UNBIND" {
1016
+ return resource .RetryableError (fmt .Errorf ("EIP status is still %s" , * result .Response .AddressSet [0 ].AddressStatus ))
1017
+ }
1018
+
1019
+ return nil
1020
+ })
1021
+
1022
+ if err != nil {
1023
+ log .Printf ("[CRITAL]%s Describe CLB instance EIP failed, reason:%+v" , logId , err )
1024
+ return err
1025
+ }
1026
+ }
1027
+
1028
+ // attach new
1029
+ if newEipStr != "" {
1030
+ request := vpc .NewAssociateAddressRequest ()
1031
+ request .AddressId = helper .String (newEipStr )
1032
+ request .InstanceId = helper .String (clbId )
1033
+ err := resource .Retry (tccommon .WriteRetryTimeout , func () * resource.RetryError {
1034
+ _ , e := meta .(tccommon.ProviderMeta ).GetAPIV3Conn ().UseVpcClient ().AssociateAddress (request )
1035
+ if e != nil {
1036
+ return tccommon .RetryError (e )
1037
+ }
1038
+
1039
+ return nil
1040
+ })
1041
+
1042
+ if err != nil {
1043
+ log .Printf ("[CRITAL]%s Associate EIP failed, reason:%+v" , logId , err )
1044
+ return err
1045
+ }
1046
+
1047
+ // wait
1048
+ eipRequest := vpc .NewDescribeAddressesRequest ()
1049
+ eipRequest .AddressIds = helper .Strings ([]string {newEipStr })
1050
+ err = resource .Retry (tccommon .WriteRetryTimeout , func () * resource.RetryError {
1051
+ result , e := meta .(tccommon.ProviderMeta ).GetAPIV3Conn ().UseVpcClient ().DescribeAddresses (eipRequest )
1052
+ if e != nil {
1053
+ return tccommon .RetryError (e )
1054
+ }
1055
+
1056
+ if result == nil || result .Response == nil || result .Response .AddressSet == nil || len (result .Response .AddressSet ) != 1 {
1057
+ e = fmt .Errorf ("Describe CLB instance EIP failed" )
1058
+ return resource .NonRetryableError (e )
1059
+ }
1060
+
1061
+ if * result .Response .AddressSet [0 ].AddressStatus != "BIND" {
1062
+ return resource .RetryableError (fmt .Errorf ("EIP status is still %s" , * result .Response .AddressSet [0 ].AddressStatus ))
1063
+ }
1064
+
1065
+ return nil
1066
+ })
1067
+
1068
+ if err != nil {
1069
+ log .Printf ("[CRITAL]%s Describe CLB instance EIP failed, reason:%+v" , logId , err )
1070
+ return err
1071
+ }
1072
+ }
1073
+ }
1074
+
935
1075
if d .HasChange ("tags" ) {
936
1076
oldValue , newValue := d .GetChange ("tags" )
937
1077
replaceTags , deleteTags := svctag .DiffTags (oldValue .(map [string ]interface {}), newValue .(map [string ]interface {}))
0 commit comments