Skip to content

fix(es): [123456789]support kibana_private_access #3381

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
May 29, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/3381.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
resource/tencentcloud_elasticsearch_instance: support kibana_private_access
```
7 changes: 7 additions & 0 deletions tencentcloud/services/es/extension_elasticsearch.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ const (
ES_KIBANA_PUBLIC_ACCESS_CLOSE = "CLOSE"
ES_PUBLIC_ACCESS_OPEN = "OPEN"
ES_PUBLIC_ACCESS_CLOSE = "CLOSE"
ES_PRIVATE_ACCESS_OPEN = "OPEN"
ES_PRIVATE_ACCESS_CLOSE = "CLOSE"
)

var ES_CHARGE_TYPE = []string{
Expand Down Expand Up @@ -88,3 +90,8 @@ var ES_PUBLIC_ACCESS = []string{
ES_PUBLIC_ACCESS_OPEN,
ES_PUBLIC_ACCESS_CLOSE,
}

var ES_PRIVATE_ACCESS = []string{
ES_PRIVATE_ACCESS_OPEN,
ES_PRIVATE_ACCESS_CLOSE,
}
83 changes: 69 additions & 14 deletions tencentcloud/services/es/resource_tc_elasticsearch_instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,13 @@ func ResourceTencentCloudElasticsearchInstance() *schema.Resource {
ValidateFunc: tccommon.ValidateAllowedStringValue(ES_KIBANA_PUBLIC_ACCESS),
Description: "Kibana public network access status. Valid values are `OPEN` and `CLOSE`.",
},
"kibana_private_access": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ValidateFunc: tccommon.ValidateAllowedStringValue(ES_PRIVATE_ACCESS),
Description: "Kibana private network access status. Valid values are `OPEN` and `CLOSE`.",
},
"cos_backup": {
Type: schema.TypeList,
Optional: true,
Expand Down Expand Up @@ -456,6 +463,7 @@ func resourceTencentCloudElasticsearchInstanceCreate(d *schema.ResourceData, met

//internal version: replace setTag begin, please do not modify this annotation and refrain from inserting any code between the beginning and end lines of the annotation.
//internal version: replace setTag end, please do not modify this annotation and refrain from inserting any code between the beginning and end lines of the annotation.
var actualKibanaPrivateAccess string
instanceEmptyRetries := 5
err = resource.Retry(15*tccommon.ReadRetryTimeout, func() *resource.RetryError {
instance, errRet := elasticsearchService.DescribeInstanceById(ctx, instanceId)
Expand All @@ -472,13 +480,15 @@ func resourceTencentCloudElasticsearchInstanceCreate(d *schema.ResourceData, met
if *instance.Status != ES_INSTANCE_STATUS_NORMAL {
return resource.RetryableError(fmt.Errorf("elasticsearch instance status is %v, retrying", *instance.Status))
}
if instance.KibanaPrivateAccess != nil {
actualKibanaPrivateAccess = *instance.KibanaPrivateAccess
}
return nil
})
if err != nil {
return err
}

var isUpdate bool
// es acl
esAcl := es.EsAcl{}
if aclMap, ok := helper.InterfacesHeadMap(d, "es_acl"); ok {
Expand All @@ -494,9 +504,24 @@ func resourceTencentCloudElasticsearchInstanceCreate(d *schema.ResourceData, met
esAcl.WhiteIpList = append(esAcl.WhiteIpList, helper.String(d.(string)))
}
}
isUpdate = true
err := resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", "", 0, nil, nil, &esAcl, nil, nil)
if errRet != nil {
return tccommon.RetryError(errRet)
}
return nil
})
if err != nil {
return err
}
err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
if err != nil {
return err
}
}

var isUpdate bool

// KibanaPublicAccess
var kibanaPublicAccess string
if v, ok := d.GetOk("kibana_public_access"); ok {
Expand All @@ -508,9 +533,18 @@ func resourceTencentCloudElasticsearchInstanceCreate(d *schema.ResourceData, met
}
}

var kibanaPrivateAccess string
if v, ok := d.GetOk("kibana_private_access"); ok {
if actualKibanaPrivateAccess != "" && actualKibanaPrivateAccess != v.(string) {
kibanaPrivateAccess = v.(string)
isUpdate = true
}

}

if isUpdate {
err = resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", kibanaPublicAccess, "", 0, nil, nil, &esAcl, nil, nil)
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", kibanaPublicAccess, kibanaPrivateAccess, "", 0, nil, nil, nil, nil, nil)
if errRet != nil {
return tccommon.RetryError(errRet)
}
Expand Down Expand Up @@ -556,7 +590,7 @@ func resourceTencentCloudElasticsearchInstanceCreate(d *schema.ResourceData, met

if isUpdate {
err = resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", publicAccess, 0, nil, nil, nil, nil, &esPublicAcl)
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", publicAccess, 0, nil, nil, nil, nil, &esPublicAcl)
if errRet != nil {
return tccommon.RetryError(errRet)
}
Expand Down Expand Up @@ -586,7 +620,7 @@ func resourceTencentCloudElasticsearchInstanceCreate(d *schema.ResourceData, met
}

err = resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", 0, nil, nil, nil, &cosBackup, nil)
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", "", 0, nil, nil, nil, &cosBackup, nil)
if errRet != nil {
return tccommon.RetryError(errRet)
}
Expand Down Expand Up @@ -666,6 +700,7 @@ func resourceTencentCloudElasticsearchInstanceRead(d *schema.ResourceData, meta
_ = d.Set("kibana_url", instance.KibanaUrl)
_ = d.Set("create_time", instance.CreateTime)
_ = d.Set("kibana_public_access", instance.KibanaPublicAccess)
_ = d.Set("kibana_private_access", instance.KibanaPrivateAccess)

multiZoneInfos := make([]map[string]interface{}, 0, len(instance.MultiZoneInfo))
for _, item := range instance.MultiZoneInfo {
Expand Down Expand Up @@ -770,7 +805,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
instanceName := d.Get("instance_name").(string)
// Update operation support at most one item at the same time
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, instanceName, "", "", "", 0, nil, nil, nil, nil, nil)
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, instanceName, "", "", "", "", 0, nil, nil, nil, nil, nil)
if errRet != nil {
return tccommon.RetryError(errRet)
}
Expand All @@ -787,7 +822,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
if d.HasChange("password") {
password := d.Get("password").(string)
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", password, "", "", 0, nil, nil, nil, nil, nil)
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", password, "", "", "", 0, nil, nil, nil, nil, nil)
if errRet != nil {
return tccommon.RetryError(errRet)
}
Expand All @@ -806,7 +841,27 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
if d.HasChange("kibana_public_access") {
if v, ok := d.GetOk("kibana_public_access"); ok {
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", v.(string), "", 0, nil, nil, nil, nil, nil)
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", v.(string), "", "", 0, nil, nil, nil, nil, nil)
if errRet != nil {
return tccommon.RetryError(errRet)
}
return nil
})
if err != nil {
return err
}
err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
if err != nil {
return err
}
}

}
// KibanaPrivateAccess
if d.HasChange("kibana_private_access") {
if v, ok := d.GetOk("kibana_private_access"); ok {
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", v.(string), "", 0, nil, nil, nil, nil, nil)
if errRet != nil {
return tccommon.RetryError(errRet)
}
Expand Down Expand Up @@ -865,7 +920,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
licenseType := d.Get("license_type").(string)
licenseTypeUpgrading := licenseType != "oss"
err := resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", int64(basicSecurityType), nil, nil, nil, nil, nil)
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", "", int64(basicSecurityType), nil, nil, nil, nil, nil)
if errRet != nil {
err := errRet.(*sdkErrors.TencentCloudSDKError)
if err.Code == es.INVALIDPARAMETER && licenseTypeUpgrading {
Expand Down Expand Up @@ -896,7 +951,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
NodeType: helper.String(value["node_type"].(string)),
}
err = resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", 0, nil, info, nil, nil, nil)
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", "", 0, nil, info, nil, nil, nil)
if errRet != nil {
return tccommon.RetryError(errRet)
}
Expand Down Expand Up @@ -935,7 +990,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
nodeInfoList = append(nodeInfoList, &dataDisk)
}
err := resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", 0, nodeInfoList, nil, nil, nil, nil)
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", "", 0, nodeInfoList, nil, nil, nil, nil)
if errRet != nil {
return tccommon.RetryError(errRet)
}
Expand Down Expand Up @@ -972,7 +1027,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
}
}
err := resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", publicAccess, 0, nil, nil, nil, nil, &esPublicAcl)
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", publicAccess, 0, nil, nil, nil, nil, &esPublicAcl)
if errRet != nil {
return tccommon.RetryError(errRet)
}
Expand Down Expand Up @@ -1023,7 +1078,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
}

err := resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", 0, nil, nil, &esAcl, nil, nil)
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", "", 0, nil, nil, &esAcl, nil, nil)
if errRet != nil {
return tccommon.RetryError(errRet)
}
Expand Down Expand Up @@ -1053,7 +1108,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
}

err := resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", 0, nil, nil, nil, &cosBackup, nil)
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", "", "", 0, nil, nil, nil, &cosBackup, nil)
if errRet != nil {
return tccommon.RetryError(errRet)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,39 @@ func TestAccTencentCloudElasticsearchInstanceResource_kibanaPublicAccess(t *test
})
}

func TestAccTencentCloudElasticsearchInstanceResource_kibanaPrivateAccess(t *testing.T) {
t.Parallel()

resource.Test(t, resource.TestCase{
PreCheck: func() { tcacctest.AccPreCheck(t) },
Providers: tcacctest.AccProviders,
CheckDestroy: testAccCheckElasticsearchInstanceDestroy,
Steps: []resource.TestStep{
{
Config: testAccElasticsearchInstanceKibanaPrivateAccessOpen,
Check: resource.ComposeTestCheckFunc(
testAccCheckElasticsearchInstanceExists("tencentcloud_elasticsearch_instance.es_kibana"),
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "kibana_private_access", "OPEN"),
),
},
{
Config: testAccElasticsearchInstanceKibanaPrivateAccessClose,
Check: resource.ComposeTestCheckFunc(
testAccCheckElasticsearchInstanceExists("tencentcloud_elasticsearch_instance.es_kibana"),
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "kibana_private_access", "CLOSE"),
),
},
{
Config: testAccElasticsearchInstanceKibanaPrivateAccessOpen,
Check: resource.ComposeTestCheckFunc(
testAccCheckElasticsearchInstanceExists("tencentcloud_elasticsearch_instance.es_kibana"),
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "kibana_private_access", "OPEN"),
),
},
},
})
}

func testAccCheckElasticsearchInstanceDestroy(s *terraform.State) error {
logId := tccommon.GetLogId(tccommon.ContextNil)
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
Expand Down Expand Up @@ -346,3 +379,53 @@ resource "tencentcloud_elasticsearch_instance" "es_kibana" {
}
}
`

