Skip to content

Commit ec7b68e

Browse files
authored
feat:support db kernel version upgrading (#1712)
* feat:support db kernel version upgrading * update kernel version logic * passed the e2e case * add changelog * adjust logic to only support immediate upgrade * update changlog * update doc * rm kernel tips in update
1 parent 5af17fe commit ec7b68e

File tree

6 files changed

+202
-12
lines changed

6 files changed

+202
-12
lines changed

.changelog/1712.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_postgresql_instance: support to update minor kernel versions by field `db_kernel_version`
3+
```

tencentcloud/extension_postgresql.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ const (
1818
POSTGRESQL_DB_VERSION_10_4 = "10.4"
1919
)
2020

21+
const (
22+
POSTGRESQL_KERNEL_UPGRADE_IMMEDIATELY = 0
23+
POSTGRESQL_KERNEL_UPGRADE_SPECIFIED_TIME = 1
24+
POSTGRESQL_KERNEL_UPGRADE_MAINTAIN_WINDOW = 2
25+
)
26+
2127
var POSTSQL_DB_VERSION = []string{POSTGRESQL_DB_VERSION_9_3_5, POSTGRESQL_DB_VERSION_9_5_4, POSTGRESQL_DB_VERSION_10_4}
2228

2329
const (

tencentcloud/resource_tc_postgresql_instance.go

Lines changed: 78 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,37 @@ resource "tencentcloud_postgresql_instance" "pg" {
132132
}
133133
```
134134
135+
upgrade kernel version
136+
```
137+
resource "tencentcloud_postgresql_instance" "test" {
138+
name = "tf_postsql_instance_update"
139+
availability_zone = data.tencentcloud_availability_zones_by_product.zone.zones[5].name
140+
charge_type = "POSTPAID_BY_HOUR"
141+
vpc_id = local.vpc_id
142+
subnet_id = local.subnet_id
143+
engine_version = "13.3"
144+
root_password = "*"
145+
charset = "LATIN1"
146+
project_id = 0
147+
public_access_switch = false
148+
security_groups = [local.sg_id]
149+
memory = 4
150+
storage = 250
151+
backup_plan {
152+
min_backup_start_time = "01:10:11"
153+
max_backup_start_time = "02:10:11"
154+
base_backup_retention_period = 5
155+
backup_period = ["monday", "thursday", "sunday"]
156+
}
157+
158+
db_kernel_version = "v13.3_r1.4" # eg:from v13.3_r1.1 to v13.3_r1.4
159+
160+
tags = {
161+
tf = "teest"
162+
}
163+
}
164+
```
165+
135166
Import
136167
137168
postgresql instance can be imported using the id, e.g.
@@ -232,7 +263,7 @@ func resourceTencentCloudPostgresqlInstance() *schema.Resource {
232263
Optional: true,
233264
Computed: true,
234265
Description: "PostgreSQL kernel version number. " +
235-
"If it is specified, an instance running kernel DBKernelVersion will be created.",
266+
"If it is specified, an instance running kernel DBKernelVersion will be created. It supports updating the minor kernel version immediately.",
236267
},
237268

238269
"vpc_id": {
@@ -992,6 +1023,49 @@ func resourceTencentCloudPostgresqlInstanceUpdate(d *schema.ResourceData, meta i
9921023

9931024
}
9941025

1026+
if d.HasChange("db_kernel_version") {
1027+
upgradeVersion := d.Get("db_kernel_version").(string)
1028+
1029+
upgradeRequest := postgresql.NewUpgradeDBInstanceKernelVersionRequest()
1030+
// upgradeResponse:= postgresql.NewUpgradeDBInstanceKernelVersionResponse()
1031+
upgradeRequest.DBInstanceId = &instanceId
1032+
upgradeRequest.TargetDBKernelVersion = &upgradeVersion
1033+
1034+
// only support for the immediate upgrade policy
1035+
switchTag := POSTGRESQL_KERNEL_UPGRADE_IMMEDIATELY
1036+
upgradeRequest.SwitchTag = helper.IntUint64(switchTag)
1037+
1038+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
1039+
result, e := meta.(*TencentCloudClient).apiV3Conn.UsePostgresqlClient().UpgradeDBInstanceKernelVersion(upgradeRequest)
1040+
if e != nil {
1041+
tcErr := e.(*sdkErrors.TencentCloudSDKError)
1042+
1043+
if tcErr.Code == "FailedOperation.FailedOperationError" {
1044+
// upgrade version invalid.
1045+
return resource.NonRetryableError(fmt.Errorf("Upgrade kernel version failed: %v", e.Error()))
1046+
}
1047+
return retryError(e)
1048+
} else {
1049+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, upgradeRequest.GetAction(), upgradeRequest.ToJsonString(), result.ToJsonString())
1050+
}
1051+
1052+
return nil
1053+
})
1054+
if err != nil {
1055+
log.Printf("[CRITAL]%s create dcdb dbInstance failed, reason:%+v", logId, err)
1056+
return err
1057+
}
1058+
1059+
// only wait for immediately upgrade mode
1060+
1061+
conf := BuildStateChangeConf([]string{}, []string{"running", "isolated", "offline"}, 10*readRetryTimeout, time.Second, postgresqlService.PostgresqlUpgradeKernelVersionRefreshFunc(d.Id(), []string{}))
1062+
1063+
if _, e := conf.WaitForState(); e != nil {
1064+
return e
1065+
}
1066+
1067+
}
1068+
9951069
if d.HasChange("tags") {
9961070

9971071
oldValue, newValue := d.GetChange("tags")
@@ -1017,8 +1091,8 @@ func resourceTencentCloudPostgresqlInstanceUpdate(d *schema.ResourceData, meta i
10171091
paramEntrys["max_standby_streaming_delay"] = strconv.Itoa(v.(int))
10181092
}
10191093
}
1020-
if d.HasChange("db_major_vesion") || d.HasChange("db_major_version") || d.HasChange("db_kernel_version") {
1021-
return fmt.Errorf("Not support change db major version or kernel version.")
1094+
if d.HasChange("db_major_vesion") || d.HasChange("db_major_version") {
1095+
return fmt.Errorf("Not support change db major version.")
10221096
}
10231097

10241098
if d.HasChange("need_support_tde") || d.HasChange("kms_key_id") || d.HasChange("kms_region") {
@@ -1097,9 +1171,9 @@ func resourceTencentCloudPostgresqlInstanceRead(d *schema.ResourceData, meta int
10971171
_ = d.Set("vpc_id", instance.VpcId)
10981172
_ = d.Set("subnet_id", instance.SubnetId)
10991173
_ = d.Set("engine_version", instance.DBVersion)
1174+
_ = d.Set("db_kernel_version", instance.DBKernelVersion)
11001175
_ = d.Set("db_major_vesion", instance.DBMajorVersion)
11011176
_ = d.Set("db_major_version", instance.DBMajorVersion)
1102-
_ = d.Set("db_kernel_version", instance.DBKernelVersion)
11031177
_ = d.Set("name", instance.DBInstanceName)
11041178
_ = d.Set("charset", instance.DBCharset)
11051179
if rootUser != "" {

tencentcloud/resource_tc_postgresql_instance_test.go

Lines changed: 68 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func init() {
8787
})
8888
}
8989

90-
func TestAccTencentCloudPostgresqlInstanceResource(t *testing.T) {
90+
func TestAccTencentCloudPostgresqlInstanceResource_basic(t *testing.T) {
9191
t.Parallel()
9292
resource.Test(t, resource.TestCase{
9393
PreCheck: func() { testAccPreCheck(t) },
@@ -120,6 +120,7 @@ func TestAccTencentCloudPostgresqlInstanceResource(t *testing.T) {
120120
resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "backup_plan.0.max_backup_start_time", "01:10:11"),
121121
resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "backup_plan.0.backup_period.#", "2"),
122122
resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "backup_plan.0.base_backup_retention_period", "7"),
123+
resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "db_kernel_version", "v13.3_r1.1"),
123124
//resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "tags.tf", "test"),
124125
),
125126
},
@@ -167,6 +168,30 @@ func TestAccTencentCloudPostgresqlInstanceResource(t *testing.T) {
167168
//resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "tags.tf", "teest"),
168169
),
169170
},
171+
{
172+
PreConfig: func() { testAccStepPreConfigSetTempAKSK(t, ACCOUNT_TYPE_COMMON) },
173+
Config: testAccPostgresqlInstanceUpgradeKernelVersion,
174+
Check: resource.ComposeTestCheckFunc(
175+
testAccCheckPostgresqlInstanceExists(testPostgresqlInstanceResourceKey),
176+
resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "id"),
177+
resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "name", "tf_postsql_instance_update"),
178+
resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "charge_type", "POSTPAID_BY_HOUR"),
179+
resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "vpc_id"),
180+
resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "subnet_id"),
181+
resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "memory", "4"),
182+
resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "storage", "250"),
183+
resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "create_time"),
184+
resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "project_id", "0"),
185+
resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "public_access_switch", "false"),
186+
resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "root_password", "t1qaA2k1wgvfa3?ZZZ"),
187+
resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "availability_zone"),
188+
resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "backup_plan.0.min_backup_start_time", "01:10:11"),
189+
resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "backup_plan.0.max_backup_start_time", "02:10:11"),
190+
resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "backup_plan.0.backup_period.#", "3"),
191+
resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "db_kernel_version", "v13.3_r1.4"),
192+
//resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "tags.tf", "teest"),
193+
),
194+
},
170195
},
171196
})
172197
}
@@ -310,7 +335,7 @@ resource "tencentcloud_postgresql_instance" "test" {
310335
charge_type = "POSTPAID_BY_HOUR"
311336
vpc_id = local.vpc_id
312337
subnet_id = local.subnet_id
313-
engine_version = "10.4"
338+
engine_version = "13.3"
314339
root_password = "t1qaA2k1wgvfa3?ZZZ"
315340
security_groups = [local.sg_id]
316341
charset = "LATIN1"
@@ -325,6 +350,8 @@ resource "tencentcloud_postgresql_instance" "test" {
325350
backup_period = ["tuesday", "wednesday"]
326351
}
327352
353+
db_kernel_version = "v13.3_r1.1"
354+
328355
tags = {
329356
tf = "test"
330357
}
@@ -350,7 +377,7 @@ resource "tencentcloud_postgresql_instance" "test" {
350377
charge_type = "PREPAID"
351378
vpc_id = local.vpc_id
352379
subnet_id = local.subnet_id
353-
engine_version = "10.4"
380+
engine_version = "13.3"
354381
root_password = "t1qaA2k1wgvfa3?ZZZ"
355382
security_groups = [local.sg_id]
356383
charset = "LATIN1"
@@ -366,7 +393,7 @@ resource "tencentcloud_postgresql_instance" "test" {
366393
charge_type = "POSTPAID_BY_HOUR"
367394
vpc_id = local.vpc_id
368395
subnet_id = local.subnet_id
369-
engine_version = "10.4"
396+
engine_version = "13.3"
370397
root_password = "t1qaA2k1wgvfa3?ZZZ"
371398
charset = "LATIN1"
372399
project_id = 0
@@ -381,6 +408,8 @@ resource "tencentcloud_postgresql_instance" "test" {
381408
backup_period = ["monday", "thursday", "sunday"]
382409
}
383410
411+
db_kernel_version = "v13.3_r1.1"
412+
384413
tags = {
385414
tf = "teest"
386415
}
@@ -394,7 +423,37 @@ resource "tencentcloud_postgresql_instance" "test" {
394423
charge_type = "POSTPAID_BY_HOUR"
395424
vpc_id = local.vpc_id
396425
subnet_id = local.subnet_id
397-
engine_version = "10.4"
426+
engine_version = "13.3"
427+
root_password = "t1qaA2k1wgvfa3?ZZZ"
428+
charset = "LATIN1"
429+
project_id = 0
430+
public_access_switch = false
431+
security_groups = [local.sg_id]
432+
memory = 4
433+
storage = 250
434+
backup_plan {
435+
min_backup_start_time = "01:10:11"
436+
max_backup_start_time = "02:10:11"
437+
base_backup_retention_period = 5
438+
backup_period = ["monday", "thursday", "sunday"]
439+
}
440+
441+
db_kernel_version = "v13.3_r1.1"
442+
443+
tags = {
444+
tf = "teest"
445+
}
446+
}
447+
`
448+
449+
const testAccPostgresqlInstanceUpgradeKernelVersion string = testAccPostgresqlInstanceBasic + defaultVpcSubnets + `
450+
resource "tencentcloud_postgresql_instance" "test" {
451+
name = "tf_postsql_instance_update"
452+
availability_zone = data.tencentcloud_availability_zones_by_product.zone.zones[5].name
453+
charge_type = "POSTPAID_BY_HOUR"
454+
vpc_id = local.vpc_id
455+
subnet_id = local.subnet_id
456+
engine_version = "13.3"
398457
root_password = "t1qaA2k1wgvfa3?ZZZ"
399458
charset = "LATIN1"
400459
project_id = 0
@@ -409,6 +468,8 @@ resource "tencentcloud_postgresql_instance" "test" {
409468
backup_period = ["monday", "thursday", "sunday"]
410469
}
411470
471+
db_kernel_version = "v13.3_r1.4"
472+
412473
tags = {
413474
tf = "teest"
414475
}
@@ -434,7 +495,7 @@ resource "tencentcloud_postgresql_instance" "test" {
434495
charge_type = "POSTPAID_BY_HOUR"
435496
vpc_id = tencentcloud_vpc.vpc.id
436497
subnet_id = tencentcloud_subnet.subnet.id
437-
engine_version = "10.4"
498+
engine_version = "13.3"
438499
root_password = "t1qaA2k1wgvfa3?ZZZ"
439500
charset = "LATIN1"
440501
memory = 4
@@ -468,7 +529,7 @@ resource "tencentcloud_postgresql_instance" "test" {
468529
charge_type = "POSTPAID_BY_HOUR"
469530
vpc_id = tencentcloud_vpc.vpc.id
470531
subnet_id = tencentcloud_subnet.subnet.id
471-
engine_version = "10.4"
532+
engine_version = "13.3"
472533
root_password = "t1qaA2k1wgvfa3?ZZZ"
473534
charset = "LATIN1"
474535
memory = 4

tencentcloud/service_tencentcloud_postgresql.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -993,3 +993,17 @@ func (me *PostgresqlService) DeletePostgresqlParameterTemplateById(ctx context.C
993993

994994
return
995995
}
996+
997+
func (me *PostgresqlService) PostgresqlUpgradeKernelVersionRefreshFunc(instanceId string, failStates []string) resource.StateRefreshFunc {
998+
return func() (interface{}, string, error) {
999+
ctx := contextNil
1000+
1001+
instance, _, err := me.DescribePostgresqlInstanceById(ctx, instanceId)
1002+
1003+
if err != nil {
1004+
return nil, "", err
1005+
}
1006+
1007+
return instance, *instance.DBInstanceStatus, nil
1008+
}
1009+
}

website/docs/r/postgresql_instance.html.markdown

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,38 @@ resource "tencentcloud_postgresql_instance" "pg" {
143143
}
144144
```
145145

146+
upgrade kernel version
147+
148+
```hcl
149+
resource "tencentcloud_postgresql_instance" "test" {
150+
name = "tf_postsql_instance_update"
151+
availability_zone = data.tencentcloud_availability_zones_by_product.zone.zones[5].name
152+
charge_type = "POSTPAID_BY_HOUR"
153+
vpc_id = local.vpc_id
154+
subnet_id = local.subnet_id
155+
engine_version = "13.3"
156+
root_password = "*"
157+
charset = "LATIN1"
158+
project_id = 0
159+
public_access_switch = false
160+
security_groups = [local.sg_id]
161+
memory = 4
162+
storage = 250
163+
backup_plan {
164+
min_backup_start_time = "01:10:11"
165+
max_backup_start_time = "02:10:11"
166+
base_backup_retention_period = 5
167+
backup_period = ["monday", "thursday", "sunday"]
168+
}
169+
170+
db_kernel_version = "v13.3_r1.4" # eg:from v13.3_r1.1 to v13.3_r1.4
171+
172+
tags = {
173+
tf = "teest"
174+
}
175+
}
176+
```
177+
146178
## Argument Reference
147179

148180
The following arguments are supported:
@@ -157,7 +189,7 @@ The following arguments are supported:
157189
* `backup_plan` - (Optional, List) Specify DB backup plan.
158190
* `charge_type` - (Optional, String, ForceNew) Pay type of the postgresql instance. Values `POSTPAID_BY_HOUR` (Default), `PREPAID`.
159191
* `charset` - (Optional, String, ForceNew) Charset of the root account. Valid values are `UTF8`,`LATIN1`.
160-
* `db_kernel_version` - (Optional, String) PostgreSQL kernel version number. If it is specified, an instance running kernel DBKernelVersion will be created.
192+
* `db_kernel_version` - (Optional, String) PostgreSQL kernel version number. If it is specified, an instance running kernel DBKernelVersion will be created. It supports updating the minor kernel version immediately.
161193
* `db_major_version` - (Optional, String) PostgreSQL major version number. Valid values: 10, 11, 12, 13. If it is specified, an instance running the latest kernel of PostgreSQL DBMajorVersion will be created.
162194
* `db_major_vesion` - (Optional, String, **Deprecated**) `db_major_vesion` will be deprecated, use `db_major_version` instead. PostgreSQL major version number. Valid values: 10, 11, 12, 13. If it is specified, an instance running the latest kernel of PostgreSQL DBMajorVersion will be created.
163195
* `db_node_set` - (Optional, Set) Specify instance node info for disaster migration.

0 commit comments

Comments
 (0)