Skip to content

Commit

Permalink
feat(es): [118247615]support es kibana switch (#2708)
Browse files Browse the repository at this point in the history
* support es kibana switch

* add changelog

* update

* update

* update

---------

Co-authored-by: mikatong <[email protected]>
  • Loading branch information
2 people authored and SevenEarth committed Jul 10, 2024
1 parent 7a1102f commit 9f963ba
Show file tree
Hide file tree
Showing 7 changed files with 169 additions and 21 deletions.
3 changes: 3 additions & 0 deletions .changelog/2708.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
resource/tencentcloud_elasticsearch_instance: support es kibana switch
```
14 changes: 14 additions & 0 deletions tencentcloud/acctest/basic.go
Original file line number Diff line number Diff line change
Expand Up @@ -1148,6 +1148,8 @@ const (
DefaultEsInstanceId = "es-5wn36he6"
DefaultEsSecurityGroup = "sg-edmur627"
DefaultEsLogstash = "ls-kru90fkz"
DefaultEsVpcId = "vpc-lrj71tt3"
DefaultEsSubnetId = "subnet-kggvos8o"
)

const DefaultEsVariables = `
Expand All @@ -1162,6 +1164,18 @@ variable "security_group_id" {
variable "logstash_id" {
default = "` + DefaultEsLogstash + `"
}
variable "availability_zone" {
default = "ap-guangzhou-3"
}
variable "vpc_id" {
default = "` + DefaultEsVpcId + `"
}
variable "subnet_id" {
default = "` + DefaultEsSubnetId + `"
}
`

// End of TSE
Expand Down
8 changes: 8 additions & 0 deletions tencentcloud/services/es/extension_elasticsearch.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ const (
ES_INSTANCE_STATUS_STOP = -1
ES_INSTANCE_STATUS_DESTROYING = -2
ES_INSTANCE_STATUS_DESTROYED = -3

ES_KIBANA_PUBLIC_ACCESS_OPEN = "OPEN"
ES_KIBANA_PUBLIC_ACCESS_CLOSE = "CLOSE"
)

var ES_CHARGE_TYPE = []string{
Expand Down Expand Up @@ -70,3 +73,8 @@ var ES_RENEW_FLAG = []string{
ES_RENEW_FLAG_AUTO,
ES_RENEW_FLAG_MANUAL,
}

var ES_KIBANA_PUBLIC_ACCESS = []string{
ES_KIBANA_PUBLIC_ACCESS_OPEN,
ES_KIBANA_PUBLIC_ACCESS_CLOSE,
}
85 changes: 70 additions & 15 deletions tencentcloud/services/es/resource_tc_elasticsearch_instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ func ResourceTencentCloudElasticsearchInstance() *schema.Resource {
"web_node_type_info": {
Type: schema.TypeList,
Optional: true,
Computed: true,
Description: "Visual node configuration.",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
Expand Down Expand Up @@ -234,7 +235,13 @@ func ResourceTencentCloudElasticsearchInstance() *schema.Resource {
Optional: true,
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).",
},

"kibana_public_access": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ValidateFunc: tccommon.ValidateAllowedStringValue(ES_KIBANA_PUBLIC_ACCESS),
Description: "Kibana public network access status. Valid values are `OPEN` and `CLOSE`.",
},
// computed
"elasticsearch_domain": {
Type: schema.TypeString,
Expand Down Expand Up @@ -412,6 +419,7 @@ func resourceTencentCloudElasticsearchInstanceCreate(d *schema.ResourceData, met
return err
}

var isUpdate bool
// es acl
esAcl := es.EsAcl{}
if aclMap, ok := helper.InterfacesHeadMap(d, "es_acl"); ok {
Expand All @@ -427,17 +435,31 @@ 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)
if errRet != nil {
return tccommon.RetryError(errRet)
// KibanaPublicAccess
var kibanaPublicAccess string
if v, ok := d.GetOk("kibana_public_access"); ok {
kibanaPublicAccess = 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)
if errRet != nil {
return tccommon.RetryError(errRet)
}
return nil
})
if err != nil {
return err
}

err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
if err != nil {
return err
}
return nil
})
if err != nil {
return err
}

// tags
Expand Down Expand Up @@ -501,6 +523,7 @@ func resourceTencentCloudElasticsearchInstanceRead(d *schema.ResourceData, meta
_ = d.Set("elasticsearch_port", instance.EsPort)
_ = d.Set("kibana_url", instance.KibanaUrl)
_ = d.Set("create_time", instance.CreateTime)
_ = d.Set("kibana_public_access", instance.KibanaPublicAccess)

multiZoneInfos := make([]map[string]interface{}, 0, len(instance.MultiZoneInfo))
for _, item := range instance.MultiZoneInfo {
Expand Down Expand Up @@ -572,7 +595,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)
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, instanceName, "", "", 0, nil, nil, nil)
if errRet != nil {
return tccommon.RetryError(errRet)
}
Expand All @@ -581,11 +604,15 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
if err != nil {
return err
}
err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
if err != nil {
return err
}
}
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)
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", password, "", 0, nil, nil, nil)
if errRet != nil {
return tccommon.RetryError(errRet)
}
Expand All @@ -594,8 +621,32 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
if err != nil {
return err
}
err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
if err != nil {
return err
}
}

// KibanaPublicAccess
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)
if errRet != nil {
return tccommon.RetryError(errRet)
}
return nil
})
if err != nil {
return err
}
err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
if err != nil {
return err
}
}

}
if d.HasChange("version") {
version := d.Get("version").(string)
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
Expand Down Expand Up @@ -639,7 +690,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)
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", int64(basicSecurityType), nil, nil, nil)
if errRet != nil {
err := errRet.(*sdkErrors.TencentCloudSDKError)
if err.Code == es.INVALIDPARAMETER && licenseTypeUpgrading {
Expand Down Expand Up @@ -670,7 +721,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)
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", 0, nil, info, nil)
if errRet != nil {
return tccommon.RetryError(errRet)
}
Expand Down Expand Up @@ -709,7 +760,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)
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", 0, nodeInfoList, nil, nil)
if errRet != nil {
return tccommon.RetryError(errRet)
}
Expand Down Expand Up @@ -760,7 +811,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)
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", 0, nil, nil, &esAcl)
if errRet != nil {
return tccommon.RetryError(errRet)
}
Expand All @@ -769,6 +820,10 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
if err != nil {
return err
}
err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
if err != nil {
return err
}
}

d.Partial(false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,10 @@ func TestAccTencentCloudElasticsearchInstanceResource_basic(t *testing.T) {
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "instance_name", "tf-ci-test"),
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "availability_zone", tcacctest.DefaultAZone),
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "version", "7.10.1"),
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "vpc_id", tcacctest.DefaultVpcId),
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "subnet_id", tcacctest.DefaultSubnetId),
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "vpc_id", tcacctest.DefaultEsVpcId),
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "subnet_id", tcacctest.DefaultEsSubnetId),
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "license_type", "basic"),
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "basic_security_type", "1"),
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "basic_security_type", "2"),
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "web_node_type_info.#", "1"),
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "web_node_type_info.0.node_num", "1"),
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "web_node_type_info.0.node_type", "ES.S1.MEDIUM4"),
Expand All @@ -92,6 +92,7 @@ func TestAccTencentCloudElasticsearchInstanceResource_basic(t *testing.T) {
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "node_info_list.0.type", "hotData"),
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "node_info_list.0.encrypt", "false"),
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "tags.test", "terraform"),
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "kibana_public_access", "OPEN"),
),
},
{
Expand Down Expand Up @@ -119,6 +120,31 @@ func TestAccTencentCloudElasticsearchInstanceResource_basic(t *testing.T) {
},
})
}
func TestAccTencentCloudElasticsearchInstanceResource_kibanaPublicAccess(t *testing.T) {
t.Parallel()

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

func testAccCheckElasticsearchInstanceDestroy(s *terraform.State) error {
logId := tccommon.GetLogId(tccommon.ContextNil)
Expand Down Expand Up @@ -182,7 +208,7 @@ func testAccCheckElasticsearchInstanceExists(n string) resource.TestCheckFunc {
}
}

const testAccElasticsearchInstance = tcacctest.DefaultVpcVariable + `
const testAccElasticsearchInstance = tcacctest.DefaultEsVariables + `
resource "tencentcloud_elasticsearch_instance" "foo" {
instance_name = "tf-ci-test"
availability_zone = var.availability_zone
Expand Down Expand Up @@ -218,7 +244,7 @@ resource "tencentcloud_elasticsearch_instance" "foo" {
}
`

const testAccElasticsearchInstanceUpdate = tcacctest.DefaultVpcVariable + `
const testAccElasticsearchInstanceUpdate = tcacctest.DefaultEsVariables + `
resource "tencentcloud_elasticsearch_instance" "foo" {
instance_name = "tf-ci-test-update"
availability_zone = var.availability_zone
Expand Down Expand Up @@ -253,3 +279,41 @@ resource "tencentcloud_elasticsearch_instance" "foo" {
}
}
`

const testAccElasticsearchInstanceKibanaPublicAccessClose = 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_public_access = "CLOSE"
node_info_list {
node_num = 2
node_type = "ES.S1.MEDIUM4"
}
}
`

const testAccElasticsearchInstanceKibanaPublicAccessOpen = 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_public_access = "OPEN"
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 string, basicSecurityType int64, nodeList []*es.NodeInfo, nodeTypeInfo *es.WebNodeTypeInfo, esAcl *es.EsAcl) error {
func (me *ElasticsearchService) UpdateInstance(ctx context.Context, instanceId, instanceName, password, kibanaPublicAccess string, basicSecurityType int64, nodeList []*es.NodeInfo, nodeTypeInfo *es.WebNodeTypeInfo, esAcl *es.EsAcl) error {
logId := tccommon.GetLogId(ctx)
request := es.NewUpdateInstanceRequest()
request.InstanceId = &instanceId
Expand All @@ -117,6 +117,9 @@ func (me *ElasticsearchService) UpdateInstance(ctx context.Context, instanceId,
if password != "" {
request.Password = &password
}
if kibanaPublicAccess != "" {
request.KibanaPublicAccess = &kibanaPublicAccess
}
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 @@ -166,6 +166,7 @@ The following arguments are supported:
* `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`.
* `es_acl` - (Optional, List) Kibana Access Control Configuration.
* `instance_name` - (Optional, String) Name of the instance, which can contain 1 to 50 English letters, Chinese characters, digits, dashes(-), or underscores(_).
* `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`).
* `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`.
Expand Down

0 comments on commit 9f963ba

Please sign in to comment.