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 +``` 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..660f700867 --- /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\":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}}"), + ), + }, + }, + }) +} + +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\":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}}" +} +` 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 @@