Skip to content

Commit 6a887ab

Browse files
authored
Merge pull request #685 from tencentcloudstack/feat/eks-resource
new resource: eks cluster
2 parents c67b12c + f6ea980 commit 6a887ab

12 files changed

+1396
-2
lines changed

examples/tencentcloud-eks/main.tf

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
resource "tencentcloud_vpc" "vpc" {
2+
name = "tf-eks-vpc"
3+
cidr_block = "10.2.0.0/16"
4+
}
5+
6+
resource "tencentcloud_subnet" "sub" {
7+
vpc_id = tencentcloud_vpc.vpc.id
8+
name = "tf-as-subnet"
9+
cidr_block = "10.2.11.0/24"
10+
availability_zone = "ap-guangzhou-3"
11+
}
12+
resource "tencentcloud_subnet" "sub2" {
13+
vpc_id = tencentcloud_vpc.vpc.id
14+
name = "tf-as-subnet"
15+
cidr_block = "10.2.10.0/24"
16+
availability_zone = "ap-guangzhou-3"
17+
}
18+
19+
resource "tencentcloud_eks_cluster" "foo" {
20+
cluster_name = "tf-test-eks"
21+
k8s_version = "1.18.4"
22+
vpc_id = tencentcloud_vpc.vpc.id
23+
subnet_ids = [
24+
tencentcloud_subnet.sub.id,
25+
tencentcloud_subnet.sub2.id,
26+
]
27+
cluster_desc = "test eks cluster created by terraform"
28+
service_subnet_id = tencentcloud_subnet.sub.id
29+
dns_servers {
30+
domain = "www.example1.com"
31+
servers = ["1.1.1.1:8080", "1.1.1.1:8081", "1.1.1.1:8082"]
32+
}
33+
enable_vpc_core_dns = true
34+
need_delete_cbs = true
35+
tags = {
36+
hello = "world"
37+
}
38+
}

