From 6b0fde747ecd7441be75e1dca435ec8fa921ba00 Mon Sep 17 00:00:00 2001 From: SevenEarth <391613297@qq.com> Date: Thu, 24 Oct 2024 10:10:18 +0800 Subject: [PATCH 1/3] add new auth for tencentcloud cos backend --- .../resource_tc_kubernetes_scale_worker.go | 15 +--- ...ce_tc_kubernetes_scale_worker_extension.go | 73 ++++++++++++++++++- .../services/tke/service_tencentcloud_tke.go | 8 +- .../r/kubernetes_scale_worker.html.markdown | 2 +- 4 files changed, 77 insertions(+), 21 deletions(-) diff --git a/tencentcloud/services/tke/resource_tc_kubernetes_scale_worker.go b/tencentcloud/services/tke/resource_tc_kubernetes_scale_worker.go index 91af5c58a2..6e1a4353b7 100644 --- a/tencentcloud/services/tke/resource_tc_kubernetes_scale_worker.go +++ b/tencentcloud/services/tke/resource_tc_kubernetes_scale_worker.go @@ -4,15 +4,13 @@ package tke import ( "context" "fmt" - "log" - "strings" - "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" - tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" + "log" + "strings" ) func ResourceTencentCloudKubernetesScaleWorker() *schema.Resource { @@ -509,7 +507,6 @@ func ResourceTencentCloudKubernetesScaleWorker() *schema.Resource { "create_result_output_file": { Type: schema.TypeString, Optional: true, - ForceNew: true, Description: "Used to save results of CVMs creation error messages.", }, }, @@ -561,16 +558,10 @@ func resourceTencentCloudKubernetesScaleWorkerRead(d *schema.ResourceData, meta log.Printf("[WARN]%s resource `kubernetes_scale_worker` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) return nil } - respData1, err := service.DescribeKubernetesScaleWorkerById1(ctx) - if err != nil { + if err := resourceTencentCloudKubernetesScaleWorkerReadPostHandleResponse0(ctx, respData); err != nil { return err } - if respData1 == nil { - d.SetId("") - log.Printf("[WARN]%s resource `kubernetes_scale_worker` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) - return nil - } _ = instanceIdSet return nil } diff --git a/tencentcloud/services/tke/resource_tc_kubernetes_scale_worker_extension.go b/tencentcloud/services/tke/resource_tc_kubernetes_scale_worker_extension.go index b455e13887..56afa511dc 100644 --- a/tencentcloud/services/tke/resource_tc_kubernetes_scale_worker_extension.go +++ b/tencentcloud/services/tke/resource_tc_kubernetes_scale_worker_extension.go @@ -678,9 +678,78 @@ func resourceTencentCloudKubernetesScaleWorkerReadPostFillRequest1(ctx context.C return nil } -func resourceTencentCloudKubernetesScaleWorkerReadPreRequest1(ctx context.Context, req *cvm.DescribeInstancesRequest) error { +func resourceTencentCloudKubernetesScaleWorkerReadPreRequest1(ctx context.Context, req *cvm.DescribeInstancesRequest) (resp *cvm.DescribeInstancesResponse, err error) { + logId := tccommon.GetLogId(ctx) + meta := tccommon.ProviderMetaFromContext(ctx) ctxData := tccommon.DataFromContext(ctx) instanceIds := ctxData.Get("instanceIds").([]*string) - req.InstanceIds = instanceIds + req.Limit = helper.Int64(0) + req.Offset = helper.Int64(100) + if len(instanceIds) <= 100 { + req.InstanceIds = instanceIds + resp, err = meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCvmV20170312Client().DescribeInstances(req) + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, req.GetAction(), req.ToJsonString(), resp.ToJsonString()) + if err != nil { + return nil, err + } + } else { + var ( + tmpTotalCount int64 + tmpInstanceSet []*cvm.Instance + ) + subSlices := spliteInstanceIds(instanceIds, 100) + for _, subsubSlice := range subSlices { + req.InstanceIds = subsubSlice + tmpResp, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCvmV20170312Client().DescribeInstances(req) + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, req.GetAction(), req.ToJsonString(), tmpResp.ToJsonString()) + if err != nil { + return nil, err + } + + if tmpResp.Response.TotalCount != nil { + tmpTotalCount += *tmpResp.Response.TotalCount + } + + if len(tmpResp.Response.InstanceSet) != 0 { + tmpInstanceSet = append(tmpInstanceSet, tmpResp.Response.InstanceSet...) + } + } + + resp.Response.TotalCount = &tmpTotalCount + resp.Response.InstanceSet = tmpInstanceSet + } + + return resp, nil +} + +func resourceTencentCloudKubernetesScaleWorkerReadPostHandleResponse0(ctx context.Context, resp *tke.DescribeClustersResponseParams) error { + logId := tccommon.GetLogId(ctx) + d := tccommon.ResourceDataFromContext(ctx) + meta := tccommon.ProviderMetaFromContext(ctx) + service := TkeService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + respData1, err := service.DescribeKubernetesScaleWorkerById1(ctx) + if err != nil { + return err + } + + if respData1 == nil { + d.SetId("") + log.Printf("[WARN]%s resource `kubernetes_scale_worker` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + return nil + } + return nil } + +func spliteInstanceIds(slice []*string, size int) [][]*string { + var result [][]*string + for i := 0; i < len(slice); i += size { + end := i + size + if end > len(slice) { + end = len(slice) + } + result = append(result, slice[i:end]) + } + + return result +} diff --git a/tencentcloud/services/tke/service_tencentcloud_tke.go b/tencentcloud/services/tke/service_tencentcloud_tke.go index 3ec621af82..5482477979 100644 --- a/tencentcloud/services/tke/service_tencentcloud_tke.go +++ b/tencentcloud/services/tke/service_tencentcloud_tke.go @@ -3438,15 +3438,11 @@ func (me *TkeService) DescribeKubernetesScaleWorkerById1(ctx context.Context) (r ratelimit.Check(request.GetAction()) - if err := resourceTencentCloudKubernetesScaleWorkerReadPreRequest1(ctx, request); err != nil { + response, err := resourceTencentCloudKubernetesScaleWorkerReadPreRequest1(ctx, request) + if err != nil { return nil, err } - response, err := me.client.UseCvmV20170312Client().DescribeInstances(request) - if err != nil { - errRet = err - return - } log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) if err := resourceTencentCloudKubernetesScaleWorkerReadPostRequest1(ctx, request, response); err != nil { diff --git a/website/docs/r/kubernetes_scale_worker.html.markdown b/website/docs/r/kubernetes_scale_worker.html.markdown index 57586348b8..6096f2514c 100644 --- a/website/docs/r/kubernetes_scale_worker.html.markdown +++ b/website/docs/r/kubernetes_scale_worker.html.markdown @@ -124,7 +124,7 @@ The following arguments are supported: * `cluster_id` - (Required, String, ForceNew) ID of the cluster. * `worker_config` - (Required, List, ForceNew) Deploy the machine configuration information of the 'WORK' service, and create <=20 units for common users. -* `create_result_output_file` - (Optional, String, ForceNew) Used to save results of CVMs creation error messages. +* `create_result_output_file` - (Optional, String) Used to save results of CVMs creation error messages. * `data_disk` - (Optional, List, ForceNew) Configurations of tke data disk. * `desired_pod_num` - (Optional, Int, ForceNew) Indicate to set desired pod number in current node. Valid when the cluster enable customized pod cidr. * `docker_graph_path` - (Optional, String, ForceNew) Docker graph path. Default is `/var/lib/docker`. From 5b79215bec70eb4d07e189e92be4b1234600b3ef Mon Sep 17 00:00:00 2001 From: SevenEarth <391613297@qq.com> Date: Thu, 24 Oct 2024 10:12:40 +0800 Subject: [PATCH 2/3] fix scale worker read --- .changelog/2908.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/2908.txt diff --git a/.changelog/2908.txt b/.changelog/2908.txt new file mode 100644 index 0000000000..c3cca4c419 --- /dev/null +++ b/.changelog/2908.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_kubernetes_scale_worker: Update read function +``` \ No newline at end of file From 630251c597898e00b26b3b048992d18b6d65f50b Mon Sep 17 00:00:00 2001 From: SevenEarth <391613297@qq.com> Date: Thu, 24 Oct 2024 19:52:41 +0800 Subject: [PATCH 3/3] add --- .../resource_tc_kubernetes_scale_worker.go | 1 + ...ce_tc_kubernetes_scale_worker_extension.go | 86 +++++++++++++------ .../r/kubernetes_scale_worker.html.markdown | 2 +- 3 files changed, 63 insertions(+), 26 deletions(-) diff --git a/tencentcloud/services/tke/resource_tc_kubernetes_scale_worker.go b/tencentcloud/services/tke/resource_tc_kubernetes_scale_worker.go index 6e1a4353b7..f7c4069d99 100644 --- a/tencentcloud/services/tke/resource_tc_kubernetes_scale_worker.go +++ b/tencentcloud/services/tke/resource_tc_kubernetes_scale_worker.go @@ -507,6 +507,7 @@ func ResourceTencentCloudKubernetesScaleWorker() *schema.Resource { "create_result_output_file": { Type: schema.TypeString, Optional: true, + ForceNew: true, Description: "Used to save results of CVMs creation error messages.", }, }, diff --git a/tencentcloud/services/tke/resource_tc_kubernetes_scale_worker_extension.go b/tencentcloud/services/tke/resource_tc_kubernetes_scale_worker_extension.go index 56afa511dc..2bb937bfed 100644 --- a/tencentcloud/services/tke/resource_tc_kubernetes_scale_worker_extension.go +++ b/tencentcloud/services/tke/resource_tc_kubernetes_scale_worker_extension.go @@ -573,28 +573,57 @@ func resourceTencentCloudKubernetesScaleWorkerDeleteOnExit(ctx context.Context) return nil } - err = service.DeleteClusterInstances(ctx, clusterId, needDeletes) - if err != nil { - err = resource.Retry(3*tccommon.WriteRetryTimeout, func() *resource.RetryError { - err = service.DeleteClusterInstances(ctx, clusterId, needDeletes) + if len(needDeletes) <= 100 { + err = service.DeleteClusterInstances(ctx, clusterId, needDeletes) + if err != nil { + err = resource.Retry(3*tccommon.WriteRetryTimeout, func() *resource.RetryError { + err = service.DeleteClusterInstances(ctx, clusterId, needDeletes) - if e, ok := err.(*errors.TencentCloudSDKError); ok { - if e.GetCode() == "InternalError.ClusterNotFound" { - return nil - } + if e, ok := err.(*errors.TencentCloudSDKError); ok { + if e.GetCode() == "InternalError.ClusterNotFound" { + return nil + } - if e.GetCode() == "InternalError.Param" && - strings.Contains(e.GetMessage(), `PARAM_ERROR[some instances []is not in right state`) { - return nil + if e.GetCode() == "InternalError.Param" && + strings.Contains(e.GetMessage(), `PARAM_ERROR[some instances []is not in right state`) { + return nil + } } - } + if err != nil { + return tccommon.RetryError(err, tccommon.InternalError) + } + return nil + }) + } + } else { + for _, subsubSlice := range spliteInstanceIds(helper.Strings(needDeletes), 100) { + tmpDeletes := helper.PStrings(subsubSlice) + err = service.DeleteClusterInstances(ctx, clusterId, tmpDeletes) if err != nil { - return tccommon.RetryError(err, tccommon.InternalError) + err = resource.Retry(3*tccommon.WriteRetryTimeout, func() *resource.RetryError { + err = service.DeleteClusterInstances(ctx, clusterId, tmpDeletes) + + if e, ok := err.(*errors.TencentCloudSDKError); ok { + if e.GetCode() == "InternalError.ClusterNotFound" { + return nil + } + + if e.GetCode() == "InternalError.Param" && + strings.Contains(e.GetMessage(), `PARAM_ERROR[some instances []is not in right state`) { + return nil + } + } + + if err != nil { + return tccommon.RetryError(err, tccommon.InternalError) + } + return nil + }) } - return nil - }) + } } + return nil } @@ -683,8 +712,8 @@ func resourceTencentCloudKubernetesScaleWorkerReadPreRequest1(ctx context.Contex meta := tccommon.ProviderMetaFromContext(ctx) ctxData := tccommon.DataFromContext(ctx) instanceIds := ctxData.Get("instanceIds").([]*string) - req.Limit = helper.Int64(0) - req.Offset = helper.Int64(100) + req.Limit = helper.Int64(100) + req.Offset = helper.Int64(0) if len(instanceIds) <= 100 { req.InstanceIds = instanceIds resp, err = meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCvmV20170312Client().DescribeInstances(req) @@ -697,26 +726,32 @@ func resourceTencentCloudKubernetesScaleWorkerReadPreRequest1(ctx context.Contex tmpTotalCount int64 tmpInstanceSet []*cvm.Instance ) + tmpResp := new(cvm.DescribeInstancesResponse) subSlices := spliteInstanceIds(instanceIds, 100) for _, subsubSlice := range subSlices { req.InstanceIds = subsubSlice - tmpResp, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCvmV20170312Client().DescribeInstances(req) - log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, req.GetAction(), req.ToJsonString(), tmpResp.ToJsonString()) + response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCvmV20170312Client().DescribeInstances(req) + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, req.GetAction(), req.ToJsonString(), response.ToJsonString()) if err != nil { return nil, err } - if tmpResp.Response.TotalCount != nil { - tmpTotalCount += *tmpResp.Response.TotalCount + if response.Response.TotalCount != nil { + tmpTotalCount += *response.Response.TotalCount } - if len(tmpResp.Response.InstanceSet) != 0 { - tmpInstanceSet = append(tmpInstanceSet, tmpResp.Response.InstanceSet...) + if len(response.Response.InstanceSet) != 0 { + tmpInstanceSet = append(tmpInstanceSet, response.Response.InstanceSet...) } + } - resp.Response.TotalCount = &tmpTotalCount - resp.Response.InstanceSet = tmpInstanceSet + tmpResp.Response = &cvm.DescribeInstancesResponseParams{ + TotalCount: &tmpTotalCount, + InstanceSet: tmpInstanceSet, + } + + resp = tmpResp } return resp, nil @@ -748,6 +783,7 @@ func spliteInstanceIds(slice []*string, size int) [][]*string { if end > len(slice) { end = len(slice) } + result = append(result, slice[i:end]) } diff --git a/website/docs/r/kubernetes_scale_worker.html.markdown b/website/docs/r/kubernetes_scale_worker.html.markdown index 6096f2514c..57586348b8 100644 --- a/website/docs/r/kubernetes_scale_worker.html.markdown +++ b/website/docs/r/kubernetes_scale_worker.html.markdown @@ -124,7 +124,7 @@ The following arguments are supported: * `cluster_id` - (Required, String, ForceNew) ID of the cluster. * `worker_config` - (Required, List, ForceNew) Deploy the machine configuration information of the 'WORK' service, and create <=20 units for common users. -* `create_result_output_file` - (Optional, String) Used to save results of CVMs creation error messages. +* `create_result_output_file` - (Optional, String, ForceNew) Used to save results of CVMs creation error messages. * `data_disk` - (Optional, List, ForceNew) Configurations of tke data disk. * `desired_pod_num` - (Optional, Int, ForceNew) Indicate to set desired pod number in current node. Valid when the cluster enable customized pod cidr. * `docker_graph_path` - (Optional, String, ForceNew) Docker graph path. Default is `/var/lib/docker`.