Skip to content

Commit e6f5403

Browse files
tongyimingmikatong
andauthored
fix mongodb sharding instance support mongos params (#1543)
* fix mongodb sharding instance support mongos params * add changelog * update --------- Co-authored-by: mikatong <mikatong@tencent.com>
1 parent 49890cf commit e6f5403

File tree

15 files changed

+3193
-543
lines changed

15 files changed

+3193
-543
lines changed

.changelog/1543.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
resource/tencentcloud_mongodb_sharding_instance: support mongos params
3+
```

go.mod

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ require (
3535
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.445
3636
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.544
3737
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.412
38-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.584
38+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.588
3939
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.553
4040
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.572
4141
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335
@@ -52,8 +52,9 @@ require (
5252
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/lighthouse v1.0.413
5353
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/live v1.0.535
5454
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mariadb v1.0.532
55-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb v1.0.199
55+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb v1.0.588
5656
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor v1.0.518
57+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mps v1.0.584
5758
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization v1.0.540
5859
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres v1.0.391
5960
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/privatedns v1.0.290
@@ -81,7 +82,6 @@ require (
8182
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.0.199
8283
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.569
8384
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wss v1.0.199
84-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mps v1.0.584
8585
github.com/tencentyun/cos-go-sdk-v5 v0.7.40
8686
github.com/yangwenmai/ratelimit v0.0.0-20180104140304-44221c2292e1
8787
github.com/zclconf/go-cty v1.4.2 // indirect

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.583 h1:1zUg
567567
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.583/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
568568
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.584 h1:FbppCUoExsYKd8orUHqcTJacEIGgFcTyvzdFNMb/7zI=
569569
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.584/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
570+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.588 h1:DYtBXB7sVc3EOW5horg8j55cLZynhsLYhHrvQ/jXKKM=
571+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.588/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
570572
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.445 h1:Bh7XD0ypNMHYyBOM8hhKsSu+y0VVKUnJVS+YKKhfpGg=
571573
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.445/go.mod h1:jMDD351efCFpT1+KVFbcpu6SbmP4TYmp4qkoCfr63nQ=
572574
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.553 h1:Pl1kYgFhJp0QSoVFSzRsiGk+HfEAkBTQg7+O60tytNA=
@@ -612,6 +614,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mariadb v1.0.532 h1:3PC
612614
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mariadb v1.0.532/go.mod h1:lb1pdGQn9dzyXmq6+NkpN4avTVRvG+ziqFtOeL5D7y4=
613615
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb v1.0.199 h1:2jsGprrewRIP3smcTsY5GpEuOuJ+qyV/BN3Py0Ivf1o=
614616
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb v1.0.199/go.mod h1:f5GhbJyuYQBzRaDHGe3I4U9utb0Pmx2NlI+XcqSQRp0=
617+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb v1.0.588 h1:VfIklzFS9JFl4PrrR9Dk3jcEkgoaAkMrq/BUMk60M6c=
618+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb v1.0.588/go.mod h1:bAyanoZH6UqaapJOc6hTZACz/hi5AWJw2sa6oCQ5u0Y=
615619
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor v1.0.518 h1:XClo3Xa5F9pko91olHT85aZXXcRkQiOYBCMqm8+tHG8=
616620
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor v1.0.518/go.mod h1:WDTvvrrc90KE+90iizkoSQRsoSSQ3881eBC6NeypmTI=
617621
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mps v1.0.584 h1:FJxYOAolkBhXjQMWoiTek9Ag0bslcKFHyrM7w2Jsxos=

tencentcloud/extension_mongodb.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,24 @@ func TencentMongodbBasicInfo() map[string]*schema.Schema {
155155
Optional: true,
156156
Description: "The tags of the Mongodb. Key name `project` is system reserved and can't be used.",
157157
},
158+
"mongos_cpu": {
159+
Type: schema.TypeInt,
160+
Optional: true,
161+
Computed: true,
162+
Description: "Number of mongos cpu.",
163+
},
164+
"mongos_memory": {
165+
Type: schema.TypeInt,
166+
Optional: true,
167+
Computed: true,
168+
Description: "Mongos memory size.",
169+
},
170+
"mongos_node_num": {
171+
Type: schema.TypeInt,
172+
Optional: true,
173+
Computed: true,
174+
Description: "Number of mongos.",
175+
},
158176
// payment
159177
"charge_type": {
160178
Type: schema.TypeString,

tencentcloud/resource_tc_mongodb_sharding_instance.go

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,19 @@ resource "tencentcloud_mongodb_sharding_instance" "mongodb" {
1010
nodes_per_shard = 3
1111
memory = 4
1212
volume = 100
13-
engine_version = "MONGO_3_WT"
14-
machine_type = "GIO"
13+
engine_version = "MONGO_36_WT"
14+
machine_type = "HIO10G"
1515
available_zone = "ap-guangzhou-3"
1616
vpc_id = "vpc-mz3efvbw"
1717
subnet_id = "subnet-lk0svi3p"
1818
project_id = 0
1919
password = "password1234"
20+
mongos_cpu = 1
21+
mongos_memory = 2
22+
mongos_node_num = 3
2023
}
2124
```
2225
23-
Import
24-
25-
Mongodb sharding instance can be imported using the id, e.g.
26-
27-
```
28-
$ terraform import tencentcloud_mongodb_sharding_instance.mongodb cmgo-41s6jwy4
29-
```
3026
*/
3127
package tencentcloud
3228

@@ -72,9 +68,6 @@ func resourceTencentCloudMongodbShardingInstance() *schema.Resource {
7268
Read: resourceMongodbShardingInstanceRead,
7369
Update: resourceMongodbShardingInstanceUpdate,
7470
Delete: resourceMongodbShardingInstanceDelete,
75-
Importer: &schema.ResourceImporter{
76-
State: schema.ImportStatePassthrough,
77-
},
7871

7972
Schema: mongodbShardingInstanceInfo,
8073
}
@@ -154,6 +147,15 @@ func mongodbAllShardingInstanceReqSet(requestInter interface{}, d *schema.Resour
154147
value.FieldByName("AutoRenewFlag").Set(reflect.ValueOf(helper.IntUint64(d.Get("auto_renew_flag").(int))))
155148
}
156149

150+
if v, ok := d.GetOk("mongos_memory"); ok {
151+
value.FieldByName("MongosMemory").Set(reflect.ValueOf(helper.IntUint64(v.(int))))
152+
}
153+
if v, ok := d.GetOk("mongos_cpu"); ok {
154+
value.FieldByName("MongosCpu").Set(reflect.ValueOf(helper.IntUint64(v.(int))))
155+
}
156+
if v, ok := d.GetOk("mongos_node_num"); ok {
157+
value.FieldByName("MongosNodeNum").Set(reflect.ValueOf(helper.IntUint64(v.(int))))
158+
}
157159
return nil
158160
}
159161

