Skip to content

Commit 9118e11

Browse files
authored
feat:add tke_available_cluster_versions (#1608)
* feat:add tke_available_cluster_versions * add changelog * update cluster_version desc.
1 parent 1a49301 commit 9118e11

9 files changed

+335
-2
lines changed

.changelog/1608.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:new-data-source
2+
tencentcloud_kubernetes_available_cluster_versions
3+
```
Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
/*
2+
Use this data source to query detailed information of kubernetes available_cluster_versions
3+
4+
Example Usage
5+
6+
```hcl
7+
data "tencentcloud_kubernetes_available_cluster_versions" "query_by_id" {
8+
cluster_id = "xxx"
9+
}
10+
11+
output "versions_id"{
12+
description = "Query versions from id."
13+
value = data.tencentcloud_kubernetes_available_cluster_versions.query_by_id.versions
14+
}
15+
16+
data "tencentcloud_kubernetes_available_cluster_versions" "query_by_ids" {
17+
cluster_ids = ["xxx"]
18+
}
19+
20+
output "versions_ids"{
21+
description = "Query versions from ids."
22+
value = data.tencentcloud_kubernetes_available_cluster_versions.query_by_ids.clusters
23+
}
24+
```
25+
*/
26+
package tencentcloud
27+
28+
import (
29+
"context"
30+
31+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
32+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
33+
tke "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tke/v20180525"
34+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
35+
)
36+
37+
func dataSourceTencentCloudKubernetesAvailableClusterVersions() *schema.Resource {
38+
return &schema.Resource{
39+
Read: dataSourceTencentCloudKubernetesAvailableClusterVersionsRead,
40+
Schema: map[string]*schema.Schema{
41+
"cluster_id": {
42+
Optional: true,
43+
Type: schema.TypeString,
44+
Description: "Cluster Id.",
45+
},
46+
47+
"cluster_ids": {
48+
Optional: true,
49+
Type: schema.TypeSet,
50+
Elem: &schema.Schema{
51+
Type: schema.TypeString,
52+
},
53+
Description: "list of cluster IDs.",
54+
},
55+
56+
"versions": {
57+
Computed: true,
58+
Type: schema.TypeSet,
59+
Elem: &schema.Schema{
60+
Type: schema.TypeString,
61+
},
62+
Description: "Upgradable cluster version number. Note: This field may return null, indicating that no valid value can be obtained.",
63+
},
64+
65+
"clusters": {
66+
Computed: true,
67+
Type: schema.TypeList,
68+
Description: "cluster information. Note: This field may return null, indicating that no valid value can be obtained.",
69+
Elem: &schema.Resource{
70+
Schema: map[string]*schema.Schema{
71+
"cluster_id": {
72+
Type: schema.TypeString,
73+
Computed: true,
74+
Description: "Cluster ID.",
75+
},
76+
"versions": {
77+
Type: schema.TypeSet,
78+
Elem: &schema.Schema{
79+
Type: schema.TypeString,
80+
},
81+
Computed: true,
82+
Description: "list of cluster major version numbers, for example 1.18.4.",
83+
},
84+
},
85+
},
86+
},
87+
88+
"result_output_file": {
89+
Type: schema.TypeString,
90+
Optional: true,
91+
Description: "Used to save results.",
92+
},
93+
},
94+
}
95+
}
96+
97+
func dataSourceTencentCloudKubernetesAvailableClusterVersionsRead(d *schema.ResourceData, meta interface{}) error {
98+
defer logElapsed("data_source.tencentcloud_kubernetes_available_cluster_versions.read")()
99+
defer inconsistentCheck(d, meta)()
100+
101+
logId := getLogId(contextNil)
102+
103+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
104+
105+
var (
106+
versions []*string
107+
clusters []*tke.ClusterVersion
108+
id *string
109+
ids []string
110+
)
111+
112+
paramMap := make(map[string]interface{})
113+
if v, ok := d.GetOk("cluster_id"); ok {
114+
id = helper.String(v.(string))
115+
paramMap["cluster_id"] = id
116+
}
117+
118+
if v, ok := d.GetOk("cluster_ids"); ok {
119+
clusterIdsSet := v.(*schema.Set).List()
120+
ids = helper.InterfacesStrings(clusterIdsSet)
121+
paramMap["cluster_ids"] = helper.InterfacesStringsPoint(clusterIdsSet)
122+
}
123+
124+
service := TkeService{client: meta.(*TencentCloudClient).apiV3Conn}
125+
126+
err := resource.Retry(readRetryTimeout, func() *resource.RetryError {
127+
result, e := service.DescribeKubernetesAvailableClusterVersionsByFilter(ctx, paramMap)
128+
if e != nil {
129+
return retryError(e)
130+
}
131+
if result != nil {
132+
versions = result.Versions
133+
clusters = result.Clusters
134+
}
135+
return nil
136+
})
137+
if err != nil {
138+
return err
139+
}
140+
141+
if versions != nil {
142+
_ = d.Set("versions", versions)
143+
}
144+
145+
tmpList := make([]map[string]interface{}, 0, len(clusters))
146+
147+
if clusters != nil {
148+
for _, clusterVersion := range clusters {
149+
clusterVersionMap := map[string]interface{}{}
150+
151+
if clusterVersion.ClusterId != nil {
152+
clusterVersionMap["cluster_id"] = clusterVersion.ClusterId
153+
}
154+
155+
if clusterVersion.Versions != nil {
156+
clusterVersionMap["versions"] = clusterVersion.Versions
157+
}
158+
159+
tmpList = append(tmpList, clusterVersionMap)
160+
}
161+
162+
_ = d.Set("clusters", tmpList)
163+
}
164+
165+
var clusterIds []string
166+
if id != nil {
167+
clusterIds = []string{*id}
168+
} else {
169+
clusterIds = ids
170+
}
171+
172+
d.SetId(helper.DataResourceIdsHash(clusterIds))
173+
output, ok := d.GetOk("result_output_file")
174+
if ok && output.(string) != "" {
175+
if e := writeToFile(output.(string), tmpList); e != nil {
176+
return e
177+
}
178+
}
179+
return nil
180+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package tencentcloud
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
8+
)
9+
10+
func TestAccTencentCloudKubernetesAvailableClusterVersionsDataSource_basic(t *testing.T) {
11+
t.Parallel()
12+
resource.Test(t, resource.TestCase{
13+
PreCheck: func() {
14+
testAccPreCheck(t)
15+
},
16+
Providers: testAccProviders,
17+
Steps: []resource.TestStep{
18+
{
19+
Config: fmt.Sprintf(testAccKubernetesAvailableClusterVersionsDataSource_basic, defaultTkeClusterId),
20+
Check: resource.ComposeTestCheckFunc(
21+
testAccCheckTencentCloudDataSourceID("data.tencentcloud_kubernetes_available_cluster_versions.id"),
22+
resource.TestCheckResourceAttrSet("data.tencentcloud_kubernetes_available_cluster_versions.id", "versions.#"),
23+
resource.TestCheckResourceAttrSet("data.tencentcloud_kubernetes_available_cluster_versions.id", "clusters.#"),
24+
),
25+
},
26+
{
27+
Config: fmt.Sprintf(testAccKubernetesAvailableClusterVersionsDataSource_multiple, defaultTkeClusterId),
28+
Check: resource.ComposeTestCheckFunc(
29+
testAccCheckTencentCloudDataSourceID("data.tencentcloud_kubernetes_available_cluster_versions.ids"),
30+
resource.TestCheckResourceAttrSet("data.tencentcloud_kubernetes_available_cluster_versions.ids", "clusters.#"),
31+
resource.TestCheckResourceAttr("data.tencentcloud_kubernetes_available_cluster_versions.ids", "clusters.0.cluster_id", defaultTkeClusterId),
32+
),
33+
},
34+
},
35+
})
36+
}
37+
38+
const testAccKubernetesAvailableClusterVersionsDataSource_basic = `
39+
40+
data "tencentcloud_kubernetes_available_cluster_versions" "id" {
41+
cluster_id = "%s"
42+
}
43+
44+
output "versions"{
45+
value = data.tencentcloud_kubernetes_available_cluster_versions.id.versions
46+
}
47+
48+
`
49+
50+
const testAccKubernetesAvailableClusterVersionsDataSource_multiple = `
51+
52+
data "tencentcloud_kubernetes_available_cluster_versions" "ids" {
53+
cluster_ids = ["%s"]
54+
}
55+
56+
`

tencentcloud/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,7 @@ Tencent Kubernetes Engine(TKE)
395395
tencentcloud_kubernetes_cluster_levels
396396
tencentcloud_kubernetes_charts
397397
tencentcloud_kubernetes_cluster_common_names
398+
tencentcloud_kubernetes_available_cluster_versions
398399
399400
Resource
400401
tencentcloud_kubernetes_cluster
@@ -1145,6 +1146,7 @@ func Provider() terraform.ResourceProvider {
11451146
"tencentcloud_kubernetes_charts": dataSourceTencentCloudKubernetesCharts(),
11461147
"tencentcloud_kubernetes_cluster_levels": datasourceTencentCloudKubernetesClusterLevels(),
11471148
"tencentcloud_kubernetes_cluster_common_names": datasourceTencentCloudKubernetesClusterCommonNames(),
1149+
"tencentcloud_kubernetes_available_cluster_versions": dataSourceTencentCloudKubernetesAvailableClusterVersions(),
11481150
"tencentcloud_eks_clusters": dataSourceTencentCloudEKSClusters(),
11491151
"tencentcloud_eks_cluster_credential": datasourceTencentCloudEksClusterCredential(),
11501152
"tencentcloud_container_clusters": dataSourceTencentCloudContainerClusters(),

tencentcloud/resource_tc_kubernetes_cluster.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -933,7 +933,7 @@ func resourceTencentCloudTkeCluster() *schema.Resource {
933933
Type: schema.TypeString,
934934
Optional: true,
935935
Default: "1.10.5",
936-
Description: "Version of the cluster, Default is '1.10.5'.",
936+
Description: "Version of the cluster, Default is '1.10.5'. Use `tencentcloud_kubernetes_available_cluster_versions` to get the available versions.",
937937
},
938938
"upgrade_instances_follow_cluster": {
939939
Type: schema.TypeBool,

tencentcloud/service_tencentcloud_tke.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1039,6 +1039,42 @@ func (me *TkeService) ModifyClusterVersion(ctx context.Context, id string, clust
10391039
return
10401040
}
10411041

1042+
func (me *TkeService) DescribeKubernetesAvailableClusterVersionsByFilter(ctx context.Context, param map[string]interface{}) (availableClusterVersions *tke.DescribeAvailableClusterVersionResponseParams, errRet error) {
1043+
var (
1044+
logId = getLogId(ctx)
1045+
request = tke.NewDescribeAvailableClusterVersionRequest()
1046+
)
1047+
1048+
defer func() {
1049+
if errRet != nil {
1050+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
1051+
}
1052+
}()
1053+
1054+
for k, v := range param {
1055+
if k == "cluster_id" {
1056+
request.ClusterId = v.(*string)
1057+
}
1058+
if k == "cluster_ids" {
1059+
request.ClusterIds = v.([]*string)
1060+
}
1061+
}
1062+
1063+
ratelimit.Check(request.GetAction())
1064+
1065+
response, err := me.client.UseTkeClient().DescribeAvailableClusterVersion(request)
1066+
if err != nil {
1067+
errRet = err
1068+
return
1069+
}
1070+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
1071+
1072+
if response != nil {
1073+
availableClusterVersions = response.Response
1074+
}
1075+
return
1076+
}
1077+
10421078
func (me *TkeService) CheckClusterVersion(ctx context.Context, id string, clusterVersion string) (isOk bool, errRet error) {
10431079
logId := getLogId(ctx)
10441080
request := tke.NewDescribeAvailableClusterVersionRequest()
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
---
2+
subcategory: "Tencent Kubernetes Engine(TKE)"
3+
layout: "tencentcloud"
4+
page_title: "TencentCloud: tencentcloud_kubernetes_available_cluster_versions"
5+
sidebar_current: "docs-tencentcloud-datasource-kubernetes_available_cluster_versions"
6+
description: |-
7+
Use this data source to query detailed information of kubernetes available_cluster_versions
8+
---
9+
10+
# tencentcloud_kubernetes_available_cluster_versions
11+
12+
Use this data source to query detailed information of kubernetes available_cluster_versions
13+
14+
## Example Usage
15+
16+
```hcl
17+
data "tencentcloud_kubernetes_available_cluster_versions" "query_by_id" {
18+
cluster_id = "xxx"
19+
}
20+
21+
output "versions_id" {
22+
description = "Query versions from id."
23+
value = data.tencentcloud_kubernetes_available_cluster_versions.query_by_id.versions
24+
}
25+
26+
data "tencentcloud_kubernetes_available_cluster_versions" "query_by_ids" {
27+
cluster_ids = ["xxx"]
28+
}
29+
30+
output "versions_ids" {
31+
description = "Query versions from ids."
32+
value = data.tencentcloud_kubernetes_available_cluster_versions.query_by_ids.clusters
33+
}
34+
```
35+
36+
## Argument Reference
37+
38+
The following arguments are supported:
39+
40+
* `cluster_id` - (Optional, String) Cluster Id.
41+
* `cluster_ids` - (Optional, Set: [`String`]) list of cluster IDs.
42+
* `result_output_file` - (Optional, String) Used to save results.
43+
44+
## Attributes Reference
45+
46+
In addition to all arguments above, the following attributes are exported:
47+
48+
* `clusters` - cluster information. Note: This field may return null, indicating that no valid value can be obtained.
49+
* `cluster_id` - Cluster ID.
50+
* `versions` - list of cluster major version numbers, for example 1.18.4.
51+
* `versions` - Upgradable cluster version number. Note: This field may return null, indicating that no valid value can be obtained.
52+
53+

website/docs/r/kubernetes_cluster.html.markdown

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ The following arguments are supported:
479479
* `cluster_name` - (Optional, String) Name of the cluster.
480480
* `cluster_os_type` - (Optional, String, ForceNew) Image type of the cluster os, the available values include: 'GENERAL'. Default is 'GENERAL'.
481481
* `cluster_os` - (Optional, String, ForceNew) Operating system of the cluster, the available values include: 'centos7.6.0_x64','ubuntu18.04.1x86_64','tlinux2.4x86_64'. Default is 'tlinux2.4x86_64'.
482-
* `cluster_version` - (Optional, String) Version of the cluster, Default is '1.10.5'.
482+
* `cluster_version` - (Optional, String) Version of the cluster, Default is '1.10.5'. Use `tencentcloud_kubernetes_available_cluster_versions` to get the available versions.
483483
* `container_runtime` - (Optional, String, ForceNew) Runtime type of the cluster, the available values include: 'docker' and 'containerd'.The Kubernetes v1.24 has removed dockershim, so please use containerd in v1.24 or higher.Default is 'docker'.
484484
* `deletion_protection` - (Optional, Bool) Indicates whether cluster deletion protection is enabled. Default is false.
485485
* `docker_graph_path` - (Optional, String, ForceNew) Docker graph path. Default is `/var/lib/docker`.

website/tencentcloud.erb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2147,6 +2147,9 @@
21472147
<li>
21482148
<a href="#">Data Sources</a>
21492149
<ul class="nav nav-auto-expand">
2150+
<li>
2151+
<a href="/docs/providers/tencentcloud/d/kubernetes_available_cluster_versions.html">tencentcloud_kubernetes_available_cluster_versions</a>
2152+
</li>
21502153
<li>
21512154
<a href="/docs/providers/tencentcloud/d/kubernetes_charts.html">tencentcloud_kubernetes_charts</a>
21522155
</li>

0 commit comments

Comments
 (0)