examples/tencentcloud-eks/version.tf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
terraform {
2+
required_version = ">= 0.12"
3+
}
Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
/*
2+
Use this data source to query elastic kubernetes cluster resource.
3+
4+
Example Usage
5+
6+
```
7+
data "tencentcloud_eks_clusters" "foo" {
8+
cluster_id = "cls-xxxxxxxx"
9+
}
10+
```
11+
*/
12+
package tencentcloud
13+
14+
import (
15+
"context"
16+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
17+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
18+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
19+
"log"
20+
)
21+
22+
func dataSourceTencentCloudEKSClusters() *schema.Resource {
23+
return &schema.Resource{
24+
Read: dataSourceTencentCloudEKSClustersRead,
25+
26+
Schema: map[string]*schema.Schema{
27+
"cluster_id": {
28+
Type: schema.TypeString,
29+
ConflictsWith: []string{"cluster_name"},
30+
Description: "ID of the cluster. Conflict with cluster_name, can not be set at the same time.",
31+
Optional: true,
32+
},
33+
"cluster_name": {
34+
Type: schema.TypeString,
35+
ConflictsWith: []string{"cluster_id"},
36+
Optional: true,
37+
Description: "Name of the cluster. Conflict with cluster_id, can not be set at the same time.",
38+
},
39+
"result_output_file": {
40+
Type: schema.TypeString,
41+
Optional: true,
42+
Description: "Used to save results.",
43+
},
44+
"list": {
45+
Type: schema.TypeList,
46+
Computed: true,
47+
Description: "EKS cluster list.",
48+
Elem: &schema.Resource{
49+
Schema: map[string]*schema.Schema{
50+
"cluster_id": {
51+
Type: schema.TypeString,
52+
Computed: true,
53+
Description: "ID of the cluster.",
54+
},
55+
"cluster_name": {
56+
Type: schema.TypeString,
57+
Computed: true,
58+
Description: "Name of the cluster.",
59+
},
60+
"cluster_desc": {
61+
Type: schema.TypeString,
62+
Computed: true,
63+
Description: "Description of the cluster.",
64+
},
65+
"vpc_id": {
66+
Type: schema.TypeString,
67+
Computed: true,
68+
Description: "Vpc id.",
69+
},
70+
"subnet_ids": {
71+
Type: schema.TypeList,
72+
Computed: true,
73+
Description: "Subnet id list.",
74+
Elem: &schema.Schema{Type: schema.TypeString},
75+
},
76+
"k8s_version": {
77+
Type: schema.TypeString,
78+
Computed: true,
79+
Description: "EKS cluster kubernetes version.",
80+
},
81+
"status": {
82+
Type: schema.TypeString,
83+
Computed: true,
84+
Description: "EKS status.",
85+
},
86+
"created_time": {
87+
Type: schema.TypeString,
88+
Computed: true,
89+
Description: "Create time of the clusters.",
90+
},
91+
"service_subnet_id": {
92+
Type: schema.TypeString,
93+
Computed: true,
94+
Description: "Subnet id of service.",
95+
},
96+
"dns_servers": {
97+
Type: schema.TypeList,
98+
Computed: true,
99+
Description: "List of cluster custom DNS Server info.",
100+
Elem: &schema.Resource{
101+
Schema: map[string]*schema.Schema{
102+
"domain": {
103+
Type: schema.TypeString,
104+
Computed: true,
105+
Description: "DNS Server domain. Empty indicates all domain.",
106+
},
107+
"servers": {
108+
Type: schema.TypeList,
109+
Computed: true,
110+
Description: "List of DNS Server IP address.",
111+
Elem: &schema.Schema{Type: schema.TypeString},
112+
},
113+
},
114+
},
115+
},
116+
"need_delete_cbs": {
117+
Type: schema.TypeBool,
118+
Computed: true,
119+
Description: "Indicates whether to delete CBS after EKS cluster remove.",
120+
},
121+
"enable_vpc_core_dns": {
122+
Type: schema.TypeBool,
123+
Computed: true,
124+
Description: "Indicates whether to enable dns in user cluster, default value is `true`.",
125+
},
126+
"tags": {
127+
Type: schema.TypeMap,
128+
Computed: true,
129+
Description: "Tags of EKS cluster.",
130+
},
131+
},
132+
},
133+
},
134+
},
135+
}
136+
}
137+
138+
func dataSourceTencentCloudEKSClustersRead(d *schema.ResourceData, meta interface{}) error {
139+
defer logElapsed("data_source.tencentcloud_eks_clusters.read")()
140+
141+
logId := getLogId(contextNil)
142+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
143+
144+
service := EksService{
145+
client: meta.(*TencentCloudClient).apiV3Conn,
146+
}
147+
148+
var (
149+
id string
150+
name string
151+
)
152+
153+
if v, ok := d.GetOk("cluster_id"); ok {
154+
id = v.(string)
155+
}
156+
157+
if v, ok := d.GetOk("cluster_name"); ok {
158+
name = v.(string)
159+
}
160+
161+
tags := helper.GetTags(d, "tags")
162+
163+
infos, err := service.DescribeEKSClusters(ctx, id, name)
164+
if err != nil && id == "" {
165+
err = resource.Retry(readRetryTimeout, func() *resource.RetryError {
166+
infos, err = service.DescribeEKSClusters(ctx, id, name)
167+
if err != nil {
168+
return retryError(err)
169+
}
170+
return nil
171+
})
172+
}
173+
174+
if err != nil {
175+
return err
176+
}
177+
178+
list := make([]map[string]interface{}, 0, len(infos))
179+
ids := make([]string, 0, len(infos))
180+
181+
LOOP:
182+
for _, info := range infos {
183+
if len(tags) > 0 {
184+
for k, v := range tags {
185+
if info.Tags[k] != v {
186+
continue LOOP
187+
}
188+
}
189+
}
190+
var infoMap = map[string]interface{}{
191+
"cluster_id": info.ClusterId,
192+
"cluster_name": info.ClusterName,
193+
"cluster_desc": info.ClusterDesc,
194+
"vpc_id": info.VpcId,
195+
"subnet_ids": info.SubnetIds,
196+
"dns_servers": info.DnsServers,
197+
"k8s_version": info.K8SVersion,
198+
"status": info.Status,
199+
"created_time": info.CreatedTime,
200+
"service_subnet_id": info.ServiceSubnetId,
201+
"need_delete_cbs": info.NeedDeleteCbs,
202+
"enable_vpc_core_dns": info.EnableVpcCoreDNS,
203+
}
204+
205+
list = append(list, infoMap)
206+
ids = append(ids, info.ClusterId)
207+
}
208+
209+
d.SetId(helper.DataResourceIdsHash(ids))
210+
err = d.Set("list", list)
211+
if err != nil {
212+
log.Printf("[CRITAL]%s provider set tencentcloud_eks_clusters list fail, reason:%s\n ", logId, err.Error())
213+
return err
214+
}
215+
216+
output, ok := d.GetOk("result_output_file")
217+
if ok && output.(string) != "" {
218+
if err = writeToFile(output.(string), list); err != nil {
219+
return err
220+
}
221+
}
222+
return nil
223+
}
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package tencentcloud
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"github.com/hashicorp/terraform-plugin-sdk/terraform"
7+
"testing"
8+
9+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
10+
)
11+
12+
func TestAccTencentCloudEksClustersDataSource(t *testing.T) {
13+
t.Parallel()
14+
15+
resource.Test(t, resource.TestCase{
16+
PreCheck: func() { testAccPreCheck(t) },
17+
Providers: testAccProviders,
18+
CheckDestroy: testAccTencentCloudEKSClusterDestroy,
19+
Steps: []resource.TestStep{
20+
{
21+
Config: testAccEksClusterDataSource,
22+
Check: resource.ComposeTestCheckFunc(
23+
testAccCheckEksClusterExists("tencentcloud_eks_clusters.foo"),
24+
resource.TestCheckResourceAttrSet("data.tencentcloud_eks_clusters.foo", "cluster_id"),
25+
resource.TestCheckResourceAttr("data.tencentcloud_eks_clusters.foo", "cluster_name", "tf-eks-test"),
26+
resource.TestCheckResourceAttr("data.tencentcloud_eks_clusters.foo", "list.#", "1"),
27+
resource.TestCheckResourceAttrSet("data.tencentcloud_eks_clusters.foo", "list.0.cluster_id"),
28+
resource.TestCheckResourceAttr("data.tencentcloud_eks_clusters.foo", "list.0.cluster_name", "tf-eks-test"),
29+
resource.TestCheckResourceAttr("data.tencentcloud_eks_clusters.foo", "list.0.k8s_version", "1.18.4"),
30+
resource.TestCheckResourceAttrSet("data.tencentcloud_eks_clusters.foo", "list.0.vpc_id"),
31+
resource.TestCheckResourceAttr("data.tencentcloud_eks_clusters.foo", "list.0.subnet_ids.#", "1"),
32+
resource.TestCheckResourceAttr("data.tencentcloud_eks_clusters.foo", "list.0.dns_servers.#", "1"),
33+
resource.TestCheckResourceAttr("data.tencentcloud_eks_clusters.foo", "list.0.dns_servers.0.domain", "example2.org"),
34+
resource.TestCheckResourceAttr("data.tencentcloud_eks_clusters.foo", "list.0.dns_servers.0.servers.#", "2"),
35+
resource.TestCheckResourceAttr("data.tencentcloud_eks_clusters.foo", "list.0.dns_servers.0.servers.0", "10.0.0.1:80"),
36+
resource.TestCheckResourceAttr("data.tencentcloud_eks_clusters.foo", "list.0.dns_servers.0.servers.1", "10.0.0.1:81"),
37+
resource.TestCheckResourceAttr("data.tencentcloud_eks_clusters.foo", "list.0.cluster_desc", "test eks cluster created by terraform"),
38+
resource.TestCheckResourceAttrSet("data.tencentcloud_eks_clusters.foo", "list.0.service_subnet_id"),
39+
resource.TestCheckResourceAttr("data.tencentcloud_eks_clusters.foo", "list.0.enable_vpc_core_dns", "true"),
40+
resource.TestCheckResourceAttr("data.tencentcloud_eks_clusters.foo", "list.0.need_delete_cbs", "false"),
41+
resource.TestCheckResourceAttr("data.tencentcloud_eks_clusters.foo", "list.0.tags.0.test", "tf"),
42+
),
43+
},
44+
},
45+
})
46+
}
47+
48+
func testAccCheckEksClusterExists(n string) resource.TestCheckFunc {
49+
return func(s *terraform.State) error {
50+
logId := getLogId(contextNil)
51+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
52+
53+
rs, ok := s.RootModule().Resources[n]
54+
var (
55+
has bool
56+
err error
57+
)
58+
if !ok {
59+
return fmt.Errorf("EKS cluster %s is not found", n)
60+
}
61+
62+
id := rs.Primary.ID
63+
if id == "" {
64+
return fmt.Errorf("EKS cluster id is not set")
65+
}
66+
eksService := EksService{
67+
client: testAccProvider.Meta().(*TencentCloudClient).apiV3Conn,
68+
}
69+
_, has, err = eksService.DescribeEksCluster(ctx, id)
70+
if err != nil {
71+
err = resource.Retry(readRetryTimeout, func() *resource.RetryError {
72+
_, has, err = eksService.DescribeEksCluster(ctx, id)
73+
if err != nil {
74+
return retryError(err)
75+
}
76+
return nil
77+
})
78+
}
79+
if err != nil {
80+
return err
81+
}
82+
if !has {
83+
return fmt.Errorf("EKS cluster is not found")
84+
}
85+
return nil
86+
}
87+
}
88+
89+
const testAccEksClusterDataSource = defaultVpcVariable + `
90+
resource "tencentcloud_eks_cluster" "foo" {
91+
cluster_name = "tf-eks-test"
92+
k8s_version = "1.18.4"
93+
vpc_id = var.vpc_id
94+
subnet_ids = [
95+
var.subnet_id,
96+
]
97+
dns_servers {
98+
domain = "example2.org"
99+
servers = ["10.0.0.1:80", "10.0.0.1:81"]
100+
}
101+
cluster_desc = "test eks cluster created by terraform"
102+
service_subnet_id = var.subnet_id
103+
enable_vpc_core_dns = true
104+
need_delete_cbs = true
105+
tags = {
106+
test = "tf"
107+
}
108+
}
109+
110+
data "tencentcloud_eks_clusters" "foo" {
111+
cluster_id = tencentcloud_eks_cluster.foo.id
112+
}
113+
`

0 commit comments

Comments
 (0)