@@ -2025,6 +2025,91 @@ func (me *VpcService) AttachEip(ctx context.Context, eipId, instanceId string) e
20252025 return nil
20262026}
20272027
2028+ func (me * VpcService ) DescribeNatGatewayById (ctx context.Context , natGateWayId string ) (natGateWay * vpc.NatGateway , errRet error ) {
2029+ logId := getLogId (ctx )
2030+ request := vpc .NewDescribeNatGatewaysRequest ()
2031+ request .NatGatewayIds = []* string {& natGateWayId }
2032+ defer func () {
2033+ if errRet != nil {
2034+ log .Printf ("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n " ,
2035+ logId , request .GetAction (), request .ToJsonString (), errRet .Error ())
2036+ }
2037+ }()
2038+
2039+ ratelimit .Check (request .GetAction ())
2040+ response , err := me .client .UseVpcClient ().DescribeNatGateways (request )
2041+
2042+ if err != nil {
2043+ errRet = err
2044+ return
2045+ }
2046+
2047+ log .Printf ("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n " ,
2048+ logId , request .GetAction (), request .ToJsonString (), response .ToJsonString ())
2049+
2050+ if len (response .Response .NatGatewaySet ) > 0 {
2051+ natGateWay = response .Response .NatGatewaySet [0 ]
2052+ }
2053+
2054+ return
2055+ }
2056+
2057+ func (me * VpcService ) DisassociateNatGatewayAddress (ctx context.Context , request * vpc.DisassociateNatGatewayAddressRequest ) (errRet error ) {
2058+ logId := getLogId (ctx )
2059+ defer func () {
2060+ if errRet != nil {
2061+ log .Printf ("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n " ,
2062+ logId , request .GetAction (), request .ToJsonString (), errRet .Error ())
2063+ }
2064+ }()
2065+
2066+ // Check if Nat Gateway Ip still associate
2067+ gateway , err := me .DescribeNatGatewayById (ctx , * request .NatGatewayId )
2068+
2069+ if err != nil {
2070+ errRet = err
2071+ return
2072+ }
2073+
2074+ if gateway == nil || len (gateway .PublicIpAddressSet ) == 0 {
2075+ return
2076+ }
2077+
2078+ var gatewayAddresses []string
2079+ var candidates []* string
2080+
2081+ for i := range gateway .PublicIpAddressSet {
2082+ addr := gateway .PublicIpAddressSet [i ].PublicIpAddress
2083+ gatewayAddresses = append (gatewayAddresses , * addr )
2084+ }
2085+
2086+ for i := range request .PublicIpAddresses {
2087+ addr := request .PublicIpAddresses [i ]
2088+ if helper .StringsContain (gatewayAddresses , * addr ) {
2089+ candidates = append (candidates , addr )
2090+ }
2091+ }
2092+
2093+ if len (candidates ) == 0 {
2094+ return nil
2095+ }
2096+
2097+ request .PublicIpAddresses = candidates
2098+
2099+ ratelimit .Check (request .GetAction ())
2100+ response , err := me .client .UseVpcClient ().DisassociateNatGatewayAddress (request )
2101+
2102+ if err != nil {
2103+ errRet = err
2104+ return
2105+ }
2106+
2107+ log .Printf ("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n " ,
2108+ logId , request .GetAction (), request .ToJsonString (), response .ToJsonString ())
2109+
2110+ return
2111+ }
2112+
20282113func (me * VpcService ) UnattachEip (ctx context.Context , eipId string ) error {
20292114 eipUnattachLocker .Lock ()
20302115 defer eipUnattachLocker .Unlock ()
@@ -2038,6 +2123,32 @@ func (me *VpcService) UnattachEip(ctx context.Context, eipId string) error {
20382123 return nil
20392124 }
20402125
2126+ // DisassociateAddress Doesn't support Disassociate NAT Address
2127+ if strings .HasPrefix (* eip .InstanceId , "nat-" ) {
2128+ request := vpc .NewDisassociateNatGatewayAddressRequest ()
2129+ request .NatGatewayId = eip .InstanceId
2130+ request .PublicIpAddresses = []* string {eip .AddressIp }
2131+ err := me .DisassociateNatGatewayAddress (ctx , request )
2132+ if err != nil {
2133+ return err
2134+ }
2135+
2136+ outErr := resource .Retry (readRetryTimeout * 3 , func () * resource.RetryError {
2137+ eip , err := me .DescribeEipById (ctx , eipId )
2138+ if err != nil {
2139+ return retryError (err )
2140+ }
2141+ if eip != nil && * eip .AddressStatus != EIP_STATUS_UNBIND {
2142+ return resource .RetryableError (fmt .Errorf ("eip is still %s" , EIP_STATUS_UNBIND ))
2143+ }
2144+ return nil
2145+ })
2146+
2147+ if outErr != nil {
2148+ return outErr
2149+ }
2150+ }
2151+
20412152 request := vpc .NewDisassociateAddressRequest ()
20422153 request .AddressId = & eipId
20432154 ratelimit .Check (request .GetAction ())
0 commit comments