Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions tencentcloud/extension_vpc.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ const (
EIP_STATUS_OFFLINING = "OFFLINING"
EIP_STATUS_BIND_ENI = "BIND_ENI"

EIP_TYPE_EIP = "EIP"
EIP_TYPE_ANYCAST = "AnycastEIP"
EIP_TYPE_EIP = "EIP"
EIP_TYPE_ANYCAST = "AnycastEIP"
EIP_TYPE_HIGH_QUALITY = "HighQualityEIP"

EIP_ANYCAST_ZONE_GLOBAL = "ANYCAST_ZONE_GLOBAL"
Expand Down
4 changes: 2 additions & 2 deletions tencentcloud/resource_tc_eip.go
Original file line number Diff line number Diff line change
Expand Up @@ -320,8 +320,8 @@ func resourceTencentCloudEipDelete(d *schema.ResourceData, meta interface{}) err

err = resource.Retry(writeRetryTimeout, func() *resource.RetryError {
errRet := vpcService.DeleteEip(ctx, eipId)
if err != nil {
return retryError(errRet)
if errRet != nil {
return retryError(errRet, "DesOperation.MutexTaskRunning")
}
return nil
})
Expand Down
11 changes: 4 additions & 7 deletions tencentcloud/resource_tc_nat_gateway.go
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,8 @@ func resourceTencentCloudNatGatewayUpdate(d *schema.ResourceData, meta interface
defer logElapsed("resource.tencentcloud_nat_gateway.update")()

logId := getLogId(contextNil)
ctx := context.WithValue(context.TODO(), logIdKey, logId)
vpcService := VpcService{client: meta.(*TencentCloudClient).apiV3Conn}

d.Partial(true)
natGatewayId := d.Id()
Expand Down Expand Up @@ -343,10 +345,8 @@ func resourceTencentCloudNatGatewayUpdate(d *schema.ResourceData, meta interface

if len(unassignedRequest.PublicIpAddresses) > 0 {
err := resource.Retry(readRetryTimeout, func() *resource.RetryError {
_, e := meta.(*TencentCloudClient).apiV3Conn.UseVpcClient().DisassociateNatGatewayAddress(unassignedRequest)
e := vpcService.DisassociateNatGatewayAddress(ctx, unassignedRequest)
if e != nil {
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
logId, unassignedRequest.GetAction(), unassignedRequest.ToJsonString(), e.Error())
return retryError(e)
}
return nil
Expand Down Expand Up @@ -403,10 +403,8 @@ func resourceTencentCloudNatGatewayUpdate(d *schema.ResourceData, meta interface
unassignedRequest.NatGatewayId = &natGatewayId
unassignedRequest.PublicIpAddresses = []*string{&backUpOldIp}
err := resource.Retry(readRetryTimeout, func() *resource.RetryError {
_, e := meta.(*TencentCloudClient).apiV3Conn.UseVpcClient().DisassociateNatGatewayAddress(unassignedRequest)
e := vpcService.DisassociateNatGatewayAddress(ctx, unassignedRequest)
if e != nil {
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
logId, unassignedRequest.GetAction(), unassignedRequest.ToJsonString(), e.Error())
return retryError(e)
}
return nil
Expand Down Expand Up @@ -440,7 +438,6 @@ func resourceTencentCloudNatGatewayUpdate(d *schema.ResourceData, meta interface

}

ctx := context.WithValue(context.TODO(), logIdKey, logId)
if d.HasChange("tags") {

oldValue, newValue := d.GetChange("tags")
Expand Down
3 changes: 0 additions & 3 deletions tencentcloud/resource_tc_nat_gateway_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -145,9 +145,6 @@ data "tencentcloud_vpc_instances" "foo" {
# Create EIP
resource "tencentcloud_eip" "eip_dev_dnat" {
name = "terraform_test"
}
resource "tencentcloud_eip" "eip_test_dnat" {
name = "terraform_test"
}
resource "tencentcloud_eip" "new_eip" {
name = "terraform_test"
Expand Down
111 changes: 111 additions & 0 deletions tencentcloud/service_tencentcloud_vpc.go
Original file line number Diff line number Diff line change
Expand Up @@ -2025,6 +2025,91 @@ func (me *VpcService) AttachEip(ctx context.Context, eipId, instanceId string) e
return nil
}

func (me *VpcService) DescribeNatGatewayById(ctx context.Context, natGateWayId string) (natGateWay *vpc.NatGateway, errRet error) {
logId := getLogId(ctx)
request := vpc.NewDescribeNatGatewaysRequest()
request.NatGatewayIds = []*string{&natGateWayId}
defer func() {
if errRet != nil {
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
logId, request.GetAction(), request.ToJsonString(), errRet.Error())
}
}()

ratelimit.Check(request.GetAction())
response, err := me.client.UseVpcClient().DescribeNatGateways(request)

if err != nil {
errRet = err
return
}

log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())

if len(response.Response.NatGatewaySet) > 0 {
natGateWay = response.Response.NatGatewaySet[0]
}

return
}

func (me *VpcService) DisassociateNatGatewayAddress(ctx context.Context, request *vpc.DisassociateNatGatewayAddressRequest) (errRet error) {
logId := getLogId(ctx)
defer func() {
if errRet != nil {
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
logId, request.GetAction(), request.ToJsonString(), errRet.Error())
}
}()

// Check if Nat Gateway Ip still associate
gateway, err := me.DescribeNatGatewayById(ctx, *request.NatGatewayId)

if err != nil {
errRet = err
return
}

if gateway == nil || len(gateway.PublicIpAddressSet) == 0 {
return
}

var gatewayAddresses []string
var candidates []*string

for i := range gateway.PublicIpAddressSet {
addr := gateway.PublicIpAddressSet[i].PublicIpAddress
gatewayAddresses = append(gatewayAddresses, *addr)
}

for i := range request.PublicIpAddresses {
addr := request.PublicIpAddresses[i]
if helper.StringsContain(gatewayAddresses, *addr) {
candidates = append(candidates, addr)
}
}

if len(candidates) == 0 {
return nil
}

request.PublicIpAddresses = candidates

ratelimit.Check(request.GetAction())
response, err := me.client.UseVpcClient().DisassociateNatGatewayAddress(request)

if err != nil {
errRet = err
return
}

log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())

return
}

func (me *VpcService) UnattachEip(ctx context.Context, eipId string) error {
eipUnattachLocker.Lock()
defer eipUnattachLocker.Unlock()
Expand All @@ -2038,6 +2123,32 @@ func (me *VpcService) UnattachEip(ctx context.Context, eipId string) error {
return nil
}

// DisassociateAddress Doesn't support Disassociate NAT Address
if strings.HasPrefix(*eip.InstanceId, "nat-") {
request := vpc.NewDisassociateNatGatewayAddressRequest()
request.NatGatewayId = eip.InstanceId
request.PublicIpAddresses = []*string{eip.AddressIp}
err := me.DisassociateNatGatewayAddress(ctx, request)
if err != nil {
return err
}

outErr := resource.Retry(readRetryTimeout*3, func() *resource.RetryError {
eip, err := me.DescribeEipById(ctx, eipId)
if err != nil {
return retryError(err)
}
if eip != nil && *eip.AddressStatus != EIP_STATUS_UNBIND {
return resource.RetryableError(fmt.Errorf("eip is still %s", EIP_STATUS_UNBIND))
}
return nil
})

if outErr != nil {
return outErr
}
}

request := vpc.NewDisassociateAddressRequest()
request.AddressId = &eipId
ratelimit.Check(request.GetAction())
Expand Down