Skip to content

Commit eba01bb

Browse files
authored
feat: tke - support datasource common_names (#1013)
1 parent 9f904b4 commit eba01bb

8 files changed

+299
-0
lines changed
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
/*
2+
Provide a datasource to query cluster CommonNames.
3+
4+
Example Usage
5+
6+
```hcl
7+
data "tencentcloud_kubernetes_cluster_common_names" "foo" {
8+
cluster_id = "cls-12345678"
9+
subaccount_uins = ["1234567890", "0987654321"]
10+
}
11+
```
12+
13+
14+
*/
15+
package tencentcloud
16+
17+
import (
18+
"context"
19+
20+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
21+
tke "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tke/v20180525"
22+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
23+
)
24+
25+
func datasourceTencentCloudKubernetesClusterCommonNames() *schema.Resource {
26+
return &schema.Resource{
27+
Read: datasourceTencentCloudKubernetesClusterCommonNamesRead,
28+
Importer: &schema.ResourceImporter{
29+
State: schema.ImportStatePassthrough,
30+
},
31+
Schema: map[string]*schema.Schema{
32+
"cluster_id": {
33+
Type: schema.TypeString,
34+
Optional: true,
35+
Description: "Cluster ID.",
36+
},
37+
"subaccount_uins": {
38+
Type: schema.TypeList,
39+
Optional: true,
40+
Description: "List of sub-account. Up to 50 sub-accounts can be passed in at a time.",
41+
Elem: &schema.Schema{Type: schema.TypeString},
42+
},
43+
"role_ids": {
44+
Type: schema.TypeList,
45+
Optional: true,
46+
Description: "List of Role ID. Up to 50 sub-accounts can be passed in at a time.",
47+
Elem: &schema.Schema{Type: schema.TypeString},
48+
},
49+
"result_output_file": {
50+
Type: schema.TypeString,
51+
Optional: true,
52+
Description: "Used for save result.",
53+
},
54+
"list": {
55+
Type: schema.TypeList,
56+
Computed: true,
57+
Description: "List of the CommonName in the certificate of the client corresponding to the sub-account UIN.",
58+
Elem: &schema.Resource{
59+
Schema: map[string]*schema.Schema{
60+
"subaccount_uin": {
61+
Type: schema.TypeString,
62+
Computed: true,
63+
Description: "User UIN.",
64+
},
65+
"common_names": {
66+
Type: schema.TypeString,
67+
Computed: true,
68+
Description: "The CommonName in the certificate of the client corresponding to the sub-account.",
69+
},
70+
},
71+
},
72+
},
73+
},
74+
}
75+
}
76+
77+
func datasourceTencentCloudKubernetesClusterCommonNamesRead(d *schema.ResourceData, meta interface{}) error {
78+
defer logElapsed("datasource.tencentcloud_kubernetes_cluster_common_names.read")()
79+
defer inconsistentCheck(d, meta)()
80+
81+
logId := getLogId(contextNil)
82+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
83+
client := meta.(*TencentCloudClient).apiV3Conn
84+
service := TkeService{client}
85+
86+
clusterId := d.Get("cluster_id").(string)
87+
request := tke.NewDescribeClusterCommonNamesRequest()
88+
request.ClusterId = &clusterId
89+
90+
if v, ok := d.GetOk("subaccount_uins"); ok {
91+
request.SubaccountUins = helper.InterfacesStringsPoint(v.([]interface{}))
92+
}
93+
if v, ok := d.GetOk("role_ids"); ok {
94+
request.RoleIds = helper.InterfacesStringsPoint(v.([]interface{}))
95+
}
96+
97+
names, err := service.DescribeClusterCommonNames(ctx, request)
98+
99+
if err != nil {
100+
return err
101+
}
102+
103+
result := make([]interface{}, 0, len(names))
104+
cns := make([]string, 0)
105+
106+
for i := range names {
107+
cn := names[i]
108+
result = append(result, map[string]interface{}{
109+
"subaccount_uin": cn.SubaccountUin,
110+
"common_names": cn.CN,
111+
})
112+
cns = append(cns, *cn.CN)
113+
}
114+
115+
if err := d.Set("list", result); err != nil {
116+
return err
117+
}
118+
119+
d.SetId(clusterId + FILED_SP + helper.DataResourceIdsHash(cns))
120+
121+
if output, ok := d.GetOk("result_output_file"); ok {
122+
return writeToFile(output.(string), result)
123+
}
124+
125+
return nil
126+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package tencentcloud
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
7+
)
8+
9+
func TestAccTencentCloudKubernetesCommonNames(t *testing.T) {
10+
t.Parallel()
11+
resource.Test(t, resource.TestCase{
12+
PreCheck: func() { testAccPreCheck(t) },
13+
Providers: testAccProviders,
14+
Steps: []resource.TestStep{
15+
{
16+
Config: testAccKubernetesCommonNamesBasic,
17+
Check: resource.ComposeAggregateTestCheckFunc(
18+
resource.TestCheckResourceAttrSet("data.tencentcloud_kubernetes_cluster_common_names.foo", "cluster_id"),
19+
resource.TestCheckResourceAttr("data.tencentcloud_kubernetes_cluster_common_names.foo", "role_ids.#", "1"),
20+
resource.TestCheckResourceAttrSet("data.tencentcloud_kubernetes_cluster_common_names.foo", "list.#"),
21+
),
22+
},
23+
},
24+
})
25+
}
26+
27+
const KeepTkeCNRoleName = `
28+
variable "keep_tke_cn" {
29+
default = "keep-for-tke-cn"
30+
}
31+
`
32+
33+
const testAccKubernetesCommonNamesBasic = KeepTkeCNRoleName + `
34+
data "tencentcloud_user_info" "info" {}
35+
36+
locals {
37+
app_id = data.tencentcloud_user_info.info.app_id
38+
uin = data.tencentcloud_user_info.info.uin
39+
}
40+
41+
data "tencentcloud_kubernetes_clusters" "cls" {
42+
cluster_name = "` + defaultTkeClusterName + `"
43+
}
44+
45+
data "tencentcloud_cam_roles" "role_basic" {
46+
name = var.keep_tke_cn
47+
}
48+
49+
data "tencentcloud_kubernetes_cluster_common_names" "foo" {
50+
cluster_id = data.tencentcloud_kubernetes_clusters.cls.list.0.cluster_id
51+
role_ids = [data.tencentcloud_cam_roles.role_basic.role_list.0.role_id]
52+
}
53+
`

tencentcloud/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,7 @@ Tencent Kubernetes Engine(TKE)
347347
tencentcloud_eks_cluster_credential
348348
tencentcloud_kubernetes_cluster_levels
349349
tencentcloud_kubernetes_charts
350+
tencentcloud_kubernetes_cluster_common_names
350351
351352
Resource
352353
tencentcloud_kubernetes_cluster
@@ -769,6 +770,7 @@ func Provider() terraform.ResourceProvider {
769770
"tencentcloud_kubernetes_clusters": dataSourceTencentCloudKubernetesClusters(),
770771
"tencentcloud_kubernetes_charts": dataSourceTencentCloudKubernetesCharts(),
771772
"tencentcloud_kubernetes_cluster_levels": datasourceTencentCloudKubernetesClusterLevels(),
773+
"tencentcloud_kubernetes_cluster_common_names": datasourceTencentCloudKubernetesClusterCommonNames(),
772774
"tencentcloud_eks_clusters": dataSourceTencentCloudEKSClusters(),
773775
"tencentcloud_eks_cluster_credential": datasourceTencentCloudEksClusterCredential(),
774776
"tencentcloud_container_clusters": dataSourceTencentCloudContainerClusters(),

tencentcloud/resource_tc_kubernetes_cluster.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -905,6 +905,11 @@ func resourceTencentCloudTkeCluster() *schema.Resource {
905905
Optional: true,
906906
Description: "Whether the cluster level auto upgraded, valid for managed cluster.",
907907
},
908+
"acquire_cluster_admin_role": {
909+
Type: schema.TypeBool,
910+
Optional: true,
911+
Description: "If set to true, it will acquire the ClusterRole tke:admin. NOTE: this arguments cannot revoke to `false` after acquired.",
912+
},
908913
"node_pool_global_config": {
909914
Type: schema.TypeList,
910915
Optional: true,
@@ -2175,6 +2180,13 @@ func resourceTencentCloudTkeClusterCreate(d *schema.ResourceData, meta interface
21752180
}
21762181
}
21772182

2183+
if v, ok := d.GetOk("acquire_cluster_admin_role"); ok && v.(bool) {
2184+
err := service.AcquireClusterAdminRole(ctx, id)
2185+
if err != nil {
2186+
return err
2187+
}
2188+
}
2189+
21782190
if _, ok := d.GetOk("auth_options"); ok {
21792191
request := tkeGetAuthOptions(d)
21802192
if err := service.ModifyClusterAuthenticationOptions(ctx, request); err != nil {
@@ -2748,6 +2760,17 @@ func resourceTencentCloudTkeClusterUpdate(d *schema.ResourceData, meta interface
27482760
d.SetPartial("deletion_protection")
27492761
}
27502762

2763+
if d.HasChange("acquire_cluster_admin_role") {
2764+
o, n := d.GetChange("acquire_cluster_admin_role")
2765+
if o.(bool) && !n.(bool) {
2766+
return fmt.Errorf("argument `acquire_cluster_admin_role` cannot set to false")
2767+
}
2768+
err := tkeService.AcquireClusterAdminRole(ctx, id)
2769+
if err != nil {
2770+
return err
2771+
}
2772+
}
2773+
27512774
d.Partial(false)
27522775
if err := resourceTencentCloudTkeClusterRead(d, meta); err != nil {
27532776
log.Printf("[WARN]%s resource.kubernetes_cluster.read after update fail , %s", logId, err.Error())

tencentcloud/service_tencentcloud_tke.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,31 @@ func (me *TkeService) DescribeCluster(ctx context.Context, id string) (
314314
return
315315
}
316316

317+
func (me *TkeService) DescribeClusterCommonNames(ctx context.Context, request *tke.DescribeClusterCommonNamesRequest) (commonNames []*tke.CommonName, errRet error) {
318+
logId := getLogId(ctx)
319+
defer func() {
320+
if errRet != nil {
321+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
322+
logId, request.GetAction(), request.ToJsonString(), errRet.Error())
323+
}
324+
}()
325+
326+
ratelimit.Check(request.GetAction())
327+
response, err := me.client.UseTkeClient().DescribeClusterCommonNames(request)
328+
329+
if err != nil {
330+
errRet = err
331+
return
332+
}
333+
334+
commonNames = response.Response.CommonNames
335+
336+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
337+
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
338+
339+
return
340+
}
341+
317342
func (me *TkeService) DescribeClusterLevelAttribute(ctx context.Context, id string) (clusterLevels []*tke.ClusterLevelAttribute, errRet error) {
318343
logId := getLogId(ctx)
319344
request := tke.NewDescribeClusterLevelAttributeRequest()
@@ -1559,3 +1584,29 @@ func (me *TkeService) ModifyDeletionProtection(ctx context.Context, id string, e
15591584

15601585
return
15611586
}
1587+
1588+
func (me *TkeService) AcquireClusterAdminRole(ctx context.Context, clusterId string) (errRet error) {
1589+
logId := getLogId(ctx)
1590+
request := tke.NewAcquireClusterAdminRoleRequest()
1591+
defer func() {
1592+
if errRet != nil {
1593+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
1594+
logId, request.GetAction(), request.ToJsonString(), errRet.Error())
1595+
}
1596+
}()
1597+
1598+
request.ClusterId = &clusterId
1599+
1600+
ratelimit.Check(request.GetAction())
1601+
response, err := me.client.UseTkeClient().AcquireClusterAdminRole(request)
1602+
1603+
if err != nil {
1604+
errRet = err
1605+
return
1606+
}
1607+
1608+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
1609+
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
1610+
1611+
return
1612+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
subcategory: "Tencent Kubernetes Engine(TKE)"
3+
layout: "tencentcloud"
4+
page_title: "TencentCloud: tencentcloud_kubernetes_cluster_common_names"
5+
sidebar_current: "docs-tencentcloud-datasource-kubernetes_cluster_common_names"
6+
description: |-
7+
Provide a datasource to query cluster CommonNames.
8+
---
9+
10+
# tencentcloud_kubernetes_cluster_common_names
11+
12+
Provide a datasource to query cluster CommonNames.
13+
14+
## Example Usage
15+
16+
```hcl
17+
data "tencentcloud_kubernetes_cluster_common_names" "foo" {
18+
cluster_id = "cls-12345678"
19+
subaccount_uins = ["1234567890", "0987654321"]
20+
}
21+
```
22+
23+
## Argument Reference
24+
25+
The following arguments are supported:
26+
27+
* `cluster_id` - (Optional) Cluster ID.
28+
* `result_output_file` - (Optional) Used for save result.
29+
* `role_ids` - (Optional) List of Role ID. Up to 50 sub-accounts can be passed in at a time.
30+
* `subaccount_uins` - (Optional) List of sub-account. Up to 50 sub-accounts can be passed in at a time.
31+
32+
## Attributes Reference
33+
34+
In addition to all arguments above, the following attributes are exported:
35+
36+
* `list` - List of the CommonName in the certificate of the client corresponding to the sub-account UIN.
37+
* `common_names` - The CommonName in the certificate of the client corresponding to the sub-account.
38+
* `subaccount_uin` - User UIN.
39+
40+

website/docs/r/kubernetes_cluster.html.markdown

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,7 @@ resource "tencentcloud_kubernetes_cluster" "managed_cluster" {
411411
The following arguments are supported:
412412

413413
* `vpc_id` - (Required, ForceNew) Vpc Id of the cluster.
414+
* `acquire_cluster_admin_role` - (Optional) If set to true, it will acquire the ClusterRole tke:admin. NOTE: this arguments cannot revoke to `false` after acquired.
414415
* `auth_options` - (Optional) Specify cluster authentication configuration. Only available for managed cluster and `cluster_version` >= 1.20.
415416
* `auto_upgrade_cluster_level` - (Optional) Whether the cluster level auto upgraded, valid for managed cluster.
416417
* `base_pod_num` - (Optional, ForceNew) The number of basic pods. valid when enable_customized_pod_cidr=true.

website/tencentcloud.erb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1463,6 +1463,9 @@
14631463
<li>
14641464
<a href="/docs/providers/tencentcloud/d/kubernetes_charts.html">tencentcloud_kubernetes_charts</a>
14651465
</li>
1466+
<li>
1467+
<a href="/docs/providers/tencentcloud/d/kubernetes_cluster_common_names.html">tencentcloud_kubernetes_cluster_common_names</a>
1468+
</li>
14661469
<li>
14671470
<a href="/docs/providers/tencentcloud/d/kubernetes_cluster_levels.html">tencentcloud_kubernetes_cluster_levels</a>
14681471
</li>

0 commit comments

Comments
 (0)