Skip to content

Commit 94aa6ed

Browse files
gitmknanonymoushellertang
authored
feat: es supoort sg (#1956)
* feat: es supoort sg * fix: merge master * fix: fmt * feat: add changelog * update forcenew --------- Co-authored-by: anonymous <anonymous@mail.org> Co-authored-by: hellertang <hellertang@tencent.com>
1 parent 177a06d commit 94aa6ed

File tree

14 files changed

+4994
-707
lines changed

14 files changed

+4994
-707
lines changed

.changelog/1956.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:new-resource
2+
tencentcloud_elasticsearch_security_group
3+
```

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ require (
5353
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/domain v1.0.414
5454
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dts v1.0.628
5555
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/emr v1.0.287
56-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/es v1.0.383
56+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/es v1.0.699
5757
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap v1.0.514
5858
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.563
5959
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/lighthouse v1.0.656

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -883,6 +883,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/emr v1.0.287 h1:+9COBXA
883883
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/emr v1.0.287/go.mod h1:xRvd0xsyCoviCiMRfJMh5lODPnLx+bnTfENNx6GHzFA=
884884
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/es v1.0.383 h1:OhKvreaRPhwBEButv45yBcu6BvfvR1JAEXbU/NTck94=
885885
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/es v1.0.383/go.mod h1:WLskTV0GsorWBboZsLUWrgj+f1xGOKGzPGCK9275tdU=
886+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/es v1.0.699 h1:7lFObucmWErYOh+5/AzpgerUAFoO72XqhXrAzFltTIo=
887+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/es v1.0.699/go.mod h1:Iq+JZDHZlYu/dcmpT48SLFESqxL+C9GjRKrQHcw+FjQ=
886888
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap v1.0.514 h1:MKSaqFCa4PCzzb2gVV+oFpxsiPmnCf6uDJwxf9eOoNU=
887889
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap v1.0.514/go.mod h1:uTfhkzPZOwop+tSo83QHrMWtesWdQApxJuFZEXGKXH0=
888890
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.563 h1:FoX+MK4vHThvPO6FbP5q98zD8S3n+d5+DbtK7skl++c=

tencentcloud/basic_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1072,3 +1072,21 @@ const (
10721072
)
10731073

10741074
// End of TSE
1075+
1076+
// ES
1077+
const (
1078+
defaultEsInstanceId = "es-5wn36he6"
1079+
defaultEsSecurityGroup = "sg-edmur627"
1080+
)
1081+
1082+
const DefaultEsVariables = `
1083+
variable "instance_id" {
1084+
default = "` + defaultEsInstanceId + `"
1085+
}
1086+
1087+
variable "security_group_id" {
1088+
default = "` + defaultEsSecurityGroup + `"
1089+
}
1090+
`
1091+
1092+
// End of TSE

tencentcloud/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,7 @@ Elasticsearch Service(ES)
502502
503503
Resource
504504
tencentcloud_elasticsearch_instance
505+
tencentcloud_elasticsearch_security_group
505506
506507
Global Application Acceleration(GAAP)
507508
Data Source
@@ -2503,6 +2504,7 @@ func Provider() *schema.Provider {
25032504
"tencentcloud_monitor_tmp_grafana_config": resourceTencentCloudMonitorTmpGrafanaConfig(),
25042505
"tencentcloud_mongodb_standby_instance": resourceTencentCloudMongodbStandbyInstance(),
25052506
"tencentcloud_elasticsearch_instance": resourceTencentCloudElasticsearchInstance(),
2507+
"tencentcloud_elasticsearch_security_group": resourceTencentCloudElasticsearchSecurityGroup(),
25062508
"tencentcloud_postgresql_instance": resourceTencentCloudPostgresqlInstance(),
25072509
"tencentcloud_postgresql_readonly_instance": resourceTencentCloudPostgresqlReadonlyInstance(),
25082510
"tencentcloud_postgresql_readonly_group": resourceTencentCloudPostgresqlReadonlyGroup(),

tencentcloud/resource_tc_cynosdb_upgrade_proxy_version.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@ package tencentcloud
1515
import (
1616
"context"
1717
"fmt"
18+
"log"
19+
"strings"
20+
1821
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1922
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
2023
sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
2124
cynosdb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb/v20190107"
2225
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
23-
"log"
24-
"strings"
2526
)
2627

2728
func resourceTencentCloudCynosdbUpgradeProxyVersion() *schema.Resource {
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
/*
2+
Provides a resource to create a elasticsearch security_group
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_elasticsearch_security_group" "security_group" {
8+
instance_id = "es-5wn36he6"
9+
security_group_ids = [
10+
"sg-mayqdlt1",
11+
"sg-po2q8cg7",
12+
]
13+
}
14+
```
15+
16+
Import
17+
18+
elasticsearch security_group can be imported using the id, e.g.
19+
20+
```
21+
terraform import tencentcloud_elasticsearch_security_group.security_group instance_id
22+
```
23+
*/
24+
package tencentcloud
25+
26+
import (
27+
"context"
28+
"log"
29+
30+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
31+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
32+
elasticsearch "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/es/v20180416"
33+
)
34+
35+
func resourceTencentCloudElasticsearchSecurityGroup() *schema.Resource {
36+
return &schema.Resource{
37+
Create: resourceTencentCloudElasticsearchSecurityGroupCreate,
38+
Read: resourceTencentCloudElasticsearchSecurityGroupRead,
39+
Update: resourceTencentCloudElasticsearchSecurityGroupUpdate,
40+
Delete: resourceTencentCloudElasticsearchSecurityGroupDelete,
41+
Importer: &schema.ResourceImporter{
42+
State: schema.ImportStatePassthrough,
43+
},
44+
Schema: map[string]*schema.Schema{
45+
"instance_id": {
46+
Required: true,
47+
ForceNew: true,
48+
Type: schema.TypeString,
49+
Description: "Instance Id.",
50+
},
51+
52+
"security_group_ids": {
53+
Optional: true,
54+
Type: schema.TypeSet,
55+
Elem: &schema.Schema{
56+
Type: schema.TypeString,
57+
},
58+
Description: "Security group id list.",
59+
},
60+
},
61+
}
62+
}
63+
64+
func resourceTencentCloudElasticsearchSecurityGroupCreate(d *schema.ResourceData, meta interface{}) error {
65+
defer logElapsed("resource.tencentcloud_elasticsearch_security_group.create")()
66+
defer inconsistentCheck(d, meta)()
67+
68+
var instanceId string
69+
if v, ok := d.GetOk("instance_id"); ok {
70+
instanceId = v.(string)
71+
}
72+
73+
d.SetId(instanceId)
74+
75+
return resourceTencentCloudElasticsearchSecurityGroupUpdate(d, meta)
76+
}
77+
78+
func resourceTencentCloudElasticsearchSecurityGroupRead(d *schema.ResourceData, meta interface{}) error {
79+
defer logElapsed("resource.tencentcloud_elasticsearch_security_group.read")()
80+
defer inconsistentCheck(d, meta)()
81+
82+
logId := getLogId(contextNil)
83+
84+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
85+
86+
service := ElasticsearchService{client: meta.(*TencentCloudClient).apiV3Conn}
87+
88+
instanceId := d.Id()
89+
90+
securityGroup, err := service.DescribeInstanceById(ctx, instanceId)
91+
if err != nil {
92+
return err
93+
}
94+
95+
if securityGroup == nil {
96+
d.SetId("")
97+
log.Printf("[WARN]%s resource `ElasticsearchSecurityGroup` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
98+
return nil
99+
}
100+
101+
if securityGroup.InstanceId != nil {
102+
_ = d.Set("instance_id", securityGroup.InstanceId)
103+
}
104+
105+
if securityGroup.SecurityGroups != nil {
106+
_ = d.Set("security_group_ids", securityGroup.SecurityGroups)
107+
}
108+
109+
return nil
110+
}
111+
112+
func resourceTencentCloudElasticsearchSecurityGroupUpdate(d *schema.ResourceData, meta interface{}) error {
113+
defer logElapsed("resource.tencentcloud_elasticsearch_security_group.update")()
114+
defer inconsistentCheck(d, meta)()
115+
116+
logId := getLogId(contextNil)
117+
118+
request := elasticsearch.NewModifyEsVipSecurityGroupRequest()
119+
120+
instanceId := d.Id()
121+
request.InstanceId = &instanceId
122+
123+
if v, ok := d.GetOk("security_group_ids"); ok {
124+
securityGroupIdsSet := v.(*schema.Set).List()
125+
for i := range securityGroupIdsSet {
126+
securityGroupIds := securityGroupIdsSet[i].(string)
127+
request.SecurityGroupIds = append(request.SecurityGroupIds, &securityGroupIds)
128+
}
129+
}
130+
131+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
132+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseEsClient().ModifyEsVipSecurityGroup(request)
133+
if e != nil {
134+
return retryError(e)
135+
} else {
136+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
137+
}
138+
return nil
139+
})
140+
if err != nil {
141+
log.Printf("[CRITAL]%s update elasticsearch securityGroup failed, reason:%+v", logId, err)
142+
return err
143+
}
144+
145+
return resourceTencentCloudElasticsearchSecurityGroupRead(d, meta)
146+
}
147+
148+
func resourceTencentCloudElasticsearchSecurityGroupDelete(d *schema.ResourceData, meta interface{}) error {
149+
defer logElapsed("resource.tencentcloud_elasticsearch_security_group.delete")()
150+
defer inconsistentCheck(d, meta)()
151+
152+
return nil
153+
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package tencentcloud
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"testing"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
10+
)
11+
12+
// go test -i; go test -test.run TestAccTencentCloudElasticsearchSecurityGroupResource_basic -v
13+
func TestAccTencentCloudElasticsearchSecurityGroupResource_basic(t *testing.T) {
14+
t.Parallel()
15+
16+
resource.Test(t, resource.TestCase{
17+
PreCheck: func() { testAccPreCheck(t) },
18+
Providers: testAccProviders,
19+
CheckDestroy: testAccCheckElasticsearchSecurityGroupDestroy,
20+
Steps: []resource.TestStep{
21+
{
22+
Config: testAccElasticsearchSecurityGroup,
23+
Check: resource.ComposeTestCheckFunc(
24+
testAccCheckElasticsearchSecurityGroupExists("tencentcloud_elasticsearch_security_group.security_group"),
25+
resource.TestCheckResourceAttrSet("tencentcloud_elasticsearch_security_group.security_group", "instance_id"),
26+
resource.TestCheckResourceAttrSet("tencentcloud_elasticsearch_security_group.security_group", "security_group_ids.#"),
27+
),
28+
},
29+
{
30+
ResourceName: "tencentcloud_elasticsearch_security_group.security_group",
31+
ImportState: true,
32+
ImportStateVerify: true,
33+
},
34+
{
35+
Config: testAccElasticsearchSecurityGroupUp,
36+
Check: resource.ComposeTestCheckFunc(
37+
testAccCheckElasticsearchSecurityGroupExists("tencentcloud_elasticsearch_security_group.security_group"),
38+
resource.TestCheckResourceAttrSet("tencentcloud_elasticsearch_security_group.security_group", "instance_id"),
39+
),
40+
},
41+
},
42+
})
43+
}
44+
45+
func testAccCheckElasticsearchSecurityGroupDestroy(s *terraform.State) error {
46+
logId := getLogId(contextNil)
47+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
48+
elasticsearchService := ElasticsearchService{
49+
client: testAccProvider.Meta().(*TencentCloudClient).apiV3Conn,
50+
}
51+
for _, rs := range s.RootModule().Resources {
52+
if rs.Type != "tencentcloud_elasticsearch_security_group" {
53+
continue
54+
}
55+
56+
instance, err := elasticsearchService.DescribeInstanceById(ctx, rs.Primary.ID)
57+
if err != nil {
58+
err = resource.Retry(readRetryTimeout, func() *resource.RetryError {
59+
instance, err = elasticsearchService.DescribeInstanceById(ctx, rs.Primary.ID)
60+
if err != nil {
61+
return retryError(err)
62+
}
63+
return nil
64+
})
65+
}
66+
if err != nil {
67+
return err
68+
}
69+
if instance != nil && len(instance.SecurityGroups) > 0 {
70+
return fmt.Errorf("elasticsearch securityGroup still exists: %s", rs.Primary.ID)
71+
}
72+
}
73+
return nil
74+
}
75+
76+
func testAccCheckElasticsearchSecurityGroupExists(n string) resource.TestCheckFunc {
77+
return func(s *terraform.State) error {
78+
logId := getLogId(contextNil)
79+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
80+
81+
rs, ok := s.RootModule().Resources[n]
82+
if !ok {
83+
return fmt.Errorf("elasticsearch instance %s is not found", n)
84+
}
85+
if rs.Primary.ID == "" {
86+
return fmt.Errorf("elasticsearch instance id is not set")
87+
}
88+
elasticsearchService := ElasticsearchService{
89+
client: testAccProvider.Meta().(*TencentCloudClient).apiV3Conn,
90+
}
91+
instance, err := elasticsearchService.DescribeInstanceById(ctx, rs.Primary.ID)
92+
if err != nil {
93+
err = resource.Retry(readRetryTimeout, func() *resource.RetryError {
94+
instance, err = elasticsearchService.DescribeInstanceById(ctx, rs.Primary.ID)
95+
if err != nil {
96+
return retryError(err)
97+
}
98+
return nil
99+
})
100+
}
101+
if err != nil {
102+
return err
103+
}
104+
if instance == nil {
105+
return fmt.Errorf("elasticsearch securityGroup is not found")
106+
}
107+
return nil
108+
}
109+
}
110+
111+
const testAccElasticsearchSecurityGroup = DefaultEsVariables + `
112+
113+
resource "tencentcloud_elasticsearch_security_group" "security_group" {
114+
instance_id = var.instance_id
115+
security_group_ids = [
116+
var.security_group_id
117+
]
118+
}
119+
120+
`
121+
122+
const testAccElasticsearchSecurityGroupUp = DefaultEsVariables + `
123+
124+
resource "tencentcloud_elasticsearch_security_group" "security_group" {
125+
instance_id = var.instance_id
126+
}
127+
128+
`

0 commit comments

Comments
 (0)