Skip to content

Commit 31cde71

Browse files
author
hellertang
authored
add havip sweeper (#962)
1 parent 95a92f8 commit 31cde71

File tree

2 files changed

+119
-1
lines changed

2 files changed

+119
-1
lines changed

tencentcloud/resource_tc_ha_vip_test.go

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package tencentcloud
22

33
import (
4+
"context"
45
"fmt"
56
"log"
7+
"strings"
68
"testing"
9+
"time"
710

811
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
912
"github.com/hashicorp/terraform-plugin-sdk/terraform"
@@ -12,6 +15,56 @@ import (
1215
vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
1316
)
1417

18+
func init() {
19+
resource.AddTestSweepers("tencentcloud_ha_vip", &resource.Sweeper{
20+
Name: "tencentcloud_ha_vip",
21+
F: testSweepHaVipInstance,
22+
})
23+
}
24+
25+
func testSweepHaVipInstance(region string) error {
26+
logId := getLogId(contextNil)
27+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
28+
29+
sharedClient, err := sharedClientForRegion(region)
30+
if err != nil {
31+
return fmt.Errorf("getting tencentcloud client error: %s", err.Error())
32+
}
33+
client := sharedClient.(*TencentCloudClient)
34+
35+
vpcService := VpcService{
36+
client: client.apiV3Conn,
37+
}
38+
39+
instances, err := vpcService.DescribeHaVipByFilter(ctx, nil)
40+
if err != nil {
41+
return fmt.Errorf("get instance list error: %s", err.Error())
42+
}
43+
44+
for _, v := range instances {
45+
instanceId := *v.HaVipId
46+
instanceName := *v.HaVipName
47+
48+
now := time.Now()
49+
50+
createTime := stringTotime(*v.CreatedTime)
51+
interval := now.Sub(createTime).Minutes()
52+
if strings.HasPrefix(instanceName, keepResource) || strings.HasPrefix(instanceName, defaultResource) {
53+
continue
54+
}
55+
// less than 30 minute, not delete
56+
if needProtect == 1 && int64(interval) < 30 {
57+
continue
58+
}
59+
60+
if err = vpcService.DeleteHaVip(ctx, instanceId); err != nil {
61+
log.Printf("[ERROR] sweep instance %s error: %s", instanceId, err.Error())
62+
}
63+
}
64+
65+
return nil
66+
}
67+
1568
func TestAccTencentCloudHaVip_basic(t *testing.T) {
1669
t.Parallel()
1770
resource.Test(t, resource.TestCase{
@@ -173,6 +226,6 @@ resource "tencentcloud_ha_vip" "havip" {
173226
name = "terraform_test"
174227
vpc_id = var.vpc_id
175228
subnet_id = var.subnet_id
176-
vip = "172.16.0.255"
229+
vip = "172.16.0.137"
177230
}
178231
`

tencentcloud/service_tencentcloud_vpc.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2904,6 +2904,50 @@ func (me *VpcService) DescribeEniByFilters(
29042904
return me.describeEnis(ctx, nil, vpcId, subnetId, nil, cvmId, sgId, name, desc, ipv4, tags)
29052905
}
29062906

2907+
func (me *VpcService) DescribeHaVipByFilter(ctx context.Context, filters map[string]string) (instances []*vpc.HaVip, errRet error) {
2908+
var (
2909+
logId = getLogId(ctx)
2910+
request = vpc.NewDescribeHaVipsRequest()
2911+
)
2912+
request.Filters = make([]*vpc.Filter, 0, len(filters))
2913+
for k, v := range filters {
2914+
filter := vpc.Filter{
2915+
Name: helper.String(k),
2916+
Values: []*string{helper.String(v)},
2917+
}
2918+
request.Filters = append(request.Filters, &filter)
2919+
}
2920+
2921+
var offset uint64 = 0
2922+
var pageSize uint64 = 100
2923+
instances = make([]*vpc.HaVip, 0)
2924+
2925+
for {
2926+
request.Offset = &offset
2927+
request.Limit = &pageSize
2928+
ratelimit.Check(request.GetAction())
2929+
response, err := me.client.UseVpcClient().DescribeHaVips(request)
2930+
if err != nil {
2931+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
2932+
logId, request.GetAction(), request.ToJsonString(), err.Error())
2933+
errRet = err
2934+
return
2935+
}
2936+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
2937+
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
2938+
2939+
if response == nil || len(response.Response.HaVipSet) < 1 {
2940+
break
2941+
}
2942+
instances = append(instances, response.Response.HaVipSet...)
2943+
if len(response.Response.HaVipSet) < int(pageSize) {
2944+
break
2945+
}
2946+
offset += pageSize
2947+
}
2948+
return
2949+
}
2950+
29072951
func (me *VpcService) DescribeHaVipEipById(ctx context.Context, haVipEipAttachmentId string) (eip string, haVip string, has bool, errRet error) {
29082952
logId := getLogId(ctx)
29092953
client := me.client.UseVpcClient()
@@ -2953,6 +2997,27 @@ func (me *VpcService) DescribeHaVipEipById(ctx context.Context, haVipEipAttachme
29532997
return eip, haVip, has, errRet
29542998
}
29552999

3000+
func (me *VpcService) DeleteHaVip(ctx context.Context, haVipId string) (errRet error) {
3001+
logId := getLogId(ctx)
3002+
request := vpc.NewDeleteHaVipRequest()
3003+
defer func() {
3004+
if errRet != nil {
3005+
log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error())
3006+
}
3007+
}()
3008+
request.HaVipId = &haVipId
3009+
3010+
errRet = resource.Retry(writeRetryTimeout, func() *resource.RetryError {
3011+
ratelimit.Check(request.GetAction())
3012+
_, errRet = me.client.UseVpcClient().DeleteHaVip(request)
3013+
if errRet != nil {
3014+
return retryError(errRet, InternalError)
3015+
}
3016+
return nil
3017+
})
3018+
return
3019+
}
3020+
29563021
func waitEniReady(ctx context.Context, id string, client *vpc.Client, wantIpv4s []string, dropIpv4s []string) error {
29573022
logId := getLogId(ctx)
29583023

0 commit comments

Comments
 (0)