Skip to content

Commit c279fbc

Browse files
authored
Merge pull request #617 from rostachen/master
tencentcloud_kubernetes_cluster add upgrade_instances_follow_cluster
2 parents f059a2b + 5b26cfa commit c279fbc

File tree

3 files changed

+189
-7
lines changed

3 files changed

+189
-7
lines changed

CHANGELOG.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
## 1.56.3 (Unreleased)
1+
## 1.56.4 (Unreleased)
2+
## 1.56.3 (April 25, 2021)
3+
4+
ENHANCEMENTS:
5+
6+
* Resource: `tencentcloud_kubernetes_cluster` add `upgrade_instances_follow_cluster` for upgrade all instances of cluster.
7+
28
## 1.56.2 (April 19, 2021)
39

410
BUG FIXES:

tencentcloud/resource_tc_kubernetes_cluster.go

Lines changed: 75 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,12 @@ func resourceTencentCloudTkeCluster() *schema.Resource {
661661
Default: "1.10.5",
662662
Description: "Version of the cluster, Default is '1.10.5'.",
663663
},
664+
"upgrade_instances_follow_cluster": {
665+
Type: schema.TypeBool,
666+
Optional: true,
667+
Default: false,
668+
Description: "Indicates whether upgrade all instances when cluster_version change. Default is false.",
669+
},
664670
"cluster_ipvs": {
665671
Type: schema.TypeBool,
666672
ForceNew: true,
@@ -673,7 +679,7 @@ func resourceTencentCloudTkeCluster() *schema.Resource {
673679
ForceNew: true,
674680
Optional: true,
675681
Default: false,
676-
Description: "Indicates whether to enable cluster node auto scaler.",
682+
Description: "Indicates whether to enable cluster node auto scaler. Default is false.",
677683
},
678684
"node_pool_global_config": {
679685
Type: schema.TypeList,
@@ -979,11 +985,11 @@ func resourceTencentCloudTkeCluster() *schema.Resource {
979985
Description: "Labels of tke cluster nodes.",
980986
},
981987
"unschedulable": {
982-
Type: schema.TypeInt,
983-
Optional: true,
984-
ForceNew: true,
988+
Type: schema.TypeInt,
989+
Optional: true,
990+
ForceNew: true,
985991
DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
986-
if new == "0" && old == ""{
992+
if new == "0" && old == "" {
987993
return true
988994
} else {
989995
return old == new
@@ -1299,6 +1305,57 @@ func tkeGetNodePoolGlobalConfig(d *schema.ResourceData) *tke.ModifyClusterAsGrou
12991305
return request
13001306
}
13011307

1308+
// upgradeClusterInstances upgrade instances, upgrade type try seq:major, hot.
1309+
func upgradeClusterInstances(tkeService TkeService, ctx context.Context, id string) error {
1310+
// get all available instances for upgrade
1311+
upgradeType := "major"
1312+
instanceIds, err := tkeService.CheckInstancesUpgradeAble(ctx, id, upgradeType)
1313+
if err != nil {
1314+
return err
1315+
}
1316+
if len(instanceIds) == 0 {
1317+
upgradeType = "hot"
1318+
instanceIds, err = tkeService.CheckInstancesUpgradeAble(ctx, id, upgradeType)
1319+
if err != nil {
1320+
return err
1321+
}
1322+
}
1323+
log.Println("instancesIds for upgrade:", instanceIds)
1324+
if len(instanceIds) == 0 {
1325+
return nil
1326+
}
1327+
1328+
// upgrade instances
1329+
err = resource.Retry(writeRetryTimeout, func() *resource.RetryError {
1330+
inErr := tkeService.UpgradeClusterInstances(ctx, id, upgradeType, instanceIds)
1331+
if inErr != nil {
1332+
return retryError(inErr)
1333+
}
1334+
return nil
1335+
})
1336+
if err != nil {
1337+
return err
1338+
}
1339+
1340+
// check update status
1341+
err = resource.Retry(readRetryTimeout, func() *resource.RetryError {
1342+
done, inErr := tkeService.GetUpgradeInstanceResult(ctx, id)
1343+
if inErr != nil {
1344+
return retryError(inErr)
1345+
}
1346+
if done {
1347+
return nil
1348+
} else {
1349+
return resource.RetryableError(fmt.Errorf("cluster %s, retry...", id))
1350+
}
1351+
})
1352+
if err != nil {
1353+
return err
1354+
}
1355+
1356+
return nil
1357+
}
1358+
13021359
func resourceTencentCloudTkeClusterCreate(d *schema.ResourceData, meta interface{}) error {
13031360
defer logElapsed("resource.tencentcloud_kubernetes_cluster.create")()
13041361

@@ -2114,7 +2171,7 @@ func resourceTencentCloudTkeClusterUpdate(d *schema.ResourceData, meta interface
21142171
d.SetPartial("cluster_desc")
21152172
}
21162173

2117-
//upgrate k8s version
2174+
//upgrade k8s cluster version
21182175
if d.HasChange("cluster_version") {
21192176
newVersion := d.Get("cluster_version").(string)
21202177
isOk, err := tkeService.CheckClusterVersion(ctx, id, newVersion)
@@ -2156,6 +2213,18 @@ func resourceTencentCloudTkeClusterUpdate(d *schema.ResourceData, meta interface
21562213
if err != nil {
21572214
return err
21582215
}
2216+
2217+
// upgrade instances version
2218+
upgrade := false
2219+
if v, ok := d.GetOk("upgrade_instances_follow_cluster"); ok {
2220+
upgrade = v.(bool)
2221+
}
2222+
if upgrade {
2223+
err := upgradeClusterInstances(tkeService, ctx, id)
2224+
if err != nil {
2225+
return err
2226+
}
2227+
}
21592228
}
21602229

21612230
// update node pool global config

tencentcloud/service_tencentcloud_tke.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,61 @@ func (me *TkeService) DescribeClusterConfig(ctx context.Context, id string) (con
328328
return
329329
}
330330

331+
func (me *TkeService) GetUpgradeInstanceResult(ctx context.Context, id string) (
332+
done bool,
333+
errRet error,
334+
) {
335+
336+
logId := getLogId(ctx)
337+
request := tke.NewGetUpgradeInstanceProgressRequest()
338+
339+
defer func() {
340+
if errRet != nil {
341+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
342+
logId, request.GetAction(), request.ToJsonString(), errRet.Error())
343+
}
344+
}()
345+
346+
request.ClusterId = &id
347+
348+
ratelimit.Check(request.GetAction())
349+
response, err := me.client.UseTkeClient().GetUpgradeInstanceProgress(request)
350+
351+
if err != nil {
352+
errRet = err
353+
return
354+
}
355+
356+
lifeState := *response.Response.LifeState
357+
358+
// all instances success, lifeState=done
359+
if lifeState == "done" {
360+
return true, nil
361+
} else if lifeState != "process" {
362+
return false, fmt.Errorf("upgrade instances failed, tke response lifeState is:%s", lifeState)
363+
}
364+
365+
// parent lifeState=process, check whether all instances in processing.
366+
for _, inst := range response.Response.Instances {
367+
if *inst.LifeState == "done" || *inst.LifeState == "pending" {
368+
continue
369+
}
370+
if *inst.LifeState != "process" {
371+
return false, fmt.Errorf("upgrade instances failed, " +
372+
"instanceId:%s, lifeState is:%s", *inst.InstanceID, *inst.LifeState)
373+
}
374+
// instance lifeState=process, check whether failed or not.
375+
for _, detail := range inst.Detail {
376+
if *detail.LifeState == "failed" {
377+
return false, fmt.Errorf("upgrade instances failed, " +
378+
"instanceId:%s, detail.lifeState is:%s", *inst.InstanceID, *detail.LifeState)
379+
}
380+
}
381+
}
382+
383+
return
384+
}
385+
331386
func (me *TkeService) CreateCluster(ctx context.Context,
332387
basic ClusterBasicSetting,
333388
advanced ClusterAdvancedSettings,
@@ -915,6 +970,58 @@ func (me *TkeService) CheckClusterVersion(ctx context.Context, id string, cluste
915970
return
916971
}
917972

973+
func (me *TkeService) CheckInstancesUpgradeAble(ctx context.Context, id string, upgradeType string) (instanceIds []string, errRet error) {
974+
logId := getLogId(ctx)
975+
request := tke.NewCheckInstancesUpgradeAbleRequest()
976+
defer func() {
977+
if errRet != nil {
978+
log.Printf("[CRITAL]%s api[%s] fail, reason[%s]\n", logId, request.GetAction(), errRet.Error())
979+
}
980+
}()
981+
request.ClusterId = &id
982+
request.UpgradeType = &upgradeType
983+
ratelimit.Check(request.GetAction())
984+
985+
resp, err := me.client.UseTkeClient().CheckInstancesUpgradeAble(request)
986+
if err != nil {
987+
errRet = err
988+
return
989+
}
990+
991+
if resp == nil || resp.Response == nil || resp.Response.UpgradeAbleInstances == nil {
992+
return
993+
}
994+
for _, inst := range resp.Response.UpgradeAbleInstances {
995+
instanceIds = append(instanceIds, *inst.InstanceId)
996+
}
997+
998+
return
999+
}
1000+
1001+
func (me *TkeService) UpgradeClusterInstances(ctx context.Context, id string, upgradeType string, instanceIds []string) (errRet error) {
1002+
logId := getLogId(ctx)
1003+
request := tke.NewUpgradeClusterInstancesRequest()
1004+
defer func() {
1005+
if errRet != nil {
1006+
log.Printf("[CRITAL]%s api[%s] fail, reason[%s]\n", logId, request.GetAction(), errRet.Error())
1007+
}
1008+
}()
1009+
op := "create"
1010+
request.Operation = &op
1011+
request.ClusterId = &id
1012+
request.UpgradeType = &upgradeType
1013+
request.InstanceIds = helper.Strings(instanceIds)
1014+
ratelimit.Check(request.GetAction())
1015+
1016+
_, err := me.client.UseTkeClient().UpgradeClusterInstances(request)
1017+
if err != nil {
1018+
errRet = err
1019+
return
1020+
}
1021+
1022+
return
1023+
}
1024+
9181025
func (me *TkeService) DescribeImages(ctx context.Context) (imageIds []string, errRet error) {
9191026
logId := getLogId(ctx)
9201027
request := tke.NewDescribeImagesRequest()

0 commit comments

Comments
 (0)