@@ -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
772770func 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+ }
0 commit comments