diff --git a/.changelog/3199.txt b/.changelog/3199.txt new file mode 100644 index 0000000000..b1a6a4eff3 --- /dev/null +++ b/.changelog/3199.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_mongodb_sharding_instance: support update mongos_memory +``` diff --git a/tencentcloud/acctest/basic.go b/tencentcloud/acctest/basic.go index 906fbc90b3..32dd227fcc 100644 --- a/tencentcloud/acctest/basic.go +++ b/tencentcloud/acctest/basic.go @@ -856,10 +856,10 @@ locals { locals { filtered_sharding_spec = [for i in data.tencentcloud_mongodb_zone_config.zone_config.list: i if lookup(i, "cluster_type") == "SHARD" && lookup(i, "min_replicate_set_num") > 0 && lookup(i, "machine_type") == "HIO10G" && lookup(i, "engine_version") == "4.4" && lookup(i, "memory") == 4096 && lookup(i, "default_storage") == 256000] sharding_spec = concat(local.filtered_sharding_spec, [for i in data.tencentcloud_mongodb_zone_config.zone_config.list: i if lookup(i, "cluster_type") == "SHARD" && lookup(i, "min_replicate_set_num") > 0]) - sharding_machine_type = local.sharding_spec.0.machine_type - sharding_memory = local.sharding_spec.0.memory / 1024 - sharding_volume = local.sharding_spec.0.default_storage / 1000 - sharding_engine_version = lookup(var.engine_versions, local.sharding_spec.0.engine_version) + sharding_machine_type = local.filtered_sharding_spec.0.machine_type + sharding_memory = local.filtered_sharding_spec.0.memory / 1024 + sharding_volume = local.filtered_sharding_spec.0.default_storage / 1000 + sharding_engine_version = lookup(var.engine_versions, local.filtered_sharding_spec.0.engine_version) } ` diff --git a/tencentcloud/services/mongodb/resource_tc_mongodb_sharding_instance.go b/tencentcloud/services/mongodb/resource_tc_mongodb_sharding_instance.go index 7ae88cd452..b4875be3ff 100644 --- a/tencentcloud/services/mongodb/resource_tc_mongodb_sharding_instance.go +++ b/tencentcloud/services/mongodb/resource_tc_mongodb_sharding_instance.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors" mongodb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb/v20190725" "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" @@ -429,8 +430,40 @@ func resourceMongodbShardingInstanceUpdate(d *schema.ResourceData, meta interfac if d.HasChange("availability_zone_list") || d.HasChange("hidden_zone") { return fmt.Errorf("setting of the field[availability_zone_list, hidden_zone] does not support update") } - if d.HasChange("mongos_cpu") || d.HasChange("mongos_memory") || d.HasChange("mongos_node_num") { - return fmt.Errorf("setting of the field[mongos_cpu, mongos_memory, mongos_node_num] does not support update") + if d.HasChange("mongos_node_num") { + return fmt.Errorf("setting of the field[mongos_node_num] does not support update") + } + + if d.HasChange("mongos_cpu") && d.HasChange("mongos_memory") { + if v, ok := d.GetOk("mongos_memory"); ok { + dealId, err := mongodbService.ModifyMongosMemory(ctx, instanceId, v.(int)) + if err != nil { + return err + } + if dealId == "" { + return fmt.Errorf("deal id is empty") + } + + errUpdate := resource.Retry(20*tccommon.ReadRetryTimeout, func() *resource.RetryError { + dealResponseParams, err := mongodbService.DescribeDBInstanceDeal(ctx, dealId) + if err != nil { + if sdkError, ok := err.(*sdkErrors.TencentCloudSDKError); ok { + if sdkError.Code == "InvalidParameter" && sdkError.Message == "deal resource not found." { + return resource.RetryableError(err) + } + } + return resource.NonRetryableError(err) + } + + if *dealResponseParams.Status != MONGODB_STATUS_DELIVERY_SUCCESS { + return resource.RetryableError(fmt.Errorf("mongodb status is not delivery success")) + } + return nil + }) + if errUpdate != nil { + return errUpdate + } + } } if d.HasChange("memory") || d.HasChange("volume") { memory := d.Get("memory").(int) diff --git a/tencentcloud/services/mongodb/resource_tc_mongodb_sharding_instance_test.go b/tencentcloud/services/mongodb/resource_tc_mongodb_sharding_instance_test.go index 9d59ceae51..27abb17936 100644 --- a/tencentcloud/services/mongodb/resource_tc_mongodb_sharding_instance_test.go +++ b/tencentcloud/services/mongodb/resource_tc_mongodb_sharding_instance_test.go @@ -71,6 +71,32 @@ func TestAccTencentCloudMongodbShardingInstanceResource_postpaid(t *testing.T) { }) } +func TestAccTencentCloudMongodbShardingInstanceResource_mongos(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { tcacctest.AccPreCheck(t) }, + Providers: tcacctest.AccProviders, + CheckDestroy: testAccCheckMongodbShardingInstanceDestroy, + Steps: []resource.TestStep{ + { + Config: testAccMongodbShardingInstanceMongos, + Check: resource.ComposeTestCheckFunc( + testAccCheckMongodbInstanceExists("tencentcloud_mongodb_sharding_instance.mongodb"), + resource.TestCheckResourceAttr("tencentcloud_mongodb_sharding_instance.mongodb", "mongos_cpu", "1"), + resource.TestCheckResourceAttr("tencentcloud_mongodb_sharding_instance.mongodb", "mongos_memory", "2"), + ), + }, + { + Config: testAccMongodbShardingInstanceMongosUpdate, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr("tencentcloud_mongodb_sharding_instance.mongodb", "mongos_cpu", "2"), + resource.TestCheckResourceAttr("tencentcloud_mongodb_sharding_instance.mongodb", "mongos_memory", "4"), + ), + }, + }, + }) +} + func TestAccTencentCloudMongodbShardingInstanceResource_prepaid(t *testing.T) { t.Parallel() resource.Test(t, resource.TestCase{ @@ -250,6 +276,72 @@ resource "tencentcloud_mongodb_sharding_instance" "mongodb" { } ` +const testAccMongodbShardingInstanceMongos = tcacctest.DefaultMongoDBSpec + ` +resource "tencentcloud_vpc" "vpc" { + name = "mongodb-sharding-vpc" + cidr_block = "10.0.0.0/16" + } + +resource "tencentcloud_subnet" "subnet" { + vpc_id = tencentcloud_vpc.vpc.id + name = "mongodb-sharding-subnet" + cidr_block = "10.0.0.0/16" + availability_zone = "ap-guangzhou-3" +} + +resource "tencentcloud_mongodb_sharding_instance" "mongodb" { + instance_name = "tf-mongodb-sharding" + shard_quantity = 2 + nodes_per_shard = 3 + memory = local.sharding_memory + volume = local.sharding_volume + engine_version = local.sharding_engine_version + machine_type = local.sharding_machine_type + security_groups = [local.security_group_id] + available_zone = "ap-guangzhou-3" + project_id = 0 + password = "test1234" + mongos_cpu = 1 + mongos_memory = 2 + mongos_node_num = 3 + vpc_id = tencentcloud_vpc.vpc.id + subnet_id = tencentcloud_subnet.subnet.id +} +` + +const testAccMongodbShardingInstanceMongosUpdate = tcacctest.DefaultMongoDBSpec + ` +resource "tencentcloud_vpc" "vpc" { + name = "mongodb-sharding-vpc" + cidr_block = "10.0.0.0/16" + } + +resource "tencentcloud_subnet" "subnet" { + vpc_id = tencentcloud_vpc.vpc.id + name = "mongodb-sharding-subnet" + cidr_block = "10.0.0.0/16" + availability_zone = "ap-guangzhou-3" +} + +resource "tencentcloud_mongodb_sharding_instance" "mongodb" { + instance_name = "tf-mongodb-sharding" + shard_quantity = 2 + nodes_per_shard = 3 + memory = local.sharding_memory + volume = local.sharding_volume + engine_version = local.sharding_engine_version + machine_type = local.sharding_machine_type + security_groups = [local.security_group_id] + available_zone = "ap-guangzhou-3" + project_id = 0 + password = "test1234" + mongos_cpu = 2 + mongos_memory = 4 + mongos_node_num = 3 + vpc_id = tencentcloud_vpc.vpc.id + subnet_id = tencentcloud_subnet.subnet.id +} +` + const testAccMongodbShardingInstancePrepaid = tcacctest.DefaultMongoDBSpec + ` resource "tencentcloud_vpc" "vpc" { name = "mongodb-sharding-prepaid-vpc" diff --git a/tencentcloud/services/mongodb/service_tencentcloud_mongodb.go b/tencentcloud/services/mongodb/service_tencentcloud_mongodb.go index 2333ec63e9..ef1a19c2df 100644 --- a/tencentcloud/services/mongodb/service_tencentcloud_mongodb.go +++ b/tencentcloud/services/mongodb/service_tencentcloud_mongodb.go @@ -118,6 +118,48 @@ func (me *MongodbService) ResetInstancePassword(ctx context.Context, instanceId, return nil } +func (me *MongodbService) ModifyMongosMemory(ctx context.Context, instanceId string, mongosMemory int) (dealId string, errRet error) { + logId := tccommon.GetLogId(ctx) + request := mongodb.NewModifyDBInstanceSpecRequest() + request.InstanceId = &instanceId + request.MongosMemory = helper.String(helper.IntToStr(mongosMemory)) + + var response *mongodb.ModifyDBInstanceSpecResponse + tradeError := false + err := resource.Retry(6*tccommon.WriteRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseMongodbClient().ModifyDBInstanceSpec(request) + if e != nil { + // request might be accepted between "InvalidParameterValue.InvalidTradeOperation" and "InvalidParameterValue.StatusAbnormal" error + if ee, ok := e.(*sdkErrors.TencentCloudSDKError); ok { + if ee.Code == "InvalidParameterValue.InvalidTradeOperation" { + tradeError = true + return resource.RetryableError(e) + } else if ee.Code == "InvalidParameterValue.StatusAbnormal" && tradeError { + response = result + return nil + } else { + return resource.NonRetryableError(e) + } + } + log.Printf("[CRITAL]%s api[%s] fail, reason:%s", logId, request.GetAction(), e.Error()) + return resource.NonRetryableError(e) + } + response = result + return nil + }) + if err != nil { + errRet = err + return + } + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]", + logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) + + if response != nil && response.Response != nil && response.Response.DealId != nil { + dealId = *response.Response.DealId + } + return +} func (me *MongodbService) UpgradeInstance(ctx context.Context, instanceId string, memory int, volume int, params map[string]interface{}) (dealId string, errRet error) { logId := tccommon.GetLogId(ctx) request := mongodb.NewModifyDBInstanceSpecRequest()