@@ -392,7 +394,9 @@ func resourceMongodbShardingInstanceUpdate(d *schema.ResourceData, meta interfac
392394
region := client.Region
393395

394396
d.Partial(true)
395-
397+
if d.HasChange("mongos_cpu") || d.HasChange("mongos_memory") || d.HasChange("mongos_node_num") {
398+
return fmt.Errorf("setting of the field[mongos_cpu, mongos_memory, mongos_node_numZ] does not support update")
399+
}
396400
if d.HasChange("memory") || d.HasChange("volume") {
397401
memory := d.Get("memory").(int)
398402
volume := d.Get("volume").(int)
@@ -505,25 +509,21 @@ func resourceMongodbShardingInstanceDelete(d *schema.ResourceData, meta interfac
505509
return nil
506510
}
507511
if MONGODB_CHARGE_TYPE[*instanceDetail.PayMode] == MONGODB_CHARGE_TYPE_PREPAID {
508-
return fmt.Errorf("PREPAID instances are not allowed to be deleted now, please isolate them on console")
512+
err := mongodbService.TerminateDBInstances(ctx, instanceId)
513+
if err != nil {
514+
return err
515+
}
516+
} else {
517+
err := mongodbService.IsolateInstance(ctx, instanceId)
518+
if err != nil {
519+
return err
520+
}
509521
}
510522

511-
err = mongodbService.IsolateInstance(ctx, instanceId)
512-
if err != nil {
513-
return err
514-
}
515523
err = mongodbService.OfflineIsolatedDBInstance(ctx, instanceId, true)
516524
if err != nil {
517525
log.Printf("[CRITAL]%s mongodb %s fail, reason:%s", logId, "OfflineIsolatedDBInstance", err.Error())
518526
return err
519527
}
520-
//describe and check not exist
521-
_, has, errRet := mongodbService.DescribeInstanceById(ctx, instanceId)
522-
if errRet != nil {
523-
return errRet
524-
}
525-
if !has {
526-
return nil
527-
}
528-
return fmt.Errorf("[CRITAL]%s mongodb %s fail", logId, "OfflineIsolatedDBInstance")
528+
return nil
529529
}

tencentcloud/resource_tc_mongodb_sharding_instance_test.go

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
"github.com/hashicorp/terraform-plugin-sdk/terraform"
1010
)
1111

