Skip to content

fix(mongodb): [122166452]support update mongos_memory #3199

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/3199.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
resource/tencentcloud_mongodb_sharding_instance: support update mongos_memory
```
8 changes: 4 additions & 4 deletions tencentcloud/acctest/basic.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
`

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand Down Expand Up @@ -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"
Expand Down
42 changes: 42 additions & 0 deletions tencentcloud/services/mongodb/service_tencentcloud_mongodb.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
Loading