Skip to content

Commit 7188206

Browse files
tongyimingmikatong
andauthored
fix: add emr sweeper (#960)
* fix: add emr sweeper * add emr sweeper Co-authored-by: mikatong <mikatong@tencent.com>
1 parent 48e1c8c commit 7188206

File tree

4 files changed

+127
-12
lines changed

4 files changed

+127
-12
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
resource "tencentcloud_security_group" "emr-sg" {
2+
name = "keep-tf-emr-sg"
3+
description = "EMR预留安全组"
4+
project_id = 0
5+
}

tencentcloud/basic_test.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,27 @@ const (
9393

9494
defaultTkeOSImageId = "img-2lr9q49h"
9595
defaultTkeOSImageName = "tlinux2.2(tkernel3)x86_64"
96-
defaultEMRSgId = "sg-mag8k2fj"
9796
)
9897

98+
// EMR
99+
const (
100+
defaultEMRVpcId = defaultVpcId
101+
defaultEMRSubnetId = defaultSubnetId
102+
defaultEMRSgId = "sg-694qit0p"
103+
)
104+
105+
const defaultEMRVariable = `
106+
variable "vpc_id" {
107+
default = "` + defaultEMRVpcId + `"
108+
}
109+
variable "subnet_id" {
110+
default = "` + defaultEMRSubnetId + `"
111+
}
112+
variable "sg_id" {
113+
default = "` + defaultEMRSgId + `"
114+
}
115+
`
116+
99117
//ckafka
100118
const (
101119
defaultKafkaInstanceId = "ckafka-vv7wpvae"

tencentcloud/data_source_tc_emr_nodes_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func TestAccDataSourceTencentCloudEMRNodes(t *testing.T) {
2424
}
2525

2626
func testAccEMRNodes() string {
27-
return testEmrBasic() + `
27+
return testEmrBasic + `
2828
data "tencentcloud_emr_nodes" "my_emr_nodes" {
2929
node_flag="master"
3030
instance_id=tencentcloud_emr_cluster.emrrrr.instance_id

tencentcloud/resource_tc_emr_cluster_test.go

Lines changed: 102 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,106 @@ import (
44
"context"
55
"fmt"
66
"log"
7+
"strings"
78
"testing"
9+
"time"
810

911
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
1012
"github.com/hashicorp/terraform-plugin-sdk/terraform"
13+
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
14+
emr "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/emr/v20190103"
1115
)
1216

17+
func init() {
18+
// go test -v ./tencentcloud -sweep=ap-guangzhou -sweep-run=tencentcloud_emr
19+
resource.AddTestSweepers("tencentcloud_emr", &resource.Sweeper{
20+
Name: "tencentcloud_emr",
21+
F: func(r string) error {
22+
logId := getLogId(contextNil)
23+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
24+
sharedClient, err := sharedClientForRegion(r)
25+
if err != nil {
26+
return fmt.Errorf("getting tencentcloud client error: %s", err.Error())
27+
}
28+
client := sharedClient.(*TencentCloudClient)
29+
30+
emrService := EMRService{client: client.apiV3Conn}
31+
filters := make(map[string]interface{})
32+
filters["display_strategy"] = DisplayStrategyIsclusterList
33+
clusters, err := emrService.DescribeInstances(ctx, filters)
34+
if err != nil {
35+
return nil
36+
}
37+
for _, cluster := range clusters {
38+
clusterName := *cluster.ClusterName
39+
if strings.HasPrefix(clusterName, keepResource) || strings.HasPrefix(clusterName, defaultResource) {
40+
continue
41+
}
42+
now := time.Now()
43+
createTime := stringTotime(*cluster.AddTime)
44+
interval := now.Sub(createTime).Minutes()
45+
// less than 30 minute, not delete
46+
if needProtect == 1 && int64(interval) < 30 {
47+
continue
48+
}
49+
metaDB := cluster.MetaDb
50+
instanceId := *cluster.ClusterId
51+
request := emr.NewTerminateInstanceRequest()
52+
request.InstanceId = &instanceId
53+
if _, err = emrService.client.UseEmrClient().TerminateInstance(request); err != nil {
54+
return nil
55+
}
56+
err = resource.Retry(10*readRetryTimeout, func() *resource.RetryError {
57+
clusters, err := emrService.DescribeInstancesById(ctx, instanceId, DisplayStrategyIsclusterList)
58+
59+
if e, ok := err.(*errors.TencentCloudSDKError); ok {
60+
if e.GetCode() == "InternalError.ClusterNotFound" {
61+
return nil
62+
}
63+
if e.GetCode() == "UnauthorizedOperation" {
64+
return nil
65+
}
66+
}
67+
68+
if len(clusters) > 0 {
69+
status := *(clusters[0].Status)
70+
if status != EmrInternetStatusDeleted {
71+
return resource.RetryableError(
72+
fmt.Errorf("%v create cluster endpoint status still is %v", instanceId, status))
73+
}
74+
}
75+
76+
if err != nil {
77+
return resource.RetryableError(err)
78+
}
79+
return nil
80+
})
81+
if err != nil {
82+
return nil
83+
}
84+
85+
if metaDB != nil && *metaDB != "" {
86+
// remove metadb
87+
mysqlService := MysqlService{client: client.apiV3Conn}
88+
89+
err = resource.Retry(writeRetryTimeout, func() *resource.RetryError {
90+
err := mysqlService.OfflineIsolatedInstances(ctx, *metaDB)
91+
if err != nil {
92+
return retryError(err, InternalError)
93+
}
94+
return nil
95+
})
96+
97+
if err != nil {
98+
return nil
99+
}
100+
}
101+
}
102+
return nil
103+
},
104+
})
105+
}
106+
13107
var testEmrClusterResourceKey = "tencentcloud_emr_cluster.emrrrr"
14108

15109
func TestAccTencentCloudEmrClusterResource(t *testing.T) {
@@ -19,13 +113,13 @@ func TestAccTencentCloudEmrClusterResource(t *testing.T) {
19113
Providers: testAccProviders,
20114
Steps: []resource.TestStep{
21115
{
22-
Config: testEmrBasic(),
116+
Config: testEmrBasic,
23117
Check: resource.ComposeTestCheckFunc(
24118
testAccCheckEmrExists(testEmrClusterResourceKey),
25119
resource.TestCheckResourceAttr(testEmrClusterResourceKey, "product_id", "4"),
26120
resource.TestCheckResourceAttr(testEmrClusterResourceKey, "display_strategy", "clusterList"),
27-
resource.TestCheckResourceAttr(testEmrClusterResourceKey, "vpc_settings.vpc_id", defaultVpcId),
28-
resource.TestCheckResourceAttr(testEmrClusterResourceKey, "vpc_settings.subnet_id", defaultSubnetId),
121+
resource.TestCheckResourceAttr(testEmrClusterResourceKey, "vpc_settings.vpc_id", defaultEMRVpcId),
122+
resource.TestCheckResourceAttr(testEmrClusterResourceKey, "vpc_settings.subnet_id", defaultEMRSubnetId),
29123
resource.TestCheckResourceAttr(testEmrClusterResourceKey, "softwares.0", "zookeeper-3.6.1"),
30124
resource.TestCheckResourceAttr(testEmrClusterResourceKey, "support_ha", "0"),
31125
resource.TestCheckResourceAttr(testEmrClusterResourceKey, "instance_name", "emr-test-demo"),
@@ -88,14 +182,13 @@ func testAccCheckEmrExists(n string) resource.TestCheckFunc {
88182
}
89183
}
90184

91-
func testEmrBasic() string {
92-
return fmt.Sprintf(`
185+
const testEmrBasic = defaultEMRVariable + `
93186
resource "tencentcloud_emr_cluster" "emrrrr" {
94187
product_id=4
95188
display_strategy="clusterList"
96189
vpc_settings={
97-
vpc_id="%s"
98-
subnet_id:"%s"
190+
vpc_id=var.vpc_id
191+
subnet_id=var.subnet_id
99192
}
100193
softwares=[
101194
"zookeeper-3.6.1",
@@ -134,7 +227,6 @@ resource "tencentcloud_emr_cluster" "emrrrr" {
134227
zone="ap-guangzhou-3"
135228
project_id=0
136229
}
137-
sg_id="%s"
230+
sg_id=var.sg_id
138231
}
139-
`, defaultVpcId, defaultSubnetId, defaultEMRSgId)
140-
}
232+
`

0 commit comments

Comments
 (0)