diff --git a/.changelog/2827.txt b/.changelog/2827.txt new file mode 100644 index 0000000000..7887962eeb --- /dev/null +++ b/.changelog/2827.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_kubernetes_node_pool: support delete `taints` and `labels` params +``` diff --git a/tencentcloud/services/tke/resource_tc_kubernetes_node_pool.go b/tencentcloud/services/tke/resource_tc_kubernetes_node_pool.go index 7812b1d5e1..8fa46a45f5 100644 --- a/tencentcloud/services/tke/resource_tc_kubernetes_node_pool.go +++ b/tencentcloud/services/tke/resource_tc_kubernetes_node_pool.go @@ -7,6 +7,8 @@ import ( "log" "strings" + tchttp "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" tkev20180525 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tke/v20180525" @@ -870,7 +872,7 @@ func resourceTencentCloudKubernetesNodePoolUpdate(d *schema.ResourceData, meta i } needChange := false - mutableArgs := []string{"name", "max_size", "min_size", "taints", "enable_auto_scale", "deletion_protection"} + mutableArgs := []string{"name", "max_size", "min_size", "enable_auto_scale", "deletion_protection"} for _, v := range mutableArgs { if d.HasChange(v) { needChange = true @@ -897,23 +899,6 @@ func resourceTencentCloudKubernetesNodePoolUpdate(d *schema.ResourceData, meta i request.MinNodesNum = helper.IntInt64(v.(int)) } - if v, ok := d.GetOk("taints"); ok { - for _, item := range v.([]interface{}) { - taintsMap := item.(map[string]interface{}) - taint := tkev20180525.Taint{} - if v, ok := taintsMap["key"]; ok { - taint.Key = helper.String(v.(string)) - } - if v, ok := taintsMap["value"]; ok { - taint.Value = helper.String(v.(string)) - } - if v, ok := taintsMap["effect"]; ok { - taint.Effect = helper.String(v.(string)) - } - request.Taints = append(request.Taints, &taint) - } - } - if v, ok := d.GetOkExists("enable_auto_scale"); ok { request.EnableAutoscale = helper.Bool(v.(bool)) } @@ -937,6 +922,75 @@ func resourceTencentCloudKubernetesNodePoolUpdate(d *schema.ResourceData, meta i } } + if d.HasChange("taints") { + _, n := d.GetChange("taints") + + // clean taints + if len(n.([]interface{})) == 0 { + body := map[string]interface{}{ + "ClusterId": clusterId, + "NodePoolId": nodePoolId, + "Taints": []interface{}{}, + } + + client := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseOmitNilClient("tke") + request := tchttp.NewCommonRequest("tke", "2018-05-25", "ModifyClusterNodePool") + err := request.SetActionParameters(body) + if err != nil { + return err + } + + response := tchttp.NewCommonResponse() + err = client.Send(request, response) + if err != nil { + fmt.Printf("update kubernetes node pool taints failed: %v \n", err) + return err + } + } else { + request := tkev20180525.NewModifyClusterNodePoolRequest() + request.ClusterId = helper.String(clusterId) + request.NodePoolId = helper.String(nodePoolId) + + if v, ok := d.GetOk("taints"); ok { + for _, item := range v.([]interface{}) { + taintsMap := item.(map[string]interface{}) + taint := tkev20180525.Taint{} + if v, ok := taintsMap["key"]; ok { + taint.Key = helper.String(v.(string)) + } + + if v, ok := taintsMap["value"]; ok { + taint.Value = helper.String(v.(string)) + } + + if v, ok := taintsMap["effect"]; ok { + taint.Effect = helper.String(v.(string)) + } + + request.Taints = append(request.Taints, &taint) + } + } + + err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTkeV20180525Client().ModifyClusterNodePoolWithContext(ctx, request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s update kubernetes node pool taints failed, reason:%+v", logId, err) + return err + } + } + + return nil + } + if err := resourceTencentCloudKubernetesNodePoolUpdateOnExit(ctx); err != nil { return err } diff --git a/tencentcloud/services/tke/resource_tc_kubernetes_node_pool_extension.go b/tencentcloud/services/tke/resource_tc_kubernetes_node_pool_extension.go index fed9b7504e..0dfcf0d679 100644 --- a/tencentcloud/services/tke/resource_tc_kubernetes_node_pool_extension.go +++ b/tencentcloud/services/tke/resource_tc_kubernetes_node_pool_extension.go @@ -6,6 +6,8 @@ import ( "log" "strings" + tchttp "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http" + as "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as/v20180419" sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors" @@ -616,48 +618,94 @@ func resourceTencentCloudKubernetesNodePoolUpdateOnStart(ctx context.Context) er "labels", "tags", ) { - request := tke.NewModifyClusterNodePoolRequest() - request.ClusterId = &clusterId - request.NodePoolId = &nodePoolId + var body map[string]interface{} + nodeOs := d.Get("node_os").(string) + nodeOsType := d.Get("node_os_type").(string) + //自定镜像不能指定节点操作系统类型 + if strings.Contains(nodeOs, "img-") { + nodeOsType = "" + } labels := GetTkeLabels(d, "labels") - tags := helper.GetTags(d, "tags") - if len(labels) > 0 { - request.Labels = labels + body = map[string]interface{}{ + "ClusterId": clusterId, + "NodePoolId": nodePoolId, + "OsName": nodeOs, + "OsCustomizeType": nodeOsType, + "Labels": labels, } + + tags := helper.GetTags(d, "tags") if len(tags) > 0 { + var tmpTags []*tke.Tag for k, v := range tags { key := k val := v - request.Tags = append(request.Tags, &tke.Tag{ + tmpTags = append(tmpTags, &tke.Tag{ Key: &key, Value: &val, }) } + + body["Tags"] = tmpTags } - nodeOs := d.Get("node_os").(string) - nodeOsType := d.Get("node_os_type").(string) - //自定镜像不能指定节点操作系统类型 - if strings.Contains(nodeOs, "img-") { - nodeOsType = "" + client := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseOmitNilClient("tke") + request := tchttp.NewCommonRequest("tke", "2018-05-25", "ModifyClusterNodePool") + err := request.SetActionParameters(body) + if err != nil { + return err } - request.OsName = &nodeOs - request.OsCustomizeType = &nodeOsType - err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { - result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTkeClient().ModifyClusterNodePool(request) - if e != nil { - return tccommon.RetryError(e) - } else { - log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) - } - return nil - }) + + response := tchttp.NewCommonResponse() + err = client.Send(request, response) if err != nil { - log.Printf("[CRITAL]%s update kubernetes node pool failed, reason:%+v", logId, err) + fmt.Printf("update kubernetes node pool taints failed: %v \n", err) return err } + //request := tke.NewModifyClusterNodePoolRequest() + //request.ClusterId = &clusterId + //request.NodePoolId = &nodePoolId + //nodeOs := d.Get("node_os").(string) + //nodeOsType := d.Get("node_os_type").(string) + ////自定镜像不能指定节点操作系统类型 + //if strings.Contains(nodeOs, "img-") { + // nodeOsType = "" + //} + //request.OsName = &nodeOs + //request.OsCustomizeType = &nodeOsType + // + //labels := GetTkeLabels(d, "labels") + //tags := helper.GetTags(d, "tags") + //if len(labels) > 0 { + // request.Labels = labels + //} + //if len(tags) > 0 { + // for k, v := range tags { + // key := k + // val := v + // request.Tags = append(request.Tags, &tke.Tag{ + // Key: &key, + // Value: &val, + // }) + // } + //} + // + //err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + // result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTkeClient().ModifyClusterNodePool(request) + // if e != nil { + // return tccommon.RetryError(e) + // } else { + // log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + // } + // return nil + //}) + //if err != nil { + // log.Printf("[CRITAL]%s update kubernetes node pool failed, reason:%+v", logId, err) + // return err + //} + // todo wait for status ok err = resource.Retry(5*tccommon.ReadRetryTimeout, func() *resource.RetryError { nodePool, _, errRet := service.DescribeNodePool(ctx, clusterId, nodePoolId) @@ -669,6 +717,7 @@ func resourceTencentCloudKubernetesNodePoolUpdateOnStart(ctx context.Context) er } return resource.RetryableError(fmt.Errorf("node pool status is %s, retry...", *nodePool.LifeState)) }) + if err != nil { return err }