From 53e6fe803db87a14c550e5ec43c1f7785a8291a2 Mon Sep 17 00:00:00 2001 From: mikatong Date: Mon, 15 Jul 2024 19:34:25 +0800 Subject: [PATCH 1/4] add tencentcloud_kubernetes_addon_config --- tencentcloud/provider.go | 1 + tencentcloud/provider.md | 1 + .../resource_tc_kubernetes_addon_config.go | 196 ++++++++++++++++++ .../resource_tc_kubernetes_addon_config.md | 16 ++ ...esource_tc_kubernetes_addon_config_test.go | 49 +++++ 5 files changed, 263 insertions(+) create mode 100644 tencentcloud/services/tke/resource_tc_kubernetes_addon_config.go create mode 100644 tencentcloud/services/tke/resource_tc_kubernetes_addon_config.md create mode 100644 tencentcloud/services/tke/resource_tc_kubernetes_addon_config_test.go diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index fb25cf25cc..5ec76390d9 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -1978,6 +1978,7 @@ func Provider() *schema.Provider { "tencentcloud_organization_org_share_unit_member": tco.ResourceTencentCloudOrganizationOrgShareUnitMember(), "tencentcloud_organization_org_share_unit": tco.ResourceTencentCloudOrganizationOrgShareUnit(), "tencentcloud_kubernetes_addon": tke.ResourceTencentCloudKubernetesAddon(), + "tencentcloud_kubernetes_addon_config": tke.ResourceTencentCloudKubernetesAddonConfig(), "tencentcloud_kubernetes_native_node_pool": tke.ResourceTencentCloudKubernetesNativeNodePool()}, ConfigureFunc: providerConfigure, diff --git a/tencentcloud/provider.md b/tencentcloud/provider.md index 22a71d9c37..2d59920e8f 100644 --- a/tencentcloud/provider.md +++ b/tencentcloud/provider.md @@ -671,6 +671,7 @@ Tencent Kubernetes Engine(TKE) tencentcloud_kubernetes_addon_attachment tencentcloud_kubernetes_cluster_endpoint tencentcloud_kubernetes_addon + tencentcloud_kubernetes_addon_config tencentcloud_kubernetes_native_node_pool TDMQ for Pulsar(tpulsar) diff --git a/tencentcloud/services/tke/resource_tc_kubernetes_addon_config.go b/tencentcloud/services/tke/resource_tc_kubernetes_addon_config.go new file mode 100644 index 0000000000..a9c1b1da37 --- /dev/null +++ b/tencentcloud/services/tke/resource_tc_kubernetes_addon_config.go @@ -0,0 +1,196 @@ +package tke + +import ( + "context" + "encoding/base64" + "fmt" + "log" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + tke "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" +) + +func ResourceTencentCloudKubernetesAddonConfig() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudKubernetesAddonConfigCreate, + Read: resourceTencentCloudKubernetesAddonConfigRead, + Update: resourceTencentCloudKubernetesAddonConfigUpdate, + Delete: resourceTencentCloudKubernetesAddonConfigDelete, + Schema: map[string]*schema.Schema{ + "cluster_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "ID of cluster.", + }, + + "addon_name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Name of addon.", + }, + + "addon_version": { + Type: schema.TypeString, + Optional: true, + Computed: true, + Description: "Version of addon.", + }, + + "raw_values": { + Type: schema.TypeString, + Optional: true, + Computed: true, + Description: "Params of addon, base64 encoded json format.", + }, + + "phase": { + Type: schema.TypeString, + Computed: true, + Description: "Status of addon.", + }, + + "reason": { + Type: schema.TypeString, + Computed: true, + Description: "Reason of addon failed.", + }, + }, + } +} + +func resourceTencentCloudKubernetesAddonConfigCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_kubernetes_addon_config.create")() + defer tccommon.InconsistentCheck(d, meta)() + + clusterId := d.Get("cluster_id").(string) + addonName := d.Get("addon_name").(string) + + d.SetId(clusterId + tccommon.FILED_SP + addonName) + return resourceTencentCloudKubernetesAddonConfigUpdate(d, meta) +} + +func resourceTencentCloudKubernetesAddonConfigRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_kubernetes_addon_config.read")() + defer tccommon.InconsistentCheck(d, meta)() + + logId := tccommon.GetLogId(tccommon.ContextNil) + + ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + + service := TkeService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) + if len(idSplit) != 2 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + clusterId := idSplit[0] + addonName := idSplit[1] + + _ = d.Set("cluster_id", clusterId) + _ = d.Set("addon_name", addonName) + + respData, err := service.DescribeKubernetesAddonById(ctx, clusterId, addonName) + if err != nil { + return err + } + + if respData == nil { + d.SetId("") + log.Printf("[WARN]%s resource `kubernetes_addon_config` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + return nil + } + + if respData.AddonVersion != nil { + _ = d.Set("addon_version", respData.AddonVersion) + } + + if respData.RawValues != nil { + rawValues := respData.RawValues + base64DecodeValues, _ := base64.StdEncoding.DecodeString(*rawValues) + jsonValues := string(base64DecodeValues) + _ = d.Set("raw_values", jsonValues) + } + + if respData.Phase != nil { + _ = d.Set("phase", respData.Phase) + } + + if respData.Reason != nil { + _ = d.Set("reason", respData.Reason) + } + + _ = addonName + return nil +} + +func resourceTencentCloudKubernetesAddonConfigUpdate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_kubernetes_addon_config.update")() + defer tccommon.InconsistentCheck(d, meta)() + + logId := tccommon.GetLogId(tccommon.ContextNil) + + ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) + if len(idSplit) != 2 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + clusterId := idSplit[0] + addonName := idSplit[1] + + needChange := false + mutableArgs := []string{"addon_version", "raw_values"} + for _, v := range mutableArgs { + if d.HasChange(v) { + needChange = true + break + } + } + + if needChange { + request := tke.NewUpdateAddonRequest() + + request.ClusterId = &clusterId + request.AddonName = &addonName + + if v, ok := d.GetOk("addon_version"); ok { + request.AddonVersion = helper.String(v.(string)) + } + + if v, ok := d.GetOk("raw_values"); ok { + jsonValues := helper.String(v.(string)) + rawValues := base64.StdEncoding.EncodeToString([]byte(*jsonValues)) + request.RawValues = &rawValues + } + + err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTkeClient().UpdateAddonWithContext(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 addon failed, reason:%+v", logId, err) + return err + } + } + + _ = addonName + return resourceTencentCloudKubernetesAddonConfigRead(d, meta) +} + +func resourceTencentCloudKubernetesAddonConfigDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_kubernetes_addon_config.delete")() + defer tccommon.InconsistentCheck(d, meta)() + + return nil +} diff --git a/tencentcloud/services/tke/resource_tc_kubernetes_addon_config.md b/tencentcloud/services/tke/resource_tc_kubernetes_addon_config.md new file mode 100644 index 0000000000..de47bf7b8b --- /dev/null +++ b/tencentcloud/services/tke/resource_tc_kubernetes_addon_config.md @@ -0,0 +1,16 @@ +Provide a resource to configure addon that kubernetes comes with. + +Example Usage + +Update cluster-autoscaler addon + +```hcl + +resource "tencentcloud_kubernetes_addon_config" "kubernetes_addon_config" { + cluster_id = "cls-xxxxxx" + addon_name = "cluster-autoscaler" + raw_values = "{\"extraArgs\":{\"scale-down-enabled\":true,\"max-empty-bulk-delete\":11,\"scale-down-delay-after-add\":\"10mm\",\"scale-down-unneeded-time\":\"10mm\",\"scale-down-utilization-threshold\":0.005,\"ignore-daemonsets-utilization\":false,\"skip-nodes-with-local-storage\":true,\"skip-nodes-with-system-pods\":true}}" +} +` + +``` \ No newline at end of file diff --git a/tencentcloud/services/tke/resource_tc_kubernetes_addon_config_test.go b/tencentcloud/services/tke/resource_tc_kubernetes_addon_config_test.go new file mode 100644 index 0000000000..d1e2cda3fa --- /dev/null +++ b/tencentcloud/services/tke/resource_tc_kubernetes_addon_config_test.go @@ -0,0 +1,49 @@ +package tke_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" +) + +func TestAccTencentCloudKubernetesAddonConfigResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccKubernetesAddonConfig, + Check: resource.ComposeTestCheckFunc(resource.TestCheckResourceAttrSet("tencentcloud_kubernetes_addon_config.kubernetes_addon_config", "id"), + resource.TestCheckResourceAttr("tencentcloud_kubernetes_addon_config.kubernetes_addon_config", "addon_name", "cluster-autoscaler"), + resource.TestCheckResourceAttr("tencentcloud_kubernetes_addon_config.kubernetes_addon_config", "raw_values", "{\"extraArgs\":{\"scale-down-enabled\":true,\"max-empty-bulk-delete\":11,\"scale-down-delay-after-add\":\"10mm\",\"scale-down-unneeded-time\":\"10mm\",\"scale-down-utilization-threshold\":0.005,\"ignore-daemonsets-utilization\":false,\"skip-nodes-with-local-storage\":true,\"skip-nodes-with-system-pods\":true}}"), + ), + }, + { + Config: testAccKubernetesAddonConfigUpdate, + Check: resource.ComposeTestCheckFunc(resource.TestCheckResourceAttrSet("tencentcloud_kubernetes_addon_config.kubernetes_addon_config", "id"), + resource.TestCheckResourceAttr("tencentcloud_kubernetes_addon_config.kubernetes_addon_config", "addon_name", "cluster-autoscaler"), + resource.TestCheckResourceAttr("tencentcloud_kubernetes_addon_config.kubernetes_addon_config", "raw_values", "{\"extraArgs\":{\"scale-down-enabled\":true,\"max-empty-bulk-delete\":10,\"scale-down-delay-after-add\":\"10mm\",\"scale-down-unneeded-time\":\"10mm\",\"scale-down-utilization-threshold\":0.005,\"ignore-daemonsets-utilization\":false,\"skip-nodes-with-local-storage\":true,\"skip-nodes-with-system-pods\":true}}"), + ), + }, + }, + }) +} + +const testAccKubernetesAddonConfig = ` +resource "tencentcloud_kubernetes_addon_config" "kubernetes_addon_config" { + cluster_id = "cls-bzoq8t02" + addon_name = "cluster-autoscaler" + raw_values = "{\"extraArgs\":{\"scale-down-enabled\":true,\"max-empty-bulk-delete\":11,\"scale-down-delay-after-add\":\"10mm\",\"scale-down-unneeded-time\":\"10mm\",\"scale-down-utilization-threshold\":0.005,\"ignore-daemonsets-utilization\":false,\"skip-nodes-with-local-storage\":true,\"skip-nodes-with-system-pods\":true}}" +} +` +const testAccKubernetesAddonConfigUpdate = ` +resource "tencentcloud_kubernetes_addon_config" "kubernetes_addon_config" { + cluster_id = "cls-bzoq8t02" + addon_name = "cluster-autoscaler" + raw_values = "{\"extraArgs\":{\"scale-down-enabled\":true,\"max-empty-bulk-delete\":10,\"scale-down-delay-after-add\":\"10mm\",\"scale-down-unneeded-time\":\"10mm\",\"scale-down-utilization-threshold\":0.005,\"ignore-daemonsets-utilization\":false,\"skip-nodes-with-local-storage\":true,\"skip-nodes-with-system-pods\":true}}" +} +` From 48e61cbe73bccf456c957332cd9c718021137ce1 Mon Sep 17 00:00:00 2001 From: mikatong Date: Mon, 15 Jul 2024 19:35:29 +0800 Subject: [PATCH 2/4] update doc --- .../r/kubernetes_addon_config.html.markdown | 44 +++++++++++++++++++ website/tencentcloud.erb | 3 ++ 2 files changed, 47 insertions(+) create mode 100644 website/docs/r/kubernetes_addon_config.html.markdown diff --git a/website/docs/r/kubernetes_addon_config.html.markdown b/website/docs/r/kubernetes_addon_config.html.markdown new file mode 100644 index 0000000000..deea72effc --- /dev/null +++ b/website/docs/r/kubernetes_addon_config.html.markdown @@ -0,0 +1,44 @@ +--- +subcategory: "Tencent Kubernetes Engine(TKE)" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_kubernetes_addon_config" +sidebar_current: "docs-tencentcloud-resource-kubernetes_addon_config" +description: |- + Provide a resource to configure addon that kubernetes comes with. +--- + +# tencentcloud_kubernetes_addon_config + +Provide a resource to configure addon that kubernetes comes with. + +## Example Usage + +### Update cluster-autoscaler addon + +```hcl +resource "tencentcloud_kubernetes_addon_config" "kubernetes_addon_config" { + cluster_id = "cls-xxxxxx" + addon_name = "cluster-autoscaler" + raw_values = "{\"extraArgs\":{\"scale-down-enabled\":true,\"max-empty-bulk-delete\":11,\"scale-down-delay-after-add\":\"10mm\",\"scale-down-unneeded-time\":\"10mm\",\"scale-down-utilization-threshold\":0.005,\"ignore-daemonsets-utilization\":false,\"skip-nodes-with-local-storage\":true,\"skip-nodes-with-system-pods\":true}}" +} +` +``` + +## Argument Reference + +The following arguments are supported: + +* `addon_name` - (Required, String, ForceNew) Name of addon. +* `cluster_id` - (Required, String, ForceNew) ID of cluster. +* `addon_version` - (Optional, String) Version of addon. +* `raw_values` - (Optional, String) Params of addon, base64 encoded json format. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. +* `phase` - Status of addon. +* `reason` - Reason of addon failed. + + diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb index 7192f28540..8ac00516d0 100644 --- a/website/tencentcloud.erb +++ b/website/tencentcloud.erb @@ -4583,6 +4583,9 @@
  • tencentcloud_kubernetes_addon_attachment
  • +
  • + tencentcloud_kubernetes_addon_config +
  • tencentcloud_kubernetes_auth_attachment
  • From 4970ebed2f7e9c54a6fefce96960cfe1f6721d21 Mon Sep 17 00:00:00 2001 From: mikatong Date: Mon, 15 Jul 2024 19:42:00 +0800 Subject: [PATCH 3/4] add changelog --- .changelog/2725.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/2725.txt diff --git a/.changelog/2725.txt b/.changelog/2725.txt new file mode 100644 index 0000000000..45fb9f8534 --- /dev/null +++ b/.changelog/2725.txt @@ -0,0 +1,3 @@ +```release-note:new-resource +tencentcloud_kubernetes_addon_config +``` From 0d0c54308d6b11ae4762a0aabc89f9f91d051a87 Mon Sep 17 00:00:00 2001 From: mikatong Date: Tue, 16 Jul 2024 17:24:57 +0800 Subject: [PATCH 4/4] update --- .../services/tke/resource_tc_kubernetes_addon_config_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tencentcloud/services/tke/resource_tc_kubernetes_addon_config_test.go b/tencentcloud/services/tke/resource_tc_kubernetes_addon_config_test.go index d1e2cda3fa..660f700867 100644 --- a/tencentcloud/services/tke/resource_tc_kubernetes_addon_config_test.go +++ b/tencentcloud/services/tke/resource_tc_kubernetes_addon_config_test.go @@ -26,7 +26,7 @@ func TestAccTencentCloudKubernetesAddonConfigResource_basic(t *testing.T) { Config: testAccKubernetesAddonConfigUpdate, Check: resource.ComposeTestCheckFunc(resource.TestCheckResourceAttrSet("tencentcloud_kubernetes_addon_config.kubernetes_addon_config", "id"), resource.TestCheckResourceAttr("tencentcloud_kubernetes_addon_config.kubernetes_addon_config", "addon_name", "cluster-autoscaler"), - resource.TestCheckResourceAttr("tencentcloud_kubernetes_addon_config.kubernetes_addon_config", "raw_values", "{\"extraArgs\":{\"scale-down-enabled\":true,\"max-empty-bulk-delete\":10,\"scale-down-delay-after-add\":\"10mm\",\"scale-down-unneeded-time\":\"10mm\",\"scale-down-utilization-threshold\":0.005,\"ignore-daemonsets-utilization\":false,\"skip-nodes-with-local-storage\":true,\"skip-nodes-with-system-pods\":true}}"), + resource.TestCheckResourceAttr("tencentcloud_kubernetes_addon_config.kubernetes_addon_config", "raw_values", "{\"extraArgs\":{\"scale-down-enabled\":false,\"max-empty-bulk-delete\":10,\"scale-down-delay-after-add\":\"10mm\",\"scale-down-unneeded-time\":\"10mm\",\"scale-down-utilization-threshold\":0.005,\"ignore-daemonsets-utilization\":false,\"skip-nodes-with-local-storage\":true,\"skip-nodes-with-system-pods\":true}}"), ), }, }, @@ -44,6 +44,6 @@ const testAccKubernetesAddonConfigUpdate = ` resource "tencentcloud_kubernetes_addon_config" "kubernetes_addon_config" { cluster_id = "cls-bzoq8t02" addon_name = "cluster-autoscaler" - raw_values = "{\"extraArgs\":{\"scale-down-enabled\":true,\"max-empty-bulk-delete\":10,\"scale-down-delay-after-add\":\"10mm\",\"scale-down-unneeded-time\":\"10mm\",\"scale-down-utilization-threshold\":0.005,\"ignore-daemonsets-utilization\":false,\"skip-nodes-with-local-storage\":true,\"skip-nodes-with-system-pods\":true}}" + raw_values = "{\"extraArgs\":{\"scale-down-enabled\":false,\"max-empty-bulk-delete\":10,\"scale-down-delay-after-add\":\"10mm\",\"scale-down-unneeded-time\":\"10mm\",\"scale-down-utilization-threshold\":0.005,\"ignore-daemonsets-utilization\":false,\"skip-nodes-with-local-storage\":true,\"skip-nodes-with-system-pods\":true}}" } `