diff --git a/.changelog/3055.txt b/.changelog/3055.txt new file mode 100644 index 0000000000..5d32b80d5a --- /dev/null +++ b/.changelog/3055.txt @@ -0,0 +1,3 @@ +```release-note:new-resource +tencentcloud_mongodb_instance_params +``` diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index b669f8f273..6e79b90344 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -1400,6 +1400,7 @@ func Provider() *schema.Provider { "tencentcloud_mongodb_instance_backup_download_task": mongodb.ResourceTencentCloudMongodbInstanceBackupDownloadTask(), "tencentcloud_mongodb_instance_transparent_data_encryption": mongodb.ResourceTencentCloudMongodbInstanceTransparentDataEncryption(), "tencentcloud_mongodb_instance_backup_rule": mongodb.ResourceTencentCloudMongodbInstanceBackupRule(), + "tencentcloud_mongodb_instance_params": mongodb.ResourceTencentCloudMongodbInstanceParams(), "tencentcloud_dayu_cc_http_policy": dayu.ResourceTencentCloudDayuCCHttpPolicy(), "tencentcloud_dayu_cc_https_policy": dayu.ResourceTencentCloudDayuCCHttpsPolicy(), "tencentcloud_dayu_ddos_policy": dayu.ResourceTencentCloudDayuDdosPolicy(), diff --git a/tencentcloud/provider.md b/tencentcloud/provider.md index 2a3c3d9aeb..730d9305e6 100644 --- a/tencentcloud/provider.md +++ b/tencentcloud/provider.md @@ -727,6 +727,7 @@ TencentDB for MongoDB(mongodb) tencentcloud_mongodb_instance_backup tencentcloud_mongodb_instance_transparent_data_encryption tencentcloud_mongodb_instance_backup_rule + tencentcloud_mongodb_instance_params TencentDB for MySQL(cdb) Data Source diff --git a/tencentcloud/services/mongodb/resource_tc_mongodb_instance_params.go b/tencentcloud/services/mongodb/resource_tc_mongodb_instance_params.go new file mode 100644 index 0000000000..8333e2b8ce --- /dev/null +++ b/tencentcloud/services/mongodb/resource_tc_mongodb_instance_params.go @@ -0,0 +1,219 @@ +package mongodb + +import ( + "context" + "fmt" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + mongodb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb/v20190725" + + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func ResourceTencentCloudMongodbInstanceParams() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudMongodbInstanceParamsCreate, + Read: resourceTencentCloudMongodbInstanceParamsRead, + Update: resourceTencentCloudMongodbInstanceParamsUpdate, + Delete: resourceTencentCloudMongodbInstanceParamsDelete, + Schema: map[string]*schema.Schema{ + "instance_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Instance id.", + }, + + "instance_params": { + Type: schema.TypeSet, + Required: true, + Description: "Specify the parameter name and value to be modified.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "key": { + Type: schema.TypeString, + Required: true, + Description: "Parameter names that need to be modified.", + }, + "value": { + Type: schema.TypeString, + Required: true, + Description: "The value corresponding to the parameter name to be modified.", + }, + }, + }, + }, + + "modify_type": { + Type: schema.TypeString, + Optional: true, + Description: "Operation types, including:\n" + + " - IMMEDIATELY: Adjust immediately;\n" + + " - DELAY: Delay adjustment;\n" + + "Optional field. If this parameter is not configured, it defaults to immediate adjustment.", + }, + }, + } +} + +func resourceTencentCloudMongodbInstanceParamsCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_mongodb_instance_params.create")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + instanceId string + ) + if v, ok := d.GetOk("instance_id"); ok { + instanceId = v.(string) + } + + d.SetId(instanceId) + + return resourceTencentCloudMongodbInstanceParamsUpdate(d, meta) +} + +func resourceTencentCloudMongodbInstanceParamsRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_mongodb_instance_params.read")() + defer tccommon.InconsistentCheck(d, meta)() + + logId := tccommon.GetLogId(tccommon.ContextNil) + + ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + + service := MongodbService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + + instanceId := d.Id() + + _ = d.Set("instance_id", instanceId) + + instanceParams := d.Get("instance_params").(*schema.Set).List() + paramNames := make([]string, 0) + for _, instanceParam := range instanceParams { + instanceParamMap := instanceParam.(map[string]interface{}) + paramNames = append(paramNames, instanceParamMap["key"].(string)) + } + respData, err := service.DescribeMongodbInstanceParamValues(ctx, instanceId, paramNames) + if err != nil { + return err + } + + if respData == nil { + d.SetId("") + log.Printf("[WARN]%s resource `mongodb_instance_params` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + return nil + } + + resInstanceParams := make([]interface{}, 0) + for k, v := range respData { + resInstanceParams = append(resInstanceParams, map[string]interface{}{ + "key": k, + "value": v, + }) + } + _ = d.Set("instance_params", resInstanceParams) + + return nil +} + +func resourceTencentCloudMongodbInstanceParamsUpdate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_mongodb_instance_params.update")() + defer tccommon.InconsistentCheck(d, meta)() + + logId := tccommon.GetLogId(tccommon.ContextNil) + + ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + + instanceId := d.Id() + + needChange := false + mutableArgs := []string{"instance_params"} + for _, v := range mutableArgs { + if d.HasChange(v) { + needChange = true + break + } + } + + if needChange { + request := mongodb.NewModifyInstanceParamsRequest() + request.InstanceId = helper.String(d.Get("instance_id").(string)) + + if v, ok := d.GetOk("instance_params"); ok { + for _, item := range v.(*schema.Set).List() { + instanceParamsMap := item.(map[string]interface{}) + modifyMongoDBParamType := mongodb.ModifyMongoDBParamType{} + if v, ok := instanceParamsMap["key"]; ok { + modifyMongoDBParamType.Key = helper.String(v.(string)) + } + if v, ok := instanceParamsMap["value"]; ok { + modifyMongoDBParamType.Value = helper.String(v.(string)) + } + request.InstanceParams = append(request.InstanceParams, &modifyMongoDBParamType) + } + } + + if v, ok := d.GetOk("modify_type"); ok { + request.ModifyType = helper.String(v.(string)) + } + + err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseMongodbClient().ModifyInstanceParamsWithContext(ctx, request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + return nil + }) + if err != nil { + log.Printf("[CRITAL]%s update mongodb instance params failed, reason:%+v", logId, err) + return err + } + + service := MongodbService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + instanceParams := d.Get("instance_params").(*schema.Set).List() + paramMap := make(map[string]string) + paramNames := make([]string, 0) + + for _, instanceParam := range instanceParams { + instanceParamMap := instanceParam.(map[string]interface{}) + key := instanceParamMap["key"].(string) + value := instanceParamMap["value"].(string) + paramMap[key] = value + paramNames = append(paramNames, key) + } + + err = resource.Retry(6*tccommon.WriteRetryTimeout, func() *resource.RetryError { + respMap, e := service.DescribeMongodbInstanceParamValues(ctx, instanceId, paramNames) + if e != nil { + return tccommon.RetryError(e) + } + + for k, v := range paramMap { + if vv, ok := respMap[k]; ok { + if v != vv { + return resource.RetryableError(fmt.Errorf("param %s is still being updated", k)) + } + } + } + return nil + }) + if err != nil { + log.Printf("[CRITAL]%s update mongodb instance params failed, reason:%+v", logId, err) + return err + } + } + + _ = instanceId + return resourceTencentCloudMongodbInstanceParamsRead(d, meta) +} + +func resourceTencentCloudMongodbInstanceParamsDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_mongodb_instance_params.delete")() + defer tccommon.InconsistentCheck(d, meta)() + + return nil +} diff --git a/tencentcloud/services/mongodb/resource_tc_mongodb_instance_params.md b/tencentcloud/services/mongodb/resource_tc_mongodb_instance_params.md new file mode 100644 index 0000000000..b1e63c8b6c --- /dev/null +++ b/tencentcloud/services/mongodb/resource_tc_mongodb_instance_params.md @@ -0,0 +1,13 @@ +Provides a resource to create a mongodb mongodb_instance_params + +Example Usage + +```hcl +resource "tencentcloud_mongodb_instance_params" "mongodb_instance_params" { + instance_id = "cmgo-xxxxxx" + instance_params { + key = "cmgo.crossZoneLoadBalancing" + value = "on" + } +} +``` diff --git a/tencentcloud/services/mongodb/resource_tc_mongodb_instance_params_test.go b/tencentcloud/services/mongodb/resource_tc_mongodb_instance_params_test.go new file mode 100644 index 0000000000..f2b3b205eb --- /dev/null +++ b/tencentcloud/services/mongodb/resource_tc_mongodb_instance_params_test.go @@ -0,0 +1,57 @@ +package mongodb_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" +) + +func TestAccTencentCloudMongodbInstanceParamsResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccMongodbInstanceParams, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_mongodb_instance_params.mongodb_instance_params", "id"), + resource.TestCheckResourceAttr("tencentcloud_mongodb_instance_params.mongodb_instance_params", "instance_params.0.key", "cmgo.crossZoneLoadBalancing"), + resource.TestCheckResourceAttr("tencentcloud_mongodb_instance_params.mongodb_instance_params", "instance_params.0.value", "on"), + ), + }, + { + Config: testAccMongodbInstanceParamsUpdate, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_mongodb_instance_params.mongodb_instance_params", "id"), + resource.TestCheckResourceAttr("tencentcloud_mongodb_instance_params.mongodb_instance_params", "instance_params.0.key", "cmgo.crossZoneLoadBalancing"), + resource.TestCheckResourceAttr("tencentcloud_mongodb_instance_params.mongodb_instance_params", "instance_params.0.value", "off"), + ), + }, + }, + }) +} + +const testAccMongodbInstanceParams = ` +resource "tencentcloud_mongodb_instance_params" "mongodb_instance_params" { + instance_id = "cmgo-c6k2v891" + instance_params { + key = "cmgo.crossZoneLoadBalancing" + value = "on" + } +} +` + +const testAccMongodbInstanceParamsUpdate = ` +resource "tencentcloud_mongodb_instance_params" "mongodb_instance_params" { + instance_id = "cmgo-c6k2v891" + instance_params { + key = "cmgo.crossZoneLoadBalancing" + value = "off" + } +} +` diff --git a/tencentcloud/services/mongodb/service_tencentcloud_mongodb.go b/tencentcloud/services/mongodb/service_tencentcloud_mongodb.go index d5f426d82f..f5fa832a63 100644 --- a/tencentcloud/services/mongodb/service_tencentcloud_mongodb.go +++ b/tencentcloud/services/mongodb/service_tencentcloud_mongodb.go @@ -923,3 +923,57 @@ func (me *MongodbService) SetInstanceMaintenance(ctx context.Context, instanceId return nil } + +func (me *MongodbService) DescribeMongodbInstanceParamValues(ctx context.Context, instanceId string, paramNames []string) (res map[string]string, errRet error) { + logId := tccommon.GetLogId(ctx) + + request := mongodb.NewDescribeInstanceParamsRequest() + request.InstanceId = helper.String(instanceId) + + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error()) + } + }() + + ratelimit.Check(request.GetAction()) + + response, err := me.client.UseMongodbClient().DescribeInstanceParams(request) + if err != nil { + errRet = err + return + } + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) + + res = make(map[string]string) + for _, param := range response.Response.InstanceEnumParam { + for _, paramName := range paramNames { + if *param.ParamName == paramName { + res[paramName] = *param.CurrentValue + } + } + } + for _, param := range response.Response.InstanceIntegerParam { + for _, paramName := range paramNames { + if *param.ParamName == paramName { + res[paramName] = *param.CurrentValue + } + } + } + for _, param := range response.Response.InstanceMultiParam { + for _, paramName := range paramNames { + if *param.ParamName == paramName { + res[paramName] = *param.CurrentValue + } + } + } + for _, param := range response.Response.InstanceTextParam { + for _, paramName := range paramNames { + if *param.ParamName == paramName { + res[paramName] = *param.CurrentValue + } + } + } + + return +} diff --git a/website/docs/r/mongodb_instance_params.html.markdown b/website/docs/r/mongodb_instance_params.html.markdown new file mode 100644 index 0000000000..49987f118e --- /dev/null +++ b/website/docs/r/mongodb_instance_params.html.markdown @@ -0,0 +1,49 @@ +--- +subcategory: "TencentDB for MongoDB(mongodb)" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_mongodb_instance_params" +sidebar_current: "docs-tencentcloud-resource-mongodb_instance_params" +description: |- + Provides a resource to create a mongodb mongodb_instance_params +--- + +# tencentcloud_mongodb_instance_params + +Provides a resource to create a mongodb mongodb_instance_params + +## Example Usage + +```hcl +resource "tencentcloud_mongodb_instance_params" "mongodb_instance_params" { + instance_id = "cmgo-xxxxxx" + instance_params { + key = "cmgo.crossZoneLoadBalancing" + value = "on" + } +} +``` + +## Argument Reference + +The following arguments are supported: + +* `instance_id` - (Required, String, ForceNew) Instance id. +* `instance_params` - (Required, Set) Specify the parameter name and value to be modified. +* `modify_type` - (Optional, String) Operation types, including: + - IMMEDIATELY: Adjust immediately; + - DELAY: Delay adjustment; +Optional field. If this parameter is not configured, it defaults to immediate adjustment. + +The `instance_params` object supports the following: + +* `key` - (Required, String) Parameter names that need to be modified. +* `value` - (Required, String) The value corresponding to the parameter name to be modified. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. + + + diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb index b8f597b1a0..e9b4d05bc0 100644 --- a/website/tencentcloud.erb +++ b/website/tencentcloud.erb @@ -5683,6 +5683,9 @@