Skip to content

Commit c9e5ee2

Browse files
committed
feat: mse cluster resource add version update feature.
feat: mse cluster resource add version update feature. feat: mse cluster resource add version update feature. feat: mse cluster resource add version update feature.
1 parent 334acf9 commit c9e5ee2

File tree

3 files changed

+167
-21
lines changed

3 files changed

+167
-21
lines changed

alicloud/resource_alicloud_mse_cluster.go

Lines changed: 138 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@ import (
1313

1414
func resourceAlicloudMseCluster() *schema.Resource {
1515
return &schema.Resource{
16-
Create: resourceAlicloudMseClusterCreate,
17-
Read: resourceAlicloudMseClusterRead,
18-
Update: resourceAlicloudMseClusterUpdate,
19-
Delete: resourceAlicloudMseClusterDelete,
16+
Create: resourceAlicloudMseClusterCreate,
17+
Read: resourceAlicloudMseClusterRead,
18+
Update: resourceAlicloudMseClusterUpdate,
19+
Delete: resourceAlicloudMseClusterDelete,
20+
CustomizeDiff: customizeMseClusterDiff,
2021
Importer: &schema.ResourceImporter{
2122
State: schema.ImportStatePassthrough,
2223
},
@@ -60,6 +61,11 @@ func resourceAlicloudMseCluster() *schema.Resource {
6061
Required: true,
6162
ForceNew: true,
6263
},
64+
"version_code": {
65+
Type: schema.TypeString,
66+
Optional: true,
67+
Computed: true,
68+
},
6369
"connection_type": {
6470
Type: schema.TypeString,
6571
Optional: true,
@@ -248,6 +254,7 @@ func resourceAlicloudMseClusterRead(d *schema.ResourceData, meta interface{}) er
248254
d.Set("net_type", object["NetType"])
249255
d.Set("vswitch_id", object["VSwitchId"])
250256
d.Set("cluster_version", object["OrderClusterVersion"])
257+
d.Set("version_code", object["ClusterVersion"])
251258
d.Set("cluster_alias_name", object["ClusterAliasName"])
252259
d.Set("connection_type", object["ConnectionType"])
253260
d.Set("vpc_id", object["VpcId"])
@@ -497,6 +504,49 @@ func resourceAlicloudMseClusterUpdate(d *schema.ResourceData, meta interface{})
497504
d.SetPartial("pub_network_flow")
498505
}
499506

507+
if !d.IsNewResource() && d.HasChange("version_code") {
508+
update = true
509+
targetVersion := d.Get("version_code").(string)
510+
currentVersion := object["ClusterVersion"].(string)
511+
512+
if currentVersion != targetVersion {
513+
updateRequest := map[string]interface{}{
514+
"ClusterId": object["ClusterId"],
515+
"VersionCode": targetVersion,
516+
}
517+
518+
action := "UpdateImage"
519+
wait := incrementalWait(3*time.Second, 3*time.Second)
520+
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
521+
response, err = client.RpcPost("mse", "2019-05-31", action, nil, updateRequest, false)
522+
if err != nil {
523+
if NeedRetry(err) {
524+
wait()
525+
return resource.RetryableError(err)
526+
}
527+
return resource.NonRetryableError(err)
528+
}
529+
addDebug(action, response, updateRequest)
530+
return nil
531+
})
532+
if err != nil {
533+
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
534+
}
535+
if fmt.Sprint(response["Success"]) == "false" {
536+
return WrapErrorf(fmt.Errorf("%s failed, response: %v", action, response), DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
537+
}
538+
539+
stateConf := BuildStateConf([]string{}, []string{"SCALE_SUCCESS"}, d.Timeout(schema.TimeoutUpdate), 60*time.Second, mseService.MseClusterStateRefreshFunc(d.Id(), []string{"INIT_FAILED"}))
540+
if _, err := stateConf.WaitForState(); err != nil {
541+
return WrapErrorf(err, IdMsg, d.Id())
542+
}
543+
544+
d.SetPartial("version_code")
545+
} else {
546+
update = false
547+
}
548+
}
549+
500550
d.Partial(false)
501551
return resourceAlicloudMseClusterRead(d, meta)
502552
}
@@ -545,6 +595,90 @@ func resourceAlicloudMseClusterDelete(d *schema.ResourceData, meta interface{})
545595
return nil
546596
}
547597

