From 88d954b3dd6babbcc343e6659e758abfd2488019 Mon Sep 17 00:00:00 2001 From: hellertang Date: Mon, 7 Mar 2022 10:47:37 +0800 Subject: [PATCH] add vpngw sweeper and fix cvm sweeper --- tencentcloud/resource_tc_instance_test.go | 2 +- tencentcloud/resource_tc_vpn_gateway_test.go | 44 +++++++++++++ tencentcloud/service_tencentcloud_vpc.go | 65 ++++++++++++++++++++ 3 files changed, 110 insertions(+), 1 deletion(-) diff --git a/tencentcloud/resource_tc_instance_test.go b/tencentcloud/resource_tc_instance_test.go index 78f19921cc..63f02d95db 100644 --- a/tencentcloud/resource_tc_instance_test.go +++ b/tencentcloud/resource_tc_instance_test.go @@ -26,7 +26,7 @@ func testSweepCvmInstance(region string) error { if err != nil { return fmt.Errorf("getting tencentcloud client error: %s", err.Error()) } - client := sharedClient.(TencentCloudClient) + client := sharedClient.(*TencentCloudClient) cvmService := CvmService{ client: client.apiV3Conn, diff --git a/tencentcloud/resource_tc_vpn_gateway_test.go b/tencentcloud/resource_tc_vpn_gateway_test.go index 152a6737cd..ffa6ecd0cd 100644 --- a/tencentcloud/resource_tc_vpn_gateway_test.go +++ b/tencentcloud/resource_tc_vpn_gateway_test.go @@ -1,6 +1,7 @@ package tencentcloud import ( + "context" "fmt" "log" "testing" @@ -11,6 +12,49 @@ import ( vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312" ) +func init() { + resource.AddTestSweepers("tencentcloud_vpn_gateway", &resource.Sweeper{ + Name: "tencentcloud_vpn_gateway", + F: testSweepVpnGateway, + }) +} + +func testSweepVpnGateway(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.DescribeVpnGwByFilter(ctx, nil) + if err != nil { + return fmt.Errorf("get instance list error: %s", err.Error()) + } + + for _, v := range instances { + vpnGwId := *v.VpnGatewayId + + //if !strings.HasPrefix(instanceName, defaultInsName) { + // continue + //} + + instanceId := *v.VpnGatewayId + + if err = vpcService.DeleteVpnGateway(ctx, vpnGwId); err != nil { + log.Printf("[ERROR] sweep instance %s error: %s", instanceId, err.Error()) + } + } + + return nil +} + func TestAccTencentCloudVpnGateway_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 c27bb79e1f..a79575447b 100644 --- a/tencentcloud/service_tencentcloud_vpc.go +++ b/tencentcloud/service_tencentcloud_vpc.go @@ -3537,6 +3537,71 @@ func (me *VpcService) DescribeVpngwById(ctx context.Context, vpngwId string) (ha return } +func (me *VpcService) DescribeVpnGwByFilter(ctx context.Context, filters map[string]string) (instances []*vpc.VpnGateway, errRet error) { + var ( + logId = getLogId(ctx) + request = vpc.NewDescribeVpnGatewaysRequest() + ) + request.Filters = make([]*vpc.FilterObject, 0, len(filters)) + for k, v := range filters { + filter := vpc.FilterObject{ + 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.VpnGateway, 0) + + for { + request.Offset = &offset + request.Limit = &pageSize + ratelimit.Check(request.GetAction()) + response, err := me.client.UseVpcClient().DescribeVpnGateways(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.VpnGatewaySet) < 1 { + break + } + instances = append(instances, response.Response.VpnGatewaySet...) + if len(response.Response.VpnGatewaySet) < int(pageSize) { + break + } + offset += pageSize + } + return +} + +func (me *VpcService) DeleteVpnGateway(ctx context.Context, vpnGatewayId string) (errRet error) { + logId := getLogId(ctx) + request := vpc.NewDeleteVpnGatewayRequest() + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) + } + }() + request.VpnGatewayId = &vpnGatewayId + + errRet = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + _, errRet = me.client.UseVpcClient().DeleteVpnGateway(request) + if errRet != nil { + return retryError(errRet, InternalError) + } + return nil + }) + return +} + func (me *VpcService) CreateAddressTemplate(ctx context.Context, name string, addresses []interface{}) (templateId string, errRet error) { logId := getLogId(ctx) request := vpc.NewCreateAddressTemplateRequest()