diff --git a/.changelog/2822.txt b/.changelog/2822.txt new file mode 100644 index 0000000000..e6728100d6 --- /dev/null +++ b/.changelog/2822.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_elasticsearch_instance: support `cos_backup` +``` diff --git a/tencentcloud/services/es/resource_tc_elasticsearch_instance.go b/tencentcloud/services/es/resource_tc_elasticsearch_instance.go index 7a5862036c..007d8d8fd1 100644 --- a/tencentcloud/services/es/resource_tc_elasticsearch_instance.go +++ b/tencentcloud/services/es/resource_tc_elasticsearch_instance.go @@ -242,6 +242,26 @@ func ResourceTencentCloudElasticsearchInstance() *schema.Resource { ValidateFunc: tccommon.ValidateAllowedStringValue(ES_KIBANA_PUBLIC_ACCESS), Description: "Kibana public network access status. Valid values are `OPEN` and `CLOSE`.", }, + "cos_backup": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Description: "COS automatic backup information.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "is_auto_backup": { + Type: schema.TypeBool, + Required: true, + Description: "Whether to enable automatic backup of cos.", + }, + "backup_time": { + Type: schema.TypeString, + Required: true, + Description: "Automatic backup execution time (accurate to the hour), e.g. `22:00`.", + }, + }, + }, + }, // computed "elasticsearch_domain": { Type: schema.TypeString, @@ -446,7 +466,7 @@ func resourceTencentCloudElasticsearchInstanceCreate(d *schema.ResourceData, met } if isUpdate { err = resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError { - errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", kibanaPublicAccess, 0, nil, nil, &esAcl) + errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", kibanaPublicAccess, 0, nil, nil, &esAcl, nil) if errRet != nil { return tccommon.RetryError(errRet) } @@ -462,6 +482,38 @@ func resourceTencentCloudElasticsearchInstanceCreate(d *schema.ResourceData, met } } + if v, ok := d.GetOk("cos_backup"); ok { + cosBackup := es.CosBackup{} + for _, item := range v.([]interface{}) { + value := item.(map[string]interface{}) + if v, ok := value["is_auto_backup"]; ok { + cosBackup.IsAutoBackup = helper.Bool(v.(bool)) + } + + if v, ok := value["backup_time"]; ok && v.(string) != "" { + cosBackup.BackupTime = helper.String(v.(string)) + } + } + + err = resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError { + errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", 0, nil, nil, nil, &cosBackup) + if errRet != nil { + return tccommon.RetryError(errRet) + } + + return nil + }) + + if err != nil { + return err + } + + err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId) + if err != nil { + return err + } + } + // tags if tags := helper.GetTags(d, "tags"); len(tags) > 0 { client := meta.(tccommon.ProviderMeta).GetAPIV3Conn() @@ -568,6 +620,21 @@ func resourceTencentCloudElasticsearchInstanceRead(d *schema.ResourceData, meta _ = d.Set("es_acl", esAcls) } + if instance.CosBackup != nil { + cosBackupList := make([]map[string]interface{}, 0, 1) + cosBackupMap := map[string]interface{}{} + if instance.CosBackup.IsAutoBackup != nil { + cosBackupMap["is_auto_backup"] = instance.CosBackup.IsAutoBackup + } + + if instance.CosBackup.BackupTime != nil { + cosBackupMap["backup_time"] = instance.CosBackup.BackupTime + } + + cosBackupList = append(cosBackupList, cosBackupMap) + _ = d.Set("cos_backup", cosBackupList) + } + if len(instance.TagList) > 0 { tags := make(map[string]string) for _, tag := range instance.TagList { @@ -595,7 +662,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, nil) if errRet != nil { return tccommon.RetryError(errRet) } @@ -612,7 +679,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) + errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", password, "", 0, nil, nil, nil, nil) if errRet != nil { return tccommon.RetryError(errRet) } @@ -631,7 +698,7 @@ 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) + errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", v.(string), 0, nil, nil, nil, nil) if errRet != nil { return tccommon.RetryError(errRet) } @@ -690,7 +757,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, nil) if errRet != nil { err := errRet.(*sdkErrors.TencentCloudSDKError) if err.Code == es.INVALIDPARAMETER && licenseTypeUpgrading { @@ -721,7 +788,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, nil) if errRet != nil { return tccommon.RetryError(errRet) } @@ -760,7 +827,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, nil) if errRet != nil { return tccommon.RetryError(errRet) } @@ -811,7 +878,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, nil) if errRet != nil { return tccommon.RetryError(errRet) } @@ -826,6 +893,40 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met } } + if d.HasChange("cos_backup") { + if v, ok := d.GetOk("cos_backup"); ok { + cosBackup := es.CosBackup{} + for _, item := range v.([]interface{}) { + value := item.(map[string]interface{}) + if v, ok := value["is_auto_backup"]; ok { + cosBackup.IsAutoBackup = helper.Bool(v.(bool)) + } + + if v, ok := value["backup_time"]; ok && v.(string) != "" { + cosBackup.BackupTime = helper.String(v.(string)) + } + } + + err := resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError { + errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", 0, nil, nil, nil, &cosBackup) + if errRet != nil { + return tccommon.RetryError(errRet) + } + + return nil + }) + + if err != nil { + return err + } + + err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId) + if err != nil { + return err + } + } + } + d.Partial(false) return resourceTencentCloudElasticsearchInstanceRead(d, meta) diff --git a/tencentcloud/services/es/resource_tc_elasticsearch_instance.md b/tencentcloud/services/es/resource_tc_elasticsearch_instance.md index 0eae9200a0..d6b2d4c4e7 100644 --- a/tencentcloud/services/es/resource_tc_elasticsearch_instance.md +++ b/tencentcloud/services/es/resource_tc_elasticsearch_instance.md @@ -52,6 +52,11 @@ resource "tencentcloud_elasticsearch_instance" "example" { ] } + cos_backup { + is_auto_backup = true + backup_time = "22:00" + } + tags = { test = "test" } diff --git a/tencentcloud/services/es/service_tencentcloud_elasticsearch.go b/tencentcloud/services/es/service_tencentcloud_elasticsearch.go index 1b2a75d8b2..27b89c9b95 100644 --- a/tencentcloud/services/es/service_tencentcloud_elasticsearch.go +++ b/tencentcloud/services/es/service_tencentcloud_elasticsearch.go @@ -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 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, cosBackup *es.CosBackup) error { logId := tccommon.GetLogId(ctx) request := es.NewUpdateInstanceRequest() request.InstanceId = &instanceId @@ -132,6 +132,9 @@ func (me *ElasticsearchService) UpdateInstance(ctx context.Context, instanceId, if esAcl != nil { request.EsAcl = esAcl } + if cosBackup != nil { + request.CosBackup = cosBackup + } ratelimit.Check(request.GetAction()) _, err := me.client.UseEsClient().UpdateInstance(request) if err != nil { diff --git a/website/docs/r/elasticsearch_instance.html.markdown b/website/docs/r/elasticsearch_instance.html.markdown index 52be4997c8..ca66992d42 100644 --- a/website/docs/r/elasticsearch_instance.html.markdown +++ b/website/docs/r/elasticsearch_instance.html.markdown @@ -63,6 +63,11 @@ resource "tencentcloud_elasticsearch_instance" "example" { ] } + cos_backup { + is_auto_backup = true + backup_time = "22:00" + } + tags = { test = "test" } @@ -163,6 +168,7 @@ The following arguments are supported: * `basic_security_type` - (Optional, Int) Whether to enable X-Pack security authentication in Basic Edition 6.8 and above. Valid values are `1` and `2`. `1` is disabled, `2` is enabled, and default value is `1`. Notice: this parameter is only take effect on `basic` license. * `charge_period` - (Optional, Int, ForceNew) The tenancy of the prepaid instance, and uint is month. NOTE: it only works when charge_type is set to `PREPAID`. * `charge_type` - (Optional, String, ForceNew) The charge type of instance. Valid values are `PREPAID` and `POSTPAID_BY_HOUR`. +* `cos_backup` - (Optional, List) COS automatic backup information. * `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(_). @@ -174,6 +180,11 @@ The following arguments are supported: * `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). * `web_node_type_info` - (Optional, List) Visual node configuration. +The `cos_backup` object supports the following: + +* `backup_time` - (Required, String) Automatic backup execution time (accurate to the hour), e.g. `22:00`. +* `is_auto_backup` - (Required, Bool) Whether to enable automatic backup of cos. + The `es_acl` object supports the following: * `black_list` - (Optional, Set) Blacklist of kibana access.