Skip to content

Commit 41c5875

Browse files
authored
fix(es): [122285221] support public_access (#3205)
* fix(es): [] support public_access * feat: add changelog
1 parent 910c360 commit 41c5875

6 files changed

+197
-11
lines changed

.changelog/3205.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 for public_access fields.
3+
```

tencentcloud/services/es/extension_elasticsearch.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ const (
3434

3535
ES_KIBANA_PUBLIC_ACCESS_OPEN = "OPEN"
3636
ES_KIBANA_PUBLIC_ACCESS_CLOSE = "CLOSE"
37+
ES_PUBLIC_ACCESS_OPEN = "OPEN"
38+
ES_PUBLIC_ACCESS_CLOSE = "CLOSE"
3739
)
3840

3941
var ES_CHARGE_TYPE = []string{
@@ -81,3 +83,8 @@ var ES_KIBANA_PUBLIC_ACCESS = []string{
8183
ES_KIBANA_PUBLIC_ACCESS_OPEN,
8284
ES_KIBANA_PUBLIC_ACCESS_CLOSE,
8385
}
86+
87+
var ES_PUBLIC_ACCESS = []string{
88+
ES_PUBLIC_ACCESS_OPEN,
89+
ES_PUBLIC_ACCESS_CLOSE,
90+
}

tencentcloud/services/es/resource_tc_elasticsearch_instance.go

Lines changed: 150 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,39 @@ func ResourceTencentCloudElasticsearchInstance() *schema.Resource {
263263
},
264264
},
265265
},
266+
"public_access": {
267+
Type: schema.TypeString,
268+
Optional: true,
269+
Computed: true,
270+
ValidateFunc: tccommon.ValidateAllowedStringValue(ES_PUBLIC_ACCESS),
271+
Description: "ES cluster public network access status. Valid values are `OPEN` and `CLOSE`. Cannot be changed at the same time as `es_acl`.",
272+
},
273+
"es_public_acl": {
274+
Type: schema.TypeList,
275+
Optional: true,
276+
Computed: true,
277+
MaxItems: 1,
278+
RequiredWith: []string{"public_access"},
279+
Description: "Public network access control list.",
280+
Elem: &schema.Resource{
281+
Schema: map[string]*schema.Schema{
282+
// "black_ip_list": {
283+
// Type: schema.TypeSet,
284+
// Elem: &schema.Schema{Type: schema.TypeString},
285+
// Optional: true,
286+
// Computed: true,
287+
// Description: "Access blacklist.",
288+
// },
289+
"white_ip_list": {
290+
Type: schema.TypeSet,
291+
Elem: &schema.Schema{Type: schema.TypeString},
292+
Optional: true,
293+
Computed: true,
294+
Description: "Access Whitelist.",
295+
},
296+
},
297+
},
298+
},
266299
// computed
267300
"elasticsearch_domain": {
268301
Type: schema.TypeString,
@@ -284,6 +317,11 @@ func ResourceTencentCloudElasticsearchInstance() *schema.Resource {
284317
Computed: true,
285318
Description: "Kibana access URL.",
286319
},
320+
"es_public_url": {
321+
Type: schema.TypeString,
322+
Computed: true,
323+
Description: "Es public network address.",
324+
},
287325
"create_time": {
288326
Type: schema.TypeString,
289327
Computed: true,
@@ -469,9 +507,56 @@ func resourceTencentCloudElasticsearchInstanceCreate(d *schema.ResourceData, met
469507
isUpdate = true
470508
}
471509
}
510+
511+
if isUpdate {
512+
err = resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
513+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", kibanaPublicAccess, "", 0, nil, nil, &esAcl, nil, nil)
514+
if errRet != nil {
515+
return tccommon.RetryError(errRet)
516+
}
517+
return nil
518+
})
519+
if err != nil {
520+
return err
521+
}
522+
523+
err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
524+
if err != nil {
525+
return err
526+
}
527+
528+
isUpdate = false
529+
}
530+
531+
// PublicAccess
532+
var publicAccess string
533+
esPublicAcl := es.EsPublicAcl{}
534+
if v, ok := d.GetOk("public_access"); ok {
535+
access := v.(string)
536+
if access != ES_PUBLIC_ACCESS_CLOSE {
537+
publicAccess = access
538+
isUpdate = true
539+
540+
if aclMap, ok := helper.InterfacesHeadMap(d, "es_public_acl"); ok {
541+
// if v, ok := aclMap["black_ip_list"]; ok {
542+
// bList := v.(*schema.Set).List()
543+
// for _, d := range bList {
544+
// esPublicAcl.BlackIpList = append(esPublicAcl.BlackIpList, helper.String(d.(string)))
545+
// }
546+
// }
547+
if v, ok := aclMap["white_ip_list"]; ok {
548+
wList := v.(*schema.Set).List()
549+
for _, d := range wList {
550+
esPublicAcl.WhiteIpList = append(esPublicAcl.WhiteIpList, helper.String(d.(string)))
551+
}
552+
}
553+
}
554+
}
555+
}
556+
472557
if isUpdate {
473558
err = resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
474-
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", kibanaPublicAccess, 0, nil, nil, &esAcl, nil)
559+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", publicAccess, 0, nil, nil, nil, nil, &esPublicAcl)
475560
if errRet != nil {
476561
return tccommon.RetryError(errRet)
477562
}
@@ -501,7 +586,7 @@ func resourceTencentCloudElasticsearchInstanceCreate(d *schema.ResourceData, met
501586
}
502587

503588
err = resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
504-
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", 0, nil, nil, nil, &cosBackup)
589+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", 0, nil, nil, nil, &cosBackup, nil)
505590
if errRet != nil {
506591
return tccommon.RetryError(errRet)
507592
}
@@ -625,6 +710,24 @@ func resourceTencentCloudElasticsearchInstanceRead(d *schema.ResourceData, meta
625710
_ = d.Set("es_acl", esAcls)
626711
}
627712

713+
if instance.EsPublicAcl != nil {
714+
esAcls := make([]map[string]interface{}, 0, 1)
715+
esAcl := map[string]interface{}{
716+
// "black_ip_list": instance.EsPublicAcl.BlackIpList,
717+
"white_ip_list": instance.EsPublicAcl.WhiteIpList,
718+
}
719+
esAcls = append(esAcls, esAcl)
720+
_ = d.Set("es_public_acl", esAcls)
721+
}
722+
723+
if instance.PublicAccess != nil {
724+
_ = d.Set("public_access", instance.PublicAccess)
725+
}
726+
727+
if instance.EsPublicUrl != nil {
728+
_ = d.Set("es_public_url", instance.EsPublicUrl)
729+
}
730+
628731
if instance.CosBackup != nil {
629732
cosBackupList := make([]map[string]interface{}, 0, 1)
630733
cosBackupMap := map[string]interface{}{}
@@ -667,7 +770,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
667770
instanceName := d.Get("instance_name").(string)
668771
// Update operation support at most one item at the same time
669772
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
670-
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, instanceName, "", "", 0, nil, nil, nil, nil)
773+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, instanceName, "", "", "", 0, nil, nil, nil, nil, nil)
671774
if errRet != nil {
672775
return tccommon.RetryError(errRet)
673776
}
@@ -684,7 +787,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
684787
if d.HasChange("password") {
685788
password := d.Get("password").(string)
686789
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
687-
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", password, "", 0, nil, nil, nil, nil)
790+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", password, "", "", 0, nil, nil, nil, nil, nil)
688791
if errRet != nil {
689792
return tccommon.RetryError(errRet)
690793
}
@@ -703,7 +806,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
703806
if d.HasChange("kibana_public_access") {
704807
if v, ok := d.GetOk("kibana_public_access"); ok {
705808
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
706-
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", v.(string), 0, nil, nil, nil, nil)
809+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", v.(string), "", 0, nil, nil, nil, nil, nil)
707810
if errRet != nil {
708811
return tccommon.RetryError(errRet)
709812
}
@@ -762,7 +865,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
762865
licenseType := d.Get("license_type").(string)
763866
licenseTypeUpgrading := licenseType != "oss"
764867
err := resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
765-
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", int64(basicSecurityType), nil, nil, nil, nil)
868+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", int64(basicSecurityType), nil, nil, nil, nil, nil)
766869
if errRet != nil {
767870
err := errRet.(*sdkErrors.TencentCloudSDKError)
768871
if err.Code == es.INVALIDPARAMETER && licenseTypeUpgrading {
@@ -793,7 +896,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
793896
NodeType: helper.String(value["node_type"].(string)),
794897
}
795898
err = resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
796-
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", 0, nil, info, nil, nil)
899+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", 0, nil, info, nil, nil, nil)
797900
if errRet != nil {
798901
return tccommon.RetryError(errRet)
799902
}
@@ -832,7 +935,44 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
832935
nodeInfoList = append(nodeInfoList, &dataDisk)
833936
}
834937
err := resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
835-
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", 0, nodeInfoList, nil, nil, nil)
938+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", 0, nodeInfoList, nil, nil, nil, nil)
939+
if errRet != nil {
940+
return tccommon.RetryError(errRet)
941+
}
942+
return nil
943+
})
944+
if err != nil {
945+
return err
946+
}
947+
err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
948+
if err != nil {
949+
return err
950+
}
951+
}
952+
953+
if d.HasChange("public_access") || d.HasChange("es_public_acl") {
954+
var publicAccess string
955+
esPublicAcl := es.EsPublicAcl{}
956+
if v, ok := d.GetOk("public_access"); ok {
957+
publicAccess = v.(string)
958+
}
959+
960+
if aclMap, ok := helper.InterfacesHeadMap(d, "es_public_acl"); ok {
961+
// if v, ok := aclMap["black_ip_list"]; ok {
962+
// bList := v.(*schema.Set).List()
963+
// for _, d := range bList {
964+
// esPublicAcl.BlackIpList = append(esPublicAcl.BlackIpList, helper.String(d.(string)))
965+
// }
966+
// }
967+
if v, ok := aclMap["white_ip_list"]; ok {
968+
wList := v.(*schema.Set).List()
969+
for _, d := range wList {
970+
esPublicAcl.WhiteIpList = append(esPublicAcl.WhiteIpList, helper.String(d.(string)))
971+
}
972+
}
973+
}
974+
err := resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
975+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", publicAccess, 0, nil, nil, nil, nil, &esPublicAcl)
836976
if errRet != nil {
837977
return tccommon.RetryError(errRet)
838978
}
@@ -883,7 +1023,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
8831023
}
8841024

8851025
err := resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
886-
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", 0, nil, nil, &esAcl, nil)
1026+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", 0, nil, nil, &esAcl, nil, nil)
8871027
if errRet != nil {
8881028
return tccommon.RetryError(errRet)
8891029
}
@@ -913,7 +1053,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
9131053
}
9141054

9151055
err := resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
916-
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", 0, nil, nil, nil, &cosBackup)
1056+
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", 0, nil, nil, nil, &cosBackup, nil)
9171057
if errRet != nil {
9181058
return tccommon.RetryError(errRet)
9191059
}

tencentcloud/services/es/resource_tc_elasticsearch_instance_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,20 +133,30 @@ func TestAccTencentCloudElasticsearchInstanceResource_kibanaPublicAccess(t *test
133133
Check: resource.ComposeTestCheckFunc(
134134
testAccCheckElasticsearchInstanceExists("tencentcloud_elasticsearch_instance.es_kibana"),
135135
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "kibana_public_access", "OPEN"),
136+
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "public_access", "OPEN"),
137+
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "es_public_acl.#", "1"),
138+
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "es_public_acl.0.white_ip_list.#", "1"),
139+
resource.TestCheckResourceAttrSet("tencentcloud_elasticsearch_instance.es_kibana", "es_public_url"),
136140
),
137141
},
138142
{
139143
Config: testAccElasticsearchInstanceKibanaPublicAccessClose,
140144
Check: resource.ComposeTestCheckFunc(
141145
testAccCheckElasticsearchInstanceExists("tencentcloud_elasticsearch_instance.es_kibana"),
142146
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "kibana_public_access", "CLOSE"),
147+
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "public_access", "CLOSE"),
148+
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "es_public_acl.#", "1"),
149+
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "es_public_acl.0.white_ip_list.#", "1"),
143150
),
144151
},
145152
{
146153
Config: testAccElasticsearchInstanceKibanaPublicAccessOpen,
147154
Check: resource.ComposeTestCheckFunc(
148155
testAccCheckElasticsearchInstanceExists("tencentcloud_elasticsearch_instance.es_kibana"),
149156
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "kibana_public_access", "OPEN"),
157+
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "public_access", "OPEN"),
158+
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "es_public_acl.#", "1"),
159+
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "es_public_acl.0.white_ip_list.#", "1"),
150160
),
151161
},
152162
},
@@ -298,6 +308,12 @@ resource "tencentcloud_elasticsearch_instance" "es_kibana" {
298308
license_type = "basic"
299309
basic_security_type = 2
300310
kibana_public_access = "CLOSE"
311+
public_access = "CLOSE"
312+
es_public_acl {
313+
white_ip_list = [
314+
"127.0.0.1"
315+
]
316+
}
301317
302318
node_info_list {
303319
node_num = 2
@@ -317,6 +333,12 @@ resource "tencentcloud_elasticsearch_instance" "es_kibana" {
317333
license_type = "basic"
318334
basic_security_type = 2
319335
kibana_public_access = "OPEN"
336+
public_access = "OPEN"
337+
es_public_acl {
338+
white_ip_list = [
339+
"127.0.0.1"
340+
]
341+
}
320342
321343
node_info_list {
322344
node_num = 2

tencentcloud/services/es/service_tencentcloud_elasticsearch.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ 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, kibanaPublicAccess string, basicSecurityType int64, nodeList []*es.NodeInfo, nodeTypeInfo *es.WebNodeTypeInfo, esAcl *es.EsAcl, cosBackup *es.CosBackup) error {
110+
func (me *ElasticsearchService) UpdateInstance(ctx context.Context, instanceId, instanceName, password, kibanaPublicAccess, publicAccess string,
111+
basicSecurityType int64, nodeList []*es.NodeInfo, nodeTypeInfo *es.WebNodeTypeInfo, esAcl *es.EsAcl, cosBackup *es.CosBackup, esPublicAcl *es.EsPublicAcl) error {
111112
logId := tccommon.GetLogId(ctx)
112113
request := es.NewUpdateInstanceRequest()
113114
request.InstanceId = &instanceId
@@ -135,6 +136,12 @@ func (me *ElasticsearchService) UpdateInstance(ctx context.Context, instanceId,
135136
if cosBackup != nil {
136137
request.CosBackup = cosBackup
137138
}
139+
if publicAccess != "" {
140+
request.PublicAccess = &publicAccess
141+
}
142+
if esPublicAcl != nil && (0 != len(esPublicAcl.BlackIpList) || 0 != len(esPublicAcl.WhiteIpList)) {
143+
request.EsPublicAcl = esPublicAcl
144+
}
138145
ratelimit.Check(request.GetAction())
139146
_, err := me.client.UseEsClient().UpdateInstance(request)
140147
if err != nil {

website/docs/r/elasticsearch_instance.html.markdown

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,10 +171,12 @@ The following arguments are supported:
171171
* `cos_backup` - (Optional, List) COS automatic backup information.
172172
* `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`.
173173
* `es_acl` - (Optional, List) Kibana Access Control Configuration.
174+
* `es_public_acl` - (Optional, List) Public network access control list.
174175
* `instance_name` - (Optional, String) Name of the instance, which can contain 1 to 50 English letters, Chinese characters, digits, dashes(-), or underscores(_).
175176
* `kibana_public_access` - (Optional, String) Kibana public network access status. Valid values are `OPEN` and `CLOSE`.
176177
* `license_type` - (Optional, String) License type. Valid values are `oss`, `basic` and `platinum`. The default value is `platinum`.
177178
* `multi_zone_infos` - (Optional, List, ForceNew) Details of AZs in multi-AZ deployment mode (which is required when deploy_mode is `1`).
179+
* `public_access` - (Optional, String) ES cluster public network access status. Valid values are `OPEN` and `CLOSE`. Cannot be changed at the same time as `es_acl`.
178180
* `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`.
179181
* `subnet_id` - (Optional, String, ForceNew) The ID of a VPC subnetwork. When create multi-az es, this parameter must be omitted or `-`.
180182
* `tags` - (Optional, Map) 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).
@@ -190,6 +192,10 @@ The `es_acl` object supports the following:
190192
* `black_list` - (Optional, Set) Blacklist of kibana access.
191193
* `white_list` - (Optional, Set) Whitelist of kibana access.
192194

195+
The `es_public_acl` object supports the following:
196+
197+
* `white_ip_list` - (Optional, Set) Access Whitelist.
198+
193199
The `multi_zone_infos` object supports the following:
194200

195201
* `availability_zone` - (Required, String) Availability zone.
@@ -218,6 +224,7 @@ In addition to all arguments above, the following attributes are exported:
218224
* `elasticsearch_domain` - Elasticsearch domain name.
219225
* `elasticsearch_port` - Elasticsearch port.
220226
* `elasticsearch_vip` - Elasticsearch VIP.
227+
* `es_public_url` - Es public network address.
221228
* `kibana_url` - Kibana access URL.
222229

223230

0 commit comments

Comments
 (0)