12-
func TestAccTencentCloudNeedFixMongodbShardingInstance(t *testing.T) {
12+
func TestAccTencentCloudMongodbShardingInstanceResource_postpaid(t *testing.T) {
1313
t.Parallel()
1414
resource.Test(t, resource.TestCase{
1515
PreCheck: func() { testAccPreCheckCommon(t, ACCOUNT_TYPE_PREPAY) },
@@ -47,12 +47,17 @@ func TestAccTencentCloudNeedFixMongodbShardingInstance(t *testing.T) {
4747
resource.TestCheckResourceAttr("tencentcloud_mongodb_sharding_instance.mongodb", "tags.abc", "abc"),
4848
),
4949
},
50-
{
51-
ResourceName: "tencentcloud_mongodb_sharding_instance.mongodb",
52-
ImportState: true,
53-
ImportStateVerify: true,
54-
ImportStateVerifyIgnore: []string{"security_groups", "password", "auto_renew_flag"},
55-
},
50+
},
51+
})
52+
}
53+
54+
func TestAccTencentCloudMongodbShardingInstanceResource_prepaid(t *testing.T) {
55+
t.Parallel()
56+
resource.Test(t, resource.TestCase{
57+
PreCheck: func() { testAccPreCheckCommon(t, ACCOUNT_TYPE_PREPAY) },
58+
Providers: testAccProviders,
59+
CheckDestroy: testAccCheckMongodbShardingInstanceDestroy,
60+
Steps: []resource.TestStep{
5661
{
5762
Config: testAccMongodbShardingInstancePrepaid,
5863
Check: resource.ComposeTestCheckFunc(
@@ -121,7 +126,9 @@ resource "tencentcloud_mongodb_sharding_instance" "mongodb" {
121126
available_zone = "ap-guangzhou-6"
122127
project_id = 0
123128
password = "test1234"
124-
129+
mongos_cpu = 1
130+
mongos_memory = 2
131+
mongos_node_num = 3
125132
tags = {
126133
test = "test"
127134
}
@@ -133,13 +140,16 @@ resource "tencentcloud_mongodb_sharding_instance" "mongodb" {
133140
instance_name = "tf-mongodb-sharding-update"
134141
shard_quantity = 2
135142
nodes_per_shard = 3
136-
memory = local.sharding_memory * 2
137-
volume = local.sharding_volume + 50
143+
memory = local.sharding_memory
144+
volume = local.sharding_volume
138145
engine_version = local.sharding_engine_version
139146
machine_type = local.sharding_machine_type
140147
available_zone = "ap-guangzhou-6"
141148
project_id = 0
142149
password = "test1234update"
150+
mongos_cpu = 1
151+
mongos_memory = 2
152+
mongos_node_num = 3
143153
144154
tags = {
145155
abc = "abc"
@@ -152,8 +162,8 @@ resource "tencentcloud_mongodb_sharding_instance" "mongodb_prepaid" {
152162
instance_name = "tf-mongodb-sharding-prepaid"
153163
shard_quantity = 2
154164
nodes_per_shard = 3
155-
memory = local.sharding_memory * 2
156-
volume = local.sharding_volume + 50
165+
memory = local.sharding_memory
166+
volume = local.sharding_volume
157167
engine_version = local.sharding_engine_version
158168
machine_type = local.sharding_machine_type
159169
available_zone = "ap-guangzhou-6"
@@ -162,6 +172,9 @@ resource "tencentcloud_mongodb_sharding_instance" "mongodb_prepaid" {
162172
charge_type = "PREPAID"
163173
prepaid_period = 1
164174
auto_renew_flag = 0
175+
mongos_cpu = 1
176+
mongos_memory = 2
177+
mongos_node_num = 3
165178
166179
tags = {
167180
test = "test-prepaid"
@@ -174,8 +187,8 @@ resource "tencentcloud_mongodb_sharding_instance" "mongodb_prepaid" {
174187
instance_name = "tf-mongodb-sharding-prepaid-update"
175188
shard_quantity = 2
176189
nodes_per_shard = 3
177-
memory = local.sharding_memory * 2
178-
volume = local.sharding_volume + 50
190+
memory = local.sharding_memory
191+
volume = local.sharding_volume
179192
engine_version = local.sharding_engine_version
180193
machine_type = local.sharding_machine_type
181194
available_zone = "ap-guangzhou-6"
@@ -184,6 +197,9 @@ resource "tencentcloud_mongodb_sharding_instance" "mongodb_prepaid" {
184197
charge_type = "PREPAID"
185198
prepaid_period = 1
186199
auto_renew_flag = 0
200+
mongos_cpu = 1
201+
mongos_memory = 2
202+
mongos_node_num = 3
187203
188204
tags = {
189205
prepaid = "prepaid"

tencentcloud/service_tencentcloud_mongodb.go

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55
"fmt"
66
"log"
7-
"strings"
87

98
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
109
sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
@@ -262,6 +261,35 @@ func (me *MongodbService) IsolateInstance(ctx context.Context, instanceId string
262261
return
263262
}
264263

264+
func (me *MongodbService) TerminateDBInstances(ctx context.Context, instanceId string) (errRet error) {
265+
logId := getLogId(ctx)
266+
request := mongodb.NewTerminateDBInstancesRequest()
267+
request.InstanceId = &instanceId
268+
defer func() {
269+
if errRet != nil {
270+
log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error())
271+
}
272+
}()
273+
var response *mongodb.TerminateDBInstancesResponse
274+
err := resource.Retry(10*writeRetryTimeout, func() *resource.RetryError {
275+
ratelimit.Check(request.GetAction())
276+
result, e := me.client.UseMongodbClient().TerminateDBInstances(request)
277+
if e != nil {
278+
log.Printf("[CRITAL]%s api[%s] fail, reason:%s", logId, request.GetAction(), e.Error())
279+
return resource.RetryableError(fmt.Errorf("Terminate instance %s error", instanceId))
280+
}
281+
response = result
282+
return nil
283+
})
284+
if err != nil {
285+
return err
286+
}
287+
288+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]",
289+
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
290+
return
291+
}
292+
265293
func (me *MongodbService) ModifyAutoRenewFlag(ctx context.Context, instanceId string, period int, renewFlag int) (errRet error) {
266294
logId := getLogId(ctx)
267295
request := mongodb.NewRenewDBInstancesRequest()
@@ -331,7 +359,7 @@ func (me *MongodbService) OfflineIsolatedDBInstance(ctx context.Context, instanc
331359
ratelimit.Check(request.GetAction())
332360
response, err = me.client.UseMongodbClient().OfflineIsolatedDBInstance(request)
333361
if err != nil {
334-
return retryError(err, mongodb.INVALIDPARAMETERVALUE_LOCKFAILED)
362+
return resource.RetryableError(err)
335363
}
336364
return nil
337365
})
@@ -343,14 +371,26 @@ func (me *MongodbService) OfflineIsolatedDBInstance(ctx context.Context, instanc
343371
if response == nil || response.Response == nil {
344372
return nil
345373
}
346-
err = me.DescribeAsyncRequestInfo(ctx, *response.Response.AsyncRequestId)
347-
if err == nil {
348-
return nil
349-
}
350-
isTimeout := strings.Contains(err.Error(), "retrying")
351-
if err != nil && isTimeout && timeOutTolerant {
352-
log.Printf("[WARN] Offline Task Timeout but tolerant, process continue.")
353-
return nil
374+
375+
checkRequest := mongodb.NewDescribeDBInstancesRequest()
376+
checkRequest.InstanceIds = []*string{&instanceId}
377+
err = resource.Retry(20*readRetryTimeout, func() *resource.RetryError {
378+
ratelimit.Check(checkRequest.GetAction())
379+
result, e := me.client.UseMongodbClient().DescribeDBInstances(checkRequest)
380+
if e != nil {
381+
return resource.NonRetryableError(e)
382+
}
383+
384+
if result != nil && result.Response != nil {
385+
if len(result.Response.InstanceDetails) != 0 {
386+
return resource.RetryableError(fmt.Errorf("Offline mongodb instance is processing"))
387+
}
388+
return nil
389+
}
390+
return resource.NonRetryableError(fmt.Errorf("response is null"))
391+
})
392+
if err != nil {
393+
return err
354394
}
355-
return err
395+
return nil
356396
}

vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)