Skip to content

Commit c3233dd

Browse files
authored
fix: es - status polling (#1353)
* fix: es - status polling * changelog 1353 * fix: es - basicSecType change err capture * fix: es testcase assert * fix: es - add update fn and web_node_type_info rewrite
1 parent 7c49bbe commit c3233dd

File tree

4 files changed

+81
-57
lines changed

4 files changed

+81
-57
lines changed

.changelog/1353.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
resource/tencentcloud_elasticsearch_instance: status polling fix
3+
```

tencentcloud/extension_elasticsearch.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ const (
2323

2424
ES_INSTANCE_STATUS_PROCESSING = 0
2525
ES_INSTANCE_STATUS_NORMAL = 1
26-
ES_INSTANCE_STATUS_STOP = 2
27-
ES_INSTANCE_STATUS_DESTROYING = 3
28-
ES_INSTANCE_STATUS_DESTROYED = 4
26+
ES_INSTANCE_STATUS_CREATING = 2
27+
ES_INSTANCE_STATUS_STOP = -1
28+
ES_INSTANCE_STATUS_DESTROYING = -2
29+
ES_INSTANCE_STATUS_DESTROYED = -3
2930
)
3031

3132
var ES_CHARGE_TYPE = []string{

tencentcloud/resource_tc_elasticsearch_instance.go

Lines changed: 65 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ import (
5454
"context"
5555
"errors"
5656
"fmt"
57+
sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
5758
"log"
5859

5960
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
@@ -416,13 +417,21 @@ func resourceTencentCloudElasticsearchInstanceCreate(d *schema.ResourceData, met
416417
}
417418
d.SetId(instanceId)
418419

420+
instanceEmptyRetries := 5
419421
err = resource.Retry(15*readRetryTimeout, func() *resource.RetryError {
420422
instance, errRet := elasticsearchService.DescribeInstanceById(ctx, instanceId)
421423
if errRet != nil {
422424
return retryError(errRet, InternalError)
423425
}
424-
if instance == nil || *instance.Status == ES_INSTANCE_STATUS_PROCESSING {
425-
return resource.RetryableError(fmt.Errorf("elasticsearch instance status is processing, retry... status:%v", *instance.Status))
426+
if instance == nil {
427+
if instanceEmptyRetries > 0 {
428+
instanceEmptyRetries -= 1
429+
return resource.RetryableError(fmt.Errorf("cannot find instance %s, retrying", instanceId))
430+
}
431+
return resource.NonRetryableError(fmt.Errorf("instance %s not exists", instanceId))
432+
}
433+
if *instance.Status != ES_INSTANCE_STATUS_NORMAL {
434+
return resource.RetryableError(fmt.Errorf("elasticsearch instance status is %v, retrying", *instance.Status))
426435
}
427436
return nil
428437
})
@@ -515,6 +524,13 @@ func resourceTencentCloudElasticsearchInstanceRead(d *schema.ResourceData, meta
515524
}
516525
_ = d.Set("node_info_list", nodeInfoList)
517526

527+
if webInfo := instance.WebNodeTypeInfo; webInfo != nil {
528+
_ = helper.SetMapInterfaces(d, "web_node_type_info", map[string]interface{}{
529+
"node_type": webInfo.NodeType,
530+
"node_num": webInfo.NodeNum,
531+
})
532+
}
533+
518534
if instance.EsAcl != nil {
519535
esAcls := make([]map[string]interface{}, 0, 1)
520536
esAcl := map[string]interface{}{
@@ -575,7 +591,6 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
575591
if err != nil {
576592
return err
577593
}
578-
d.SetPartial("password")
579594
}
580595

581596
if d.HasChange("version") {
@@ -590,26 +605,16 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
590605
if err != nil {
591606
return err
592607
}
593-
d.SetPartial("version")
594608

595-
err = resource.Retry(10*readRetryTimeout, func() *resource.RetryError {
596-
instance, errRet := elasticsearchService.DescribeInstanceById(ctx, instanceId)
597-
if errRet != nil {
598-
return retryError(errRet, InternalError)
599-
}
600-
if instance != nil && *instance.Status == ES_INSTANCE_STATUS_PROCESSING {
601-
return resource.RetryableError(errors.New("elasticsearch instance status is processing, retry..."))
602-
}
603-
return nil
604-
})
609+
err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
605610
if err != nil {
606611
return err
607612
}
608613
}
609614

610615
if d.HasChange("license_type") {
611616
licenseType := d.Get("license_type").(string)
612-
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
617+
err := resource.Retry(writeRetryTimeout*2, func() *resource.RetryError {
613618
errRet := elasticsearchService.UpdateInstanceLicense(ctx, instanceId, licenseType)
614619
if errRet != nil {
615620
return retryError(errRet)
@@ -619,36 +624,37 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
619624
if err != nil {
620625
return err
621626
}
622-
d.SetPartial("license_type")
623627

624-
err = resource.Retry(10*readRetryTimeout, func() *resource.RetryError {
625-
instance, errRet := elasticsearchService.DescribeInstanceById(ctx, instanceId)
626-
if errRet != nil {
627-
return retryError(errRet, InternalError)
628-
}
629-
if instance != nil && *instance.Status == ES_INSTANCE_STATUS_PROCESSING {
630-
return resource.RetryableError(errors.New("elasticsearch instance status is processing, retry..."))
631-
}
632-
return nil
633-
})
628+
err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
634629
if err != nil {
635630
return err
636631
}
637632
}
638633

639634
if d.HasChange("basic_security_type") {
640635
basicSecurityType := d.Get("basic_security_type").(int)
641-
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
636+
licenseType := d.Get("license_type").(string)
637+
licenseTypeUpgrading := licenseType != "oss"
638+
err := resource.Retry(writeRetryTimeout*2, func() *resource.RetryError {
642639
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", int64(basicSecurityType), nil, nil, nil)
643640
if errRet != nil {
641+
err := errRet.(*sdkErrors.TencentCloudSDKError)
642+
if err.Code == es.INVALIDPARAMETER && licenseTypeUpgrading {
643+
return resource.RetryableError(fmt.Errorf("waiting for licenseType update"))
644+
}
644645
return retryError(errRet)
645646
}
647+
646648
return nil
647649
})
648650
if err != nil {
649651
return err
650652
}
651-
d.SetPartial("basic_security_type")
653+
err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
654+
655+
if err != nil {
656+
return err
657+
}
652658
}
653659

654660
if d.HasChange("web_node_type_info") {
@@ -660,7 +666,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
660666
NodeNum: helper.IntUint64(value["node_num"].(int)),
661667
NodeType: helper.String(value["node_type"].(string)),
662668
}
663-
err = resource.Retry(writeRetryTimeout, func() *resource.RetryError {
669+
err = resource.Retry(writeRetryTimeout*2, func() *resource.RetryError {
664670
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", 0, nil, info, nil)
665671
if errRet != nil {
666672
return retryError(errRet)
@@ -672,6 +678,10 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
672678
if err != nil {
673679
return err
674680
}
681+
err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
682+
if err != nil {
683+
return err
684+
}
675685
}
676686

677687
if d.HasChange("node_info_list") {
@@ -695,7 +705,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
695705
}
696706
nodeInfoList = append(nodeInfoList, &dataDisk)
697707
}
698-
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
708+
err := resource.Retry(writeRetryTimeout*2, func() *resource.RetryError {
699709
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", 0, nodeInfoList, nil, nil)
700710
if errRet != nil {
701711
return retryError(errRet)
@@ -705,17 +715,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
705715
if err != nil {
706716
return err
707717
}
708-
d.SetPartial("node_info_list")
709-
err = resource.Retry(10*readRetryTimeout, func() *resource.RetryError {
710-
instance, errRet := elasticsearchService.DescribeInstanceById(ctx, instanceId)
711-
if errRet != nil {
712-
return retryError(errRet, InternalError)
713-
}
714-
if instance != nil && *instance.Status == ES_INSTANCE_STATUS_PROCESSING {
715-
return resource.RetryableError(errors.New("elasticsearch instance status is processing, retry..."))
716-
}
717-
return nil
718-
})
718+
err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId)
719719
if err != nil {
720720
return err
721721
}
@@ -732,7 +732,6 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
732732
if err != nil {
733733
return err
734734
}
735-
d.SetPartial("tags")
736735
}
737736
if d.HasChange("es_acl") {
738737
esAcl := es.EsAcl{}
@@ -751,7 +750,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
751750
}
752751
}
753752

754-
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
753+
err := resource.Retry(writeRetryTimeout*2, func() *resource.RetryError {
755754
errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", 0, nil, nil, &esAcl)
756755
if errRet != nil {
757756
return retryError(errRet)
@@ -761,12 +760,11 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met
761760
if err != nil {
762761
return err
763762
}
764-
d.SetPartial("es_acl")
765763
}
766764

767765
d.Partial(false)
768766

769-
return nil
767+
return resourceTencentCloudElasticsearchInstanceRead(d, meta)
770768
}
771769

772770
func resourceTencentCloudElasticsearchInstanceDelete(d *schema.ResourceData, meta interface{}) error {
@@ -805,3 +803,25 @@ func resourceTencentCloudElasticsearchInstanceDelete(d *schema.ResourceData, met
805803

806804
return nil
807805
}
806+
807+
func tencentCloudElasticsearchInstanceUpgradeWaiting(ctx context.Context, service *ElasticsearchService, instanceId string) error {
808+
statusChangeRetries := 5
809+
return resource.Retry(10*readRetryTimeout, func() *resource.RetryError {
810+
instance, errRet := service.DescribeInstanceById(ctx, instanceId)
811+
if errRet != nil {
812+
return retryError(errRet, InternalError)
813+
}
814+
if instance == nil {
815+
return resource.NonRetryableError(fmt.Errorf("instance %s not exist", instanceId))
816+
}
817+
if *instance.Status == ES_INSTANCE_STATUS_NORMAL && statusChangeRetries > 0 {
818+
statusChangeRetries -= 1
819+
err := fmt.Errorf("instance %s waiting for upgrade status change, %d times remaining", instanceId, statusChangeRetries)
820+
return resource.RetryableError(err)
821+
}
822+
if *instance.Status == ES_INSTANCE_STATUS_PROCESSING {
823+
return resource.RetryableError(errors.New("elasticsearch instance status is processing, retry..."))
824+
}
825+
return nil
826+
})
827+
}

tencentcloud/resource_tc_elasticsearch_instance_test.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func init() {
4343
})
4444
}
4545

46-
func TestAccTencentCloudNeedFixElasticsearchInstance_basic(t *testing.T) {
46+
func TestAccTencentCloudElasticsearchInstance_basic(t *testing.T) {
4747
t.Parallel()
4848

4949
resource.Test(t, resource.TestCase{
@@ -83,9 +83,9 @@ func TestAccTencentCloudNeedFixElasticsearchInstance_basic(t *testing.T) {
8383
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "web_node_type_info.0.node_type", "ES.S1.MEDIUM8"),
8484
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "node_info_list.0.node_type", "ES.S1.MEDIUM8"),
8585
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "node_info_list.0.disk_size", "200"),
86-
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "es_public_acl.#", "1"),
87-
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "es_public_acl.0.white_list.#", "1"),
88-
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "es_public_acl.0.black_list.#", "1"),
86+
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "es_acl.#", "1"),
87+
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "es_acl.0.white_list.#", "1"),
88+
resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "es_acl.0.black_list.#", "1"),
8989
),
9090
},
9191
{
@@ -212,13 +212,13 @@ resource "tencentcloud_elasticsearch_instance" "foo" {
212212
disk_size = 200
213213
}
214214
215-
es_public_acl {
216-
white_list {
215+
es_acl {
216+
white_list = [
217217
"0.0.0.0"
218-
}
219-
black_list {
218+
]
219+
black_list = [
220220
"1.1.1.1"
221-
}
221+
]
222222
}
223223
224224
tags = {

0 commit comments

Comments
 (0)