const testAccElasticsearchInstanceKibanaPrivateAccessClose = tcacctest.DefaultEsVariables + `
resource "tencentcloud_elasticsearch_instance" "es_kibana" {
instance_name = "tf-ci-test-kibana"
availability_zone = var.availability_zone
version = "7.10.1"
vpc_id = var.vpc_id
subnet_id = var.subnet_id
password = "Test1234"
license_type = "basic"
basic_security_type = 2
kibana_private_access = "CLOSE"
public_access = "CLOSE"
es_public_acl {
white_ip_list = [
"127.0.0.1"
]
}

node_info_list {
node_num = 2
node_type = "ES.S1.MEDIUM4"
}
}
`

const testAccElasticsearchInstanceKibanaPrivateAccessOpen = tcacctest.DefaultEsVariables + `
resource "tencentcloud_elasticsearch_instance" "es_kibana" {
instance_name = "tf-ci-test-kibana"
availability_zone = var.availability_zone
version = "7.10.1"
vpc_id = var.vpc_id
subnet_id = var.subnet_id
password = "Test1234"
license_type = "basic"
basic_security_type = 2
kibana_private_access = "OPEN"
public_access = "OPEN"
es_public_acl {
white_ip_list = [
"127.0.0.1"
]
}

node_info_list {
node_num = 2
node_type = "ES.S1.MEDIUM4"
}
}
`
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ func (me *ElasticsearchService) DeleteInstance(ctx context.Context, instanceId s
}

