Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(tke): [118573480]add tencentcloud_kubernetes_addon_config #2725

Merged
merged 4 commits into from
Jul 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/2725.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:new-resource
tencentcloud_kubernetes_addon_config
```
1 change: 1 addition & 0 deletions tencentcloud/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions tencentcloud/provider.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
196 changes: 196 additions & 0 deletions tencentcloud/services/tke/resource_tc_kubernetes_addon_config.go
Original file line number Diff line number Diff line change
@@ -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
}
16 changes: 16 additions & 0 deletions tencentcloud/services/tke/resource_tc_kubernetes_addon_config.md
Original file line number Diff line number Diff line change
@@ -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}}"
}
`

```
Original file line number Diff line number Diff line change
@@ -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}}"
}
`
44 changes: 44 additions & 0 deletions website/docs/r/kubernetes_addon_config.html.markdown
Original file line number Diff line number Diff line change
@@ -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.


3 changes: 3 additions & 0 deletions website/tencentcloud.erb
Original file line number Diff line number Diff line change
Expand Up @@ -4583,6 +4583,9 @@
<li>
<a href="/docs/providers/tencentcloud/r/kubernetes_addon_attachment.html">tencentcloud_kubernetes_addon_attachment</a>
</li>
<li>
<a href="/docs/providers/tencentcloud/r/kubernetes_addon_config.html">tencentcloud_kubernetes_addon_config</a>
</li>
<li>
<a href="/docs/providers/tencentcloud/r/kubernetes_auth_attachment.html">tencentcloud_kubernetes_auth_attachment</a>
</li>
Expand Down
Loading