Skip to content

Commit 372cacc

Browse files
tongyimingmikatong
and
mikatong
authored
feat(es): [118247615]support es kibana switch (#2708)
* support es kibana switch * add changelog * update * update * update --------- Co-authored-by: mikatong <[email protected]>
1 parent 2ae3655 commit 372cacc

7 files changed

+169
-21
lines changed

.changelog/2708.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
resource/tencentcloud_elasticsearch_instance: support es kibana switch
3+
```

tencentcloud/acctest/basic.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,6 +1148,8 @@ const (
11481148
DefaultEsInstanceId = "es-5wn36he6"
11491149
DefaultEsSecurityGroup = "sg-edmur627"
11501150
DefaultEsLogstash = "ls-kru90fkz"
1151+
DefaultEsVpcId = "vpc-lrj71tt3"
1152+
DefaultEsSubnetId = "subnet-kggvos8o"
11511153
)
11521154

11531155
const DefaultEsVariables = `
@@ -1162,6 +1164,18 @@ variable "security_group_id" {
11621164
variable "logstash_id" {
11631165
default = "` + DefaultEsLogstash + `"
11641166
}
1167+
1168+
variable "availability_zone" {
1169+
default = "ap-guangzhou-3"
1170+
}
1171+
1172+
variable "vpc_id" {
1173+
default = "` + DefaultEsVpcId + `"
1174+
}
1175+
1176+
variable "subnet_id" {
1177+
default = "` + DefaultEsSubnetId + `"
1178+
}
11651179
`
11661180

11671181
// End of TSE

tencentcloud/services/es/extension_elasticsearch.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ const (
3131
ES_INSTANCE_STATUS_STOP = -1
3232
ES_INSTANCE_STATUS_DESTROYING = -2
3333
ES_INSTANCE_STATUS_DESTROYED = -3
34+
35+
ES_KIBANA_PUBLIC_ACCESS_OPEN = "OPEN"
36+
ES_KIBANA_PUBLIC_ACCESS_CLOSE = "CLOSE"
3437
)
3538

3639
var ES_CHARGE_TYPE = []string{
@@ -70,3 +73,8 @@ var ES_RENEW_FLAG = []string{
7073
ES_RENEW_FLAG_AUTO,
7174
ES_RENEW_FLAG_MANUAL,
7275
}
76+
77+
var ES_KIBANA_PUBLIC_ACCESS = []string{
78+
ES_KIBANA_PUBLIC_ACCESS_OPEN,
79+
ES_KIBANA_PUBLIC_ACCESS_CLOSE,
80+
}

tencentcloud/services/es/resource_tc_elasticsearch_instance.go

Lines changed: 70 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ func ResourceTencentCloudElasticsearchInstance() *schema.Resource {
126126
"web_node_type_info": {
127127
Type: schema.TypeList,
128128
Optional: true,
129+
Computed: true,
129130
Description: "Visual node configuration.",
130131
Elem: &schema.Resource{
131132
Schema: map[string]*schema.Schema{
@@ -234,7 +235,13 @@ func ResourceTencentCloudElasticsearchInstance() *schema.Resource {
234235
Optional: true,
235236
Description: "A mapping of tags to assign to the instance. For tag limits, please refer to [Use Limits](https://intl.cloud.tencent.com/document/product/651/13354).",
236237
},
237-
238+
"kibana_public_access": {
239+
Type: schema.TypeString,
240+
Optional: true,
241+
Computed: true,
242+
ValidateFunc: tccommon.ValidateAllowedStringValue(ES_KIBANA_PUBLIC_ACCESS),
243+
Description: "Kibana public network access status. Valid values are `OPEN` and `CLOSE`.",
244+
},
238245
// computed
239246
"elasticsearch_domain": {
240247
Type: schema.TypeString,
@@ -412,6 +419,7 @@ func resourceTencentCloudElasticsearchInstanceCreate(d *schema.ResourceData, met
412419
return err
413420
}
414421

422+
var isUpdate bool
415423
// es acl
416424
esAcl := es.EsAcl{}
417425
if aclMap, ok := helper.InterfacesHeadMap(d, "es_acl"); ok {
@@ -427,17 +435,31 @@ func resourceTencentCloudElasticsearchInstanceCreate(d *schema.ResourceData, met
427435
esAcl.WhiteIpList = append(esAcl.WhiteIpList, helper.String(d.(string)))
428436
}
429437
}
438+
isUpdate = true
430439
}
431440

432-
err = resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
433-
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", 0, nil, nil, &esAcl)
434-
if errRet != nil {
435-
return tccommon.RetryError(errRet)
441+
// KibanaPublicAccess
442+
var kibanaPublicAccess string
443+
if v, ok := d.GetOk("kibana_public_access"); ok {
444+
kibanaPublicAccess = v.(string)
445+
isUpdate = true
446+
}
447+
if isUpdate {
448+
err = resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
449+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", kibanaPublicAccess, 0, nil, nil, &esAcl)
450+
if errRet != nil {
451+
return tccommon.RetryError(errRet)
452+
}
453+
return nil
454+
})
455+
if err != nil {
456+
return err
457+
}
458+
459+
err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
460+
if err != nil {
461+
return err
436462
}
437-
return nil
438-
})
439-
if err != nil {
440-
return err
441463
}
442464

443465
// tags
@@ -501,6 +523,7 @@ func resourceTencentCloudElasticsearchInstanceRead(d *schema.ResourceData, meta
501523
_ = d.Set("elasticsearch_port", instance.EsPort)
502524
_ = d.Set("kibana_url", instance.KibanaUrl)
503525
_ = d.Set("create_time", instance.CreateTime)
526+
_ = d.Set("kibana_public_access", instance.KibanaPublicAccess)
504527

505528
multiZoneInfos := make([]map[string]interface{}, 0, len(instance.MultiZoneInfo))
506529
for _, item := range instance.MultiZoneInfo {
@@ -572,7 +595,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
572595
instanceName := d.Get("instance_name").(string)
573596
// Update operation support at most one item at the same time
574597
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
575-
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, instanceName, "", 0, nil, nil, nil)
598+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, instanceName, "", "", 0, nil, nil, nil)
576599
if errRet != nil {
577600
return tccommon.RetryError(errRet)
578601
}
@@ -581,11 +604,15 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
581604
if err != nil {
582605
return err
583606
}
607+
err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
608+
if err != nil {
609+
return err
610+
}
584611
}
585612
if d.HasChange("password") {
586613
password := d.Get("password").(string)
587614
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
588-
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", password, 0, nil, nil, nil)
615+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", password, "", 0, nil, nil, nil)
589616
if errRet != nil {
590617
return tccommon.RetryError(errRet)
591618
}
@@ -594,8 +621,32 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
594621
if err != nil {
595622
return err
596623
}
624+
err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
625+
if err != nil {
626+
return err
627+
}
597628
}
598629

630+
// KibanaPublicAccess
631+
if d.HasChange("kibana_public_access") {
632+
if v, ok := d.GetOk("kibana_public_access"); ok {
633+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
634+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", v.(string), 0, nil, nil, nil)
635+
if errRet != nil {
636+
return tccommon.RetryError(errRet)
637+
}
638+
return nil
639+
})
640+
if err != nil {
641+
return err
642+
}
643+
err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
644+
if err != nil {
645+
return err
646+
}
647+
}
648+
649+
}
599650
if d.HasChange("version") {
600651
version := d.Get("version").(string)
601652
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
@@ -639,7 +690,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
639690
licenseType := d.Get("license_type").(string)
640691
licenseTypeUpgrading := licenseType != "oss"
641692
err := resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
642-
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", int64(basicSecurityType), nil, nil, nil)
693+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", int64(basicSecurityType), nil, nil, nil)
643694
if errRet != nil {
644695
err := errRet.(*sdkErrors.TencentCloudSDKError)
645696
if err.Code == es.INVALIDPARAMETER && licenseTypeUpgrading {
@@ -670,7 +721,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
670721
NodeType: helper.String(value["node_type"].(string)),
671722
}
672723
err = resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
673-
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", 0, nil, info, nil)
724+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", 0, nil, info, nil)
674725
if errRet != nil {
675726
return tccommon.RetryError(errRet)
676727
}
@@ -709,7 +760,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
709760
nodeInfoList = append(nodeInfoList, &dataDisk)
710761
}
711762
err := resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
712-
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", 0, nodeInfoList, nil, nil)
763+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", 0, nodeInfoList, nil, nil)
713764
if errRet != nil {
714765
return tccommon.RetryError(errRet)
715766
}
@@ -760,7 +811,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
760811
}
761812

762813
err := resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
763-
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", 0, nil, nil, &esAcl)
814+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", 0, nil, nil, &esAcl)
764815
if errRet != nil {
765816
return tccommon.RetryError(errRet)
766817
}
@@ -769,6 +820,10 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
769820
if err != nil {
770821
return err
771822
}
823+
err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
824+
if err != nil {
825+
return err
826+
}
772827
}
773828

774829
d.Partial(false)

tencentcloud/services/es/resource_tc_elasticsearch_instance_test.go

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,10 @@ func TestAccTencentCloudElasticsearchInstanceResource_basic(t *testing.T) {
8080
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "instance_name", "tf-ci-test"),
8181
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "availability_zone", tcacctest.DefaultAZone),
8282
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "version", "7.10.1"),
83-
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "vpc_id", tcacctest.DefaultVpcId),
84-
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "subnet_id", tcacctest.DefaultSubnetId),
83+
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "vpc_id", tcacctest.DefaultEsVpcId),
84+
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "subnet_id", tcacctest.DefaultEsSubnetId),
8585
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "license_type", "basic"),
86-
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "basic_security_type", "1"),
86+
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "basic_security_type", "2"),
8787
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "web_node_type_info.#", "1"),
8888
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "web_node_type_info.0.node_num", "1"),
8989
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "web_node_type_info.0.node_type", "ES.S1.MEDIUM4"),
@@ -92,6 +92,7 @@ func TestAccTencentCloudElasticsearchInstanceResource_basic(t *testing.T) {
9292
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "node_info_list.0.type", "hotData"),
9393
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "node_info_list.0.encrypt", "false"),
9494
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "tags.test", "terraform"),
95+
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "kibana_public_access", "OPEN"),
9596
),
9697
},
9798
{
@@ -119,6 +120,31 @@ func TestAccTencentCloudElasticsearchInstanceResource_basic(t *testing.T) {
119120
},
120121
})
121122
}
123+
func TestAccTencentCloudElasticsearchInstanceResource_kibanaPublicAccess(t *testing.T) {
124+
t.Parallel()
125+
126+
resource.Test(t, resource.TestCase{
127+
PreCheck: func() { tcacctest.AccPreCheck(t) },
128+
Providers: tcacctest.AccProviders,
129+
CheckDestroy: testAccCheckElasticsearchInstanceDestroy,
130+
Steps: []resource.TestStep{
131+
{
132+
Config: testAccElasticsearchInstanceKibanaPublicAccessClose,
133+
Check: resource.ComposeTestCheckFunc(
134+
testAccCheckElasticsearchInstanceExists("tencentcloud_elasticsearch_instance.es_kibana"),
135+
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "kibana_public_access", "CLOSE"),
136+
),
137+
},
138+
{
139+
Config: testAccElasticsearchInstanceKibanaPublicAccessOpen,
140+
Check: resource.ComposeTestCheckFunc(
141+
testAccCheckElasticsearchInstanceExists("tencentcloud_elasticsearch_instance.es_kibana"),
142+
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "kibana_public_access", "OPEN"),
143+
),
144+
},
145+
},
146+
})
147+
}
122148

123149
func testAccCheckElasticsearchInstanceDestroy(s *terraform.State) error {
124150
logId := tccommon.GetLogId(tccommon.ContextNil)
@@ -182,7 +208,7 @@ func testAccCheckElasticsearchInstanceExists(n string) resource.TestCheckFunc {
182208
}
183209
}
184210

185-
const testAccElasticsearchInstance = tcacctest.DefaultVpcVariable + `
211+
const testAccElasticsearchInstance = tcacctest.DefaultEsVariables + `
186212
resource "tencentcloud_elasticsearch_instance" "foo" {
187213
instance_name = "tf-ci-test"
188214
availability_zone = var.availability_zone
@@ -218,7 +244,7 @@ resource "tencentcloud_elasticsearch_instance" "foo" {
218244
}
219245
`
220246

221-
const testAccElasticsearchInstanceUpdate = tcacctest.DefaultVpcVariable + `
247+
const testAccElasticsearchInstanceUpdate = tcacctest.DefaultEsVariables + `
222248
resource "tencentcloud_elasticsearch_instance" "foo" {
223249
instance_name = "tf-ci-test-update"
224250
availability_zone = var.availability_zone
@@ -253,3 +279,41 @@ resource "tencentcloud_elasticsearch_instance" "foo" {
253279
}
254280
}
255281
`
282+
283+
const testAccElasticsearchInstanceKibanaPublicAccessClose = tcacctest.DefaultEsVariables + `
284+
resource "tencentcloud_elasticsearch_instance" "es_kibana" {
285+
instance_name = "tf-ci-test-kibana"
286+
availability_zone = var.availability_zone
287+
version = "7.10.1"
288+
vpc_id = var.vpc_id
289+
subnet_id = var.subnet_id
290+
password = "Test1234"
291+
license_type = "basic"
292+
basic_security_type = 2
293+
kibana_public_access = "CLOSE"
294+
295+
node_info_list {
296+
node_num = 2
297+
node_type = "ES.S1.MEDIUM4"
298+
}
299+
}
300+
`
301+
302+
const testAccElasticsearchInstanceKibanaPublicAccessOpen = tcacctest.DefaultEsVariables + `
303+
resource "tencentcloud_elasticsearch_instance" "es_kibana" {
304+
instance_name = "tf-ci-test-kibana"
305+
availability_zone = var.availability_zone
306+
version = "7.10.1"
307+
vpc_id = var.vpc_id
308+
subnet_id = var.subnet_id
309+
password = "Test1234"
310+
license_type = "basic"
311+
basic_security_type = 2
312+
kibana_public_access = "OPEN"
313+
314+
node_info_list {
315+
node_num = 2
316+
node_type = "ES.S1.MEDIUM4"
317+
}
318+
}
319+
`

tencentcloud/services/es/service_tencentcloud_elasticsearch.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ func (me *ElasticsearchService) DeleteInstance(ctx context.Context, instanceId s
107107
}
108108

109109
// UpdateInstance FIXME: use *Request instead of these suck params
110-
func (me *ElasticsearchService) UpdateInstance(ctx context.Context, instanceId, instanceName, password string, basicSecurityType int64, nodeList []*es.NodeInfo, nodeTypeInfo *es.WebNodeTypeInfo, esAcl *es.EsAcl) error {
110+
func (me *ElasticsearchService) UpdateInstance(ctx context.Context, instanceId, instanceName, password, kibanaPublicAccess string, basicSecurityType int64, nodeList []*es.NodeInfo, nodeTypeInfo *es.WebNodeTypeInfo, esAcl *es.EsAcl) error {
111111
logId := tccommon.GetLogId(ctx)
112112
request := es.NewUpdateInstanceRequest()
113113
request.InstanceId = &instanceId
@@ -117,6 +117,9 @@ func (me *ElasticsearchService) UpdateInstance(ctx context.Context, instanceId,
117117
if password != "" {
118118
request.Password = &password
119119
}
120+
if kibanaPublicAccess != "" {
121+
request.KibanaPublicAccess = &kibanaPublicAccess
122+
}
120123
if basicSecurityType > 0 {
121124
request.BasicSecurityType = &basicSecurityType
122125
}

website/docs/r/elasticsearch_instance.html.markdown

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ The following arguments are supported:
166166
* `deploy_mode` - (Optional, Int, ForceNew) Cluster deployment mode. Valid values are `0` and `1`. `0` is single-AZ deployment, and `1` is multi-AZ deployment. Default value is `0`.
167167
* `es_acl` - (Optional, List) Kibana Access Control Configuration.
168168
* `instance_name` - (Optional, String) Name of the instance, which can contain 1 to 50 English letters, Chinese characters, digits, dashes(-), or underscores(_).
169+
* `kibana_public_access` - (Optional, String) Kibana public network access status. Valid values are `OPEN` and `CLOSE`.
169170
* `license_type` - (Optional, String) License type. Valid values are `oss`, `basic` and `platinum`. The default value is `platinum`.
170171
* `multi_zone_infos` - (Optional, List, ForceNew) Details of AZs in multi-AZ deployment mode (which is required when deploy_mode is `1`).
171172
* `renew_flag` - (Optional, String, ForceNew) When enabled, the instance will be renew automatically when it reach the end of the prepaid tenancy. Valid values are `RENEW_FLAG_AUTO` and `RENEW_FLAG_MANUAL`. NOTE: it only works when charge_type is set to `PREPAID`.

0 commit comments

Comments
 (0)