598+
func customizeMseClusterDiff(d *schema.ResourceDiff, meta interface{}) error {
599+
if d.Id() == "" {
600+
log.Printf("[DEBUG] This is a new resource")
601+
return nil
602+
}
603+
604+
client := meta.(*connectivity.AliyunClient)
605+
606+
queryClusterInfoRequest := map[string]interface{}{
607+
"InstanceId": d.Id(),
608+
}
609+
response, err := client.RpcPost("mse", "2019-05-31", "QueryClusterInfo", nil, queryClusterInfoRequest, false)
610+
if err != nil {
611+
return WrapErrorf(err, DefaultErrorMsg, d.Id(), "QueryClusterInfo", AlibabaCloudSdkGoERROR)
612+
}
613+
log.Printf("[DEBUG] QueryClusterInfo response: %#v", response)
614+
data, ok := response["Data"].(map[string]interface{})
615+
if !ok {
616+
return WrapErrorf(fmt.Errorf("failed to get data from response: %v", response), DefaultErrorMsg, d.Id(), "QueryClusterInfo", AlibabaCloudSdkGoERROR)
617+
}
618+
619+
canUpdate, ok := data["CanUpdate"].(bool)
620+
if !ok {
621+
return WrapErrorf(fmt.Errorf("failed to get canUpdate: %v", data), DefaultErrorMsg, d.Id(), "QueryClusterInfo", AlibabaCloudSdkGoERROR)
622+
}
623+
if !canUpdate {
624+
oldValue, _ := d.GetChange("version_code")
625+
d.SetNew("version_code", oldValue)
626+
return nil
627+
}
628+
629+
if d.Id() != "" && (d.HasChange("version_code") || d.Get("version_code").(string) == "LATEST") {
630+
client := meta.(*connectivity.AliyunClient)
631+
mseService := MseService{client}
632+
633+
object, err := mseService.DescribeMseCluster(d.Id())
634+
if err != nil {
635+
return WrapError(err)
636+
}
637+
638+
log.Printf("[DEBUG] DescribeMseCluster response: %#v", object)
639+
640+
versionCode, ok := object["ClusterVersion"].(string)
641+
if !ok || versionCode == "" {
642+
return WrapErrorf(fmt.Errorf("failed to get current version, cluster info: %v", object), DefaultErrorMsg, d.Id(), "GetClusterInfo", AlibabaCloudSdkGoERROR)
643+
}
644+
log.Printf("[DEBUG] Current VersionCode: %s", versionCode)
645+
646+
getImageRequest := map[string]interface{}{
647+
"VersionCode": versionCode,
648+
}
649+
log.Printf("[DEBUG] GetImage request: %#v", getImageRequest)
650+
651+
response, err := client.RpcPost("mse", "2019-05-31", "GetImage", nil, getImageRequest, false)
652+
if err != nil {
653+
return WrapErrorf(err, DefaultErrorMsg, d.Id(), "GetImage", AlibabaCloudSdkGoERROR)
654+
}
655+
log.Printf("[DEBUG] GetImage response: %#v", response)
656+
657+
data, ok := response["Data"].(map[string]interface{})
658+
if !ok {
659+
return WrapErrorf(fmt.Errorf("failed to get data from response: %v", response), DefaultErrorMsg, d.Id(), "GetImage", AlibabaCloudSdkGoERROR)
660+
}
661+
662+
maxVersionCode, ok := data["MaxVersionCode"].(string)
663+
if !ok {
664+
return WrapErrorf(fmt.Errorf("failed to get maxVersionCode: %v", data), DefaultErrorMsg, d.Id(), "GetImage", AlibabaCloudSdkGoERROR)
665+
}
666+
log.Printf("[DEBUG] MaxVersionCode: %s", maxVersionCode)
667+
668+
targetVersion := d.Get("version_code").(string)
669+
if targetVersion == "LATEST" {
670+
d.SetNew("version_code", maxVersionCode)
671+
} else if d.HasChange("version_code") {
672+
if targetVersion != maxVersionCode {
673+
return WrapErrorf(fmt.Errorf("can only upgrade to the latest version %s, but got %s. "+
674+
"You can also set version_code to 'LATEST' to always upgrade to the latest version",
675+
maxVersionCode, targetVersion), DefaultErrorMsg, d.Id(), "ValidateVersion", AlibabaCloudSdkGoERROR)
676+
}
677+
}
678+
}
679+
return nil
680+
}
681+
548682
func convertMseChargeTypeToPaymentType(source interface{}) interface{} {
549683
switch source {
550684
case "POSTPAY":

alicloud/resource_alicloud_mse_cluster_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,16 @@ func TestAccAliCloudMSECluster_pro(t *testing.T) {
448448
}),
449449
),
450450
},
451+
{
452+
Config: testAccConfig(map[string]interface{}{
453+
"version_code": "LATEST",
454+
}),
455+
Check: resource.ComposeTestCheckFunc(
456+
testAccCheck(map[string]string{
457+
"version_code": CHECKSET,
458+
}),
459+
),
460+
},
451461
{
452462
ResourceName: resourceId,
453463
ImportState: true,

website/docs/r/mse_cluster.html.markdown

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ layout: "alicloud"
44
page_title: "Alicloud: alicloud_mse_cluster"
55
sidebar_current: "docs-alicloud-resource-mse-cluster"
66
description: |-
7-
Provides an Alicloud MSE Cluster resource.
7+
Provides an Alicloud MSE Cluster resource.
88
---
99

1010
# alicloud_mse_cluster
@@ -43,6 +43,7 @@ resource "alicloud_mse_cluster" "example" {
4343
cluster_specification = "MSE_SC_1_2_60_c"
4444
cluster_type = "Nacos-Ans"
4545
cluster_version = "NACOS_2_0_0"
46+
version_code = "NACOS_2_3_2_1"
4647
instance_count = 3
4748
net_type = "privatenet"
4849
pub_network_flow = "1"
@@ -69,25 +70,26 @@ The following arguments are supported:
6970
* `cluster_alias_name` - (Optional, Computed) The alias of MSE Cluster.
7071
* `cluster_specification` - (Required) The engine specification of MSE Cluster. **NOTE:** From version 1.188.0, `cluster_specification` can be modified. If you were an international user, please use the specification version ending with `_200_c`.Valid values:
7172
- Professional Edition
72-
- `MSE_SC_1_2_60_c`: 1C2G
73-
- `MSE_SC_2_4_60_c`: 2C4G
74-
- `MSE_SC_4_8_60_c`: 4C8G
75-
- `MSE_SC_8_16_60_c`: 8C16G
76-
- `MSE_SC_16_32_60_c`:16C32G
77-
- `MSE_SC_1_2_200_c`: 1C2G
78-
- `MSE_SC_2_4_200_c`: 2C4G
79-
- `MSE_SC_4_8_200_c`: 4C8G
80-
- `MSE_SC_8_16_200_c`: 8C16G
81-
- `MSE_SC_16_32_200_c`:16C32G
73+
- `MSE_SC_1_2_60_c`: 1C2G
74+
- `MSE_SC_2_4_60_c`: 2C4G
75+
- `MSE_SC_4_8_60_c`: 4C8G
76+
- `MSE_SC_8_16_60_c`: 8C16G
77+
- `MSE_SC_16_32_60_c`:16C32G
78+
- `MSE_SC_1_2_200_c`: 1C2G
79+
- `MSE_SC_2_4_200_c`: 2C4G
80+
- `MSE_SC_4_8_200_c`: 4C8G
81+
- `MSE_SC_8_16_200_c`: 8C16G
82+
- `MSE_SC_16_32_200_c`:16C32G
8283
- Developer Edition
83-
- `MSE_SC_1_2_60_c`: 1C2G
84-
- `MSE_SC_2_4_60_c`: 2C4G
85-
- `MSE_SC_1_2_200_c`: 1C2G
86-
- `MSE_SC_2_4_200_c`: 2C4G
84+
- `MSE_SC_1_2_60_c`: 1C2G
85+
- `MSE_SC_2_4_60_c`: 2C4G
86+
- `MSE_SC_1_2_200_c`: 1C2G
87+
- `MSE_SC_2_4_200_c`: 2C4G
8788
- Serverless Edition
8889
- `MSE_SC_SERVERLESS`: Available since v1.232.0
89-
* `cluster_type` - (Required, ForceNew) The type of MSE Cluster.
90+
* `cluster_type` - (Required, ForceNew) The type of MSE Cluster.
9091
* `cluster_version` - (Required, ForceNew) The version of MSE Cluster. See [details](https://www.alibabacloud.com/help/en/mse/developer-reference/api-mse-2019-05-31-createcluster)
92+
* `version_code` - (Optional) The version code of MSE Cluster. You can keep the instance version up to date by setting the value to `LATEST` (Available since v1.257.0).
9193
* `disk_type` - (Optional) The type of Disk.
9294
* `instance_count` - (Required) The count of instance. **NOTE:** From version 1.188.0, `instance_count` can be modified.
9395
* `net_type` - (Required, ForceNew) The type of network. Valid values: `privatenet` and `pubnet` and `both`(Available since v1.232.0).
@@ -99,7 +101,7 @@ The following arguments are supported:
99101
* `pub_slb_specification` - (Optional) The specification of public network SLB. Serverless Instance could ignore this parameter.
100102
* `vswitch_id` - (Optional) The id of VSwitch.
101103
* `mse_version` - (Optional, ForceNew, Computed, Available since v1.177.0) The version of MSE. Valid values: `mse_dev` or `mse_pro` or `mse_serverless`(Available since v1.232.0).
102-
* `connection_type` - (Optional, ForceNew, Available since v1.183.0) The connection type. Valid values: `slb`,`single_eni`(Available since v1.232.0). If your region is one of `ap-southeast-6、us-west-1、eu-central-1、us-east-1、ap-southeast-1`,and your cluster's mse_version is `mse_dev`,please use `single_eni`.
104+
* `connection_type` - (Optional, ForceNew, Available since v1.183.0) The connection type. Valid values: `slb`,`single_eni`(Available since v1.232.0). If your region is one of `ap-southeast-6、us-west-1、eu-central-1、us-east-1、ap-southeast-1`,and your cluster's mse_version is `mse_dev`,please use `single_eni`.
103105
* `request_pars` - (Optional, Available since v1.183.0) The extended request parameters in the JSON format.
104106
* `vpc_id` - (Optional, Available since v1.185.0) The id of the VPC.
105107

0 commit comments

Comments
 (0)