// UpdateInstance FIXME: use *Request instead of these suck params
func (me *ElasticsearchService) UpdateInstance(ctx context.Context, instanceId, instanceName, password, kibanaPublicAccess, publicAccess string,
func (me *ElasticsearchService) UpdateInstance(ctx context.Context, instanceId, instanceName, password, kibanaPublicAccess, kibanaPrivateAccess, publicAccess string,
basicSecurityType int64, nodeList []*es.NodeInfo, nodeTypeInfo *es.WebNodeTypeInfo, esAcl *es.EsAcl, cosBackup *es.CosBackup, esPublicAcl *es.EsPublicAcl) error {
logId := tccommon.GetLogId(ctx)
request := es.NewUpdateInstanceRequest()
Expand All @@ -121,6 +121,9 @@ func (me *ElasticsearchService) UpdateInstance(ctx context.Context, instanceId,
if kibanaPublicAccess != "" {
request.KibanaPublicAccess = &kibanaPublicAccess
}
if kibanaPrivateAccess != "" {
request.KibanaPrivateAccess = &kibanaPrivateAccess
}
if basicSecurityType > 0 {
request.BasicSecurityType = &basicSecurityType
}
Expand Down
1 change: 1 addition & 0 deletions website/docs/r/elasticsearch_instance.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,7 @@ The following arguments are supported:
* `es_acl` - (Optional, List) Kibana Access Control Configuration.
* `es_public_acl` - (Optional, List) Public network access control list.
* `instance_name` - (Optional, String) Name of the instance, which can contain 1 to 50 English letters, Chinese characters, digits, dashes(-), or underscores(_).
* `kibana_private_access` - (Optional, String) Kibana private network access status. Valid values are `OPEN` and `CLOSE`.
* `kibana_public_access` - (Optional, String) Kibana public network access status. Valid values are `OPEN` and `CLOSE`.
* `license_type` - (Optional, String) License type. Valid values are `oss`, `basic` and `platinum`. The default value is `platinum`.
* `multi_zone_infos` - (Optional, List, ForceNew) Details of AZs in multi-AZ deployment mode (which is required when deploy_mode is `1`).
Expand Down
Loading