diff --git a/tencentcloud/resource_tc_eip_test.go b/tencentcloud/resource_tc_eip_test.go index f851b9a14f..e26b2483b6 100644 --- a/tencentcloud/resource_tc_eip_test.go +++ b/tencentcloud/resource_tc_eip_test.go @@ -3,13 +3,69 @@ package tencentcloud import ( "context" "fmt" + "log" "os" + "strings" "testing" + "time" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/terraform" ) +func init() { + resource.AddTestSweepers("tencentcloud_eip", &resource.Sweeper{ + Name: "tencentcloud_eip", + F: testSweepEipInstance, + }) +} + +func testSweepEipInstance(region string) error { + logId := getLogId(contextNil) + ctx := context.WithValue(context.TODO(), logIdKey, logId) + + sharedClient, err := sharedClientForRegion(region) + if err != nil { + return fmt.Errorf("getting tencentcloud client error: %s", err.Error()) + } + client := sharedClient.(*TencentCloudClient) + + vpcService := VpcService{ + client: client.apiV3Conn, + } + + instances, err := vpcService.DescribeEipByFilter(ctx, nil) + if err != nil { + return fmt.Errorf("get instance list error: %s", err.Error()) + } + + for _, v := range instances { + instanceId := *v.AddressId + print(instanceId) + instanceName := v.AddressName + + now := time.Now() + + createTime := stringTotime(*v.CreatedTime) + interval := now.Sub(createTime).Minutes() + if instanceName != nil { + if strings.HasPrefix(*instanceName, keepResource) || strings.HasPrefix(*instanceName, defaultResource) { + continue + } + } + + // less than 30 minute, not delete + if int64(interval) < 30 { + continue + } + + if err = vpcService.DeleteEip(ctx, instanceId); err != nil { + log.Printf("[ERROR] sweep instance %s error: %s", instanceId, err.Error()) + } + } + return nil +} + func TestAccTencentCloudEip_basic(t *testing.T) { t.Parallel() resource.Test(t, resource.TestCase{ diff --git a/tencentcloud/resource_tc_eni_test.go b/tencentcloud/resource_tc_eni_test.go index 6060e96bc9..7ad11ad3c9 100644 --- a/tencentcloud/resource_tc_eni_test.go +++ b/tencentcloud/resource_tc_eni_test.go @@ -4,12 +4,67 @@ import ( "context" "errors" "fmt" + "log" + "strings" "testing" + "time" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/terraform" ) +func init() { + resource.AddTestSweepers("tencentcloud_eni", &resource.Sweeper{ + Name: "tencentcloud_eni", + F: testSweepEniInstance, + }) +} + +func testSweepEniInstance(region string) error { + logId := getLogId(contextNil) + ctx := context.WithValue(context.TODO(), logIdKey, logId) + + sharedClient, err := sharedClientForRegion(region) + if err != nil { + return fmt.Errorf("getting tencentcloud client error: %s", err.Error()) + } + client := sharedClient.(*TencentCloudClient) + + vpcService := VpcService{ + client: client.apiV3Conn, + } + + instances, err := vpcService.DescribeEniByFilters(ctx, nil, nil, nil, nil, nil, nil,nil,nil) + if err != nil { + return fmt.Errorf("get instance list error: %s", err.Error()) + } + + for _, v := range instances { + instanceId := *v.NetworkInterfaceId + instanceName := v.NetworkInterfaceName + + now := time.Now() + + createTime := stringTotime(*v.CreatedTime) + interval := now.Sub(createTime).Minutes() + if instanceName != nil { + if strings.HasPrefix(*instanceName, keepResource) || strings.HasPrefix(*instanceName, defaultResource) { + continue + } + } + + // less than 30 minute, not delete + if int64(interval) < 30 { + continue + } + + if err = vpcService.DeleteEni(ctx, instanceId); err != nil { + log.Printf("[ERROR] sweep instance %s error: %s", instanceId, err.Error()) + } + } + return nil +} + func TestAccTencentCloudEni_basic(t *testing.T) { t.Parallel() var eniId string diff --git a/tencentcloud/resource_tc_nat_gateway_test.go b/tencentcloud/resource_tc_nat_gateway_test.go index d553080f2d..7e93da70f4 100644 --- a/tencentcloud/resource_tc_nat_gateway_test.go +++ b/tencentcloud/resource_tc_nat_gateway_test.go @@ -1,15 +1,70 @@ package tencentcloud import ( + "context" "fmt" "log" + "strings" "testing" + "time" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/terraform" vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312" ) +func init() { + resource.AddTestSweepers("tencentcloud_nat", &resource.Sweeper{ + Name: "tencentcloud_nat", + F: testSweepNatInstance, + }) +} + +func testSweepNatInstance(region string) error { + logId := getLogId(contextNil) + ctx := context.WithValue(context.TODO(), logIdKey, logId) + + sharedClient, err := sharedClientForRegion(region) + if err != nil { + return fmt.Errorf("getting tencentcloud client error: %s", err.Error()) + } + client := sharedClient.(*TencentCloudClient) + + vpcService := VpcService{ + client: client.apiV3Conn, + } + + instances, err := vpcService.DescribeNatGatewayByFilter(ctx, nil) + if err != nil { + return fmt.Errorf("get instance list error: %s", err.Error()) + } + + for _, v := range instances { + instanceId := *v.NatGatewayId + instanceName := v.NatGatewayName + + now := time.Now() + + createTime := stringTotime(*v.CreatedTime) + interval := now.Sub(createTime).Minutes() + if instanceName != nil { + if strings.HasPrefix(*instanceName, keepResource) || strings.HasPrefix(*instanceName, defaultResource) { + continue + } + } + + // less than 30 minute, not delete + if int64(interval) < 30 { + continue + } + + if err = vpcService.DeleteNatGateway(ctx, instanceId); err != nil { + log.Printf("[ERROR] sweep instance %s error: %s", instanceId, err.Error()) + } + } + return nil +} + func TestAccTencentCloudNatGateway_basic(t *testing.T) { t.Parallel() resource.Test(t, resource.TestCase{ diff --git a/tencentcloud/service_tencentcloud_vpc.go b/tencentcloud/service_tencentcloud_vpc.go index bea4327525..f9b30e61f7 100644 --- a/tencentcloud/service_tencentcloud_vpc.go +++ b/tencentcloud/service_tencentcloud_vpc.go @@ -2058,6 +2058,71 @@ func (me *VpcService) DescribeNatGatewayById(ctx context.Context, natGateWayId s return } +func (me *VpcService) DescribeNatGatewayByFilter(ctx context.Context, filters map[string]string) (instances []*vpc.NatGateway, errRet error) { + var ( + logId = getLogId(ctx) + request = vpc.NewDescribeNatGatewaysRequest() + ) + request.Filters = make([]*vpc.Filter, 0, len(filters)) + for k, v := range filters { + filter := vpc.Filter{ + Name: helper.String(k), + Values: []*string{helper.String(v)}, + } + request.Filters = append(request.Filters, &filter) + } + + var offset uint64 = 0 + var pageSize uint64 = 100 + instances = make([]*vpc.NatGateway, 0) + + for { + request.Offset = &offset + request.Limit = &pageSize + ratelimit.Check(request.GetAction()) + response, err := me.client.UseVpcClient().DescribeNatGateways(request) + if err != nil { + log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", + logId, request.GetAction(), request.ToJsonString(), err.Error()) + 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 response == nil || len(response.Response.NatGatewaySet) < 1 { + break + } + instances = append(instances, response.Response.NatGatewaySet...) + if len(response.Response.NatGatewaySet) < int(pageSize) { + break + } + offset += pageSize + } + return +} + +func (me *VpcService) DeleteNatGateway(ctx context.Context, natGatewayId string) (errRet error) { + logId := getLogId(ctx) + request := vpc.NewDeleteNatGatewayRequest() + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) + } + }() + request.NatGatewayId = &natGatewayId + + errRet = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + _, errRet = me.client.UseVpcClient().DeleteNatGateway(request) + if errRet != nil { + return retryError(errRet, InternalError) + } + return nil + }) + return +} + func (me *VpcService) DisassociateNatGatewayAddress(ctx context.Context, request *vpc.DisassociateNatGatewayAddressRequest) (errRet error) { logId := getLogId(ctx) defer func() {