Skip to content

Commit 126bedc

Browse files
tongyimingmikatong
andauthored
fix cvm release private ip (#2509)
* fix cvm release private ip * add changelog --------- Co-authored-by: mikatong <mikatong@tencent.com>
1 parent 57cf580 commit 126bedc

File tree

3 files changed

+85
-18
lines changed

3 files changed

+85
-18
lines changed

.changelog/2509.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
```release-note:enhancement
2+
resource/tencentcloud_instance: fix private ip release problem
3+
```
4+

tencentcloud/services/cvm/resource_tc_instance.go

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1455,30 +1455,17 @@ func resourceTencentCloudInstanceDelete(d *schema.ResourceData, meta interface{}
14551455
return err
14561456
}
14571457

1458-
// wait ip release
1459-
if len(instance.PrivateIpAddresses) > 0 {
1460-
vpcService := vpc.NewVpcService(meta.(tccommon.ProviderMeta).GetAPIV3Conn())
1461-
params := make(map[string]interface{})
1462-
params["VpcId"] = instance.VirtualPrivateCloud.VpcId
1463-
params["SubnetId"] = instance.VirtualPrivateCloud.SubnetId
1464-
params["IpAddresses"] = instance.PrivateIpAddresses
1465-
err := resource.Retry(5*tccommon.ReadRetryTimeout, func() *resource.RetryError {
1466-
usedIpAddress, errRet := vpcService.DescribeVpcUsedIpAddressByFilter(ctx, params)
1467-
if errRet != nil {
1468-
return tccommon.RetryError(errRet, tccommon.InternalError)
1469-
}
1470-
if len(usedIpAddress) > 0 {
1471-
return resource.RetryableError(fmt.Errorf("wait cvm private ip release..."))
1472-
}
1458+
vpcService := vpc.NewVpcService(meta.(tccommon.ProviderMeta).GetAPIV3Conn())
14731459

1474-
return nil
1475-
})
1460+
if notExist {
1461+
err := waitIpRelease(ctx, vpcService, instance)
14761462
if err != nil {
14771463
return err
14781464
}
1465+
return nil
14791466
}
14801467

1481-
if notExist || !forceDelete {
1468+
if !forceDelete {
14821469
return nil
14831470
}
14841471

@@ -1592,6 +1579,11 @@ func resourceTencentCloudInstanceDelete(d *schema.ResourceData, meta interface{}
15921579
}
15931580
}
15941581
}
1582+
1583+
err = waitIpRelease(ctx, vpcService, instance)
1584+
if err != nil {
1585+
return err
1586+
}
15951587
return nil
15961588
}
15971589

@@ -1702,3 +1694,28 @@ func waitForOperationFinished(d *schema.ResourceData, meta interface{}, timeout
17021694
}
17031695
return nil
17041696
}
1697+
1698+
func waitIpRelease(ctx context.Context, vpcService vpc.VpcService, instance *cvm.Instance) error {
1699+
// wait ip release
1700+
if len(instance.PrivateIpAddresses) > 0 {
1701+
params := make(map[string]interface{})
1702+
params["VpcId"] = instance.VirtualPrivateCloud.VpcId
1703+
params["SubnetId"] = instance.VirtualPrivateCloud.SubnetId
1704+
params["IpAddresses"] = instance.PrivateIpAddresses
1705+
err := resource.Retry(5*tccommon.ReadRetryTimeout, func() *resource.RetryError {
1706+
usedIpAddress, errRet := vpcService.DescribeVpcUsedIpAddressByFilter(ctx, params)
1707+
if errRet != nil {
1708+
return tccommon.RetryError(errRet, tccommon.InternalError)
1709+
}
1710+
if len(usedIpAddress) > 0 {
1711+
return resource.RetryableError(fmt.Errorf("wait cvm private ip release..."))
1712+
}
1713+
1714+
return nil
1715+
})
1716+
if err != nil {
1717+
return err
1718+
}
1719+
}
1720+
return nil
1721+
}

tencentcloud/services/cvm/resource_tc_instance_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,32 @@ func TestAccTencentCloudInstanceResource_Basic(t *testing.T) {
102102
})
103103
}
104104

105+
func TestAccTencentCloudInstanceResource_PrepaidBasic(t *testing.T) {
106+
t.Parallel()
107+
108+
id := "tencentcloud_instance.cvm_prepaid_basic"
109+
resource.Test(t, resource.TestCase{
110+
PreCheck: func() { tcacctest.AccPreCheck(t) },
111+
IDRefreshName: id,
112+
Providers: tcacctest.AccProviders,
113+
Steps: []resource.TestStep{
114+
{
115+
Config: testAccTencentCloudInstancePrepaidBasic,
116+
Check: resource.ComposeTestCheckFunc(
117+
tcacctest.AccCheckTencentCloudDataSourceID(id),
118+
testAccCheckTencentCloudInstanceExists(id),
119+
resource.TestCheckResourceAttr(id, "instance_status", "RUNNING"),
120+
resource.TestCheckResourceAttrSet(id, "private_ip"),
121+
resource.TestCheckResourceAttrSet(id, "vpc_id"),
122+
resource.TestCheckResourceAttrSet(id, "subnet_id"),
123+
resource.TestCheckResourceAttrSet(id, "project_id"),
124+
resource.TestCheckResourceAttr(id, "tags.hostname", "tci"),
125+
),
126+
},
127+
},
128+
})
129+
}
130+
105131
func TestAccTencentCloudInstanceResource_WithDataDisk(t *testing.T) {
106132
t.Parallel()
107133

@@ -756,6 +782,26 @@ resource "tencentcloud_instance" "cvm_basic" {
756782
}
757783
`
758784

785+
const testAccTencentCloudInstancePrepaidBasic = tcacctest.DefaultInstanceVariable + `
786+
resource "tencentcloud_instance" "cvm_prepaid_basic" {
787+
instance_name = var.instance_name
788+
availability_zone = var.availability_cvm_zone
789+
image_id = data.tencentcloud_images.default.images.0.image_id
790+
instance_type = data.tencentcloud_instance_types.default.instance_types.0.instance_type
791+
vpc_id = var.cvm_vpc_id
792+
subnet_id = var.cvm_subnet_id
793+
system_disk_type = "CLOUD_PREMIUM"
794+
project_id = 0
795+
instance_charge_type = "PREPAID"
796+
instance_charge_type_prepaid_period = 1
797+
instance_charge_type_prepaid_renew_flag = "NOTIFY_AND_MANUAL_RENEW"
798+
force_delete = true
799+
tags = {
800+
hostname = "tci"
801+
}
802+
}
803+
`
804+
759805
const testAccTencentCloudInstanceWithDataDiskOrder = tcacctest.DefaultInstanceVariable + `
760806
resource "tencentcloud_instance" "foo" {
761807
instance_name = var.instance_name

0 commit comments

Comments
 (0)