Skip to content

Commit 0129231

Browse files
tongyimingmikatong
andauthored
Feat/support emr (#738)
* backup * [feat]create emr * test create emr over * [feat] support emr * update emr doc * [fix] review update * [fix] review update * [feat] support emr update Co-authored-by: mikatong <[email protected]>
1 parent 813755d commit 0129231

19 files changed

+5531
-4
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ require (
3434
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.199
3535
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.199
3636
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dc v1.0.199
37+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/emr v1.0.287
3738
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.294
3839
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/es v1.0.199
3940
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap v1.0.199

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.199 h1:CzZEt6
481481
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.199/go.mod h1:pz4s3nOhoB9cY0+uWzifuwr7lfh/Gvi1rv0ADxpPzD4=
482482
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dc v1.0.199 h1:7ShREKvI8ik2YNtLF42JR9x2YEeZS/gZvhIRfpsI8T0=
483483
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dc v1.0.199/go.mod h1:5WGSrlIZJOhwIqPjjafb6vzrPEZieSHPhPMjjGPXOSU=
484+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/emr v1.0.287 h1:+9COBXAbQmL7aJ39Q/mF50Ykxq4m5kq/y6vbO+u3zgI=
485+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/emr v1.0.287/go.mod h1:xRvd0xsyCoviCiMRfJMh5lODPnLx+bnTfENNx6GHzFA=
484486
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.286 h1:daMss6AZ7UrzvfzRFtBp+0YdhSlZljlzRYE3XshU+MI=
485487
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.286/go.mod h1:CuOaLxOQr477GhMWAQPYQFUJrsZbW+ZqkAgP2uHDZXg=
486488
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.294 h1:VKP8TRlMSDUIJ32GuFKr4a0Fv/oi4LksRVOfJoK9CVc=

tencentcloud/connectivity/client.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import (
3232
dayu "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu/v20180709"
3333
dc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dc/v20180410"
3434
dnspod "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod/v20210323"
35+
emr "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/emr/v20190103"
3536
es "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/es/v20180416"
3637
gaap "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap/v20180529"
3738
kms "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms/v20190118"
@@ -98,6 +99,7 @@ type TencentCloudClient struct {
9899
kmsConn *kms.Client
99100
ssmConn *ssm.Client
100101
apiConn *api.Client
102+
emrConn *emr.Client
101103
clsConn *cls.Client
102104
dnsPodConn *dnspod.Client
103105
}
@@ -626,6 +628,18 @@ func (me *TencentCloudClient) UseApiClient() *api.Client {
626628
return me.apiConn
627629
}
628630

631+
// UseEmrClient return EMR client for service
632+
func (me *TencentCloudClient) UseEmrClient() *emr.Client {
633+
if me.emrConn != nil {
634+
return me.emrConn
635+
}
636+
cpf := me.NewClientProfile(300)
637+
me.emrConn, _ = emr.NewClient(me.Credential, me.Region, cpf)
638+
me.emrConn.WithHttpTransport(&LogRoundTripper{})
639+
640+
return me.emrConn
641+
}
642+
629643
// UseClsClient return CLS client for service
630644
func (me *TencentCloudClient) UseClsClient() *cls.Client {
631645
if me.clsConn != nil {

tencentcloud/data_source_tc_emr.go

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
/*
2+
Provides an available EMR for the user.
3+
4+
The EMR data source fetch proper EMR from user's EMR pool.
5+
6+
Example Usage
7+
8+
```hcl
9+
data "tencentcloud_emr" "my_emr" {
10+
filter {
11+
name = "address-status"
12+
values = ["UNBIND"]
13+
}
14+
}
15+
```
16+
*/
17+
package tencentcloud
18+
19+
import (
20+
"context"
21+
"log"
22+
23+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
24+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
25+
emr "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/emr/v20190103"
26+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
27+
)
28+
29+
func dataSourceTencentCloudEmr() *schema.Resource {
30+
return &schema.Resource{
31+
Read: dataSourceTencentCloudEmrRead,
32+
33+
Schema: map[string]*schema.Schema{
34+
"display_strategy": {
35+
Type: schema.TypeString,
36+
Required: true,
37+
Description: "Display strategy(e.g.:clusterList, monitorManage).",
38+
},
39+
"prefix_instance_ids": {
40+
Type: schema.TypeList,
41+
Optional: true,
42+
Elem: &schema.Schema{Type: schema.TypeString},
43+
Description: "fetch all instances with same prefix(e.g.:emr-xxxxxx).",
44+
},
45+
"project_id": {
46+
Type: schema.TypeInt,
47+
Optional: true,
48+
Description: "Fetch all instances which owner same project. Default 0 meaning use default project id.",
49+
},
50+
"result_output_file": {
51+
Type: schema.TypeString,
52+
Optional: true,
53+
Description: "Used to save results.",
54+
},
55+
"clusters": {
56+
Type: schema.TypeList,
57+
Computed: true,
58+
Description: "A list of clusters will be exported and its every element contains the following attributes:",
59+
Elem: &schema.Resource{
60+
Schema: map[string]*schema.Schema{
61+
"id": {
62+
Type: schema.TypeInt,
63+
Computed: true,
64+
Description: "Id of instance.",
65+
},
66+
"cluster_id": {
67+
Type: schema.TypeString,
68+
Computed: true,
69+
Description: "Cluster id of instance.",
70+
},
71+
"ftitle": {
72+
Type: schema.TypeString,
73+
Computed: true,
74+
Description: "Title of instance.",
75+
},
76+
"cluster_name": {
77+
Type: schema.TypeString,
78+
Computed: true,
79+
Description: "Cluster name of instance.",
80+
},
81+
"region_id": {
82+
Type: schema.TypeInt,
83+
Computed: true,
84+
Description: "Region id of instance.",
85+
},
86+
"zone_id": {
87+
Type: schema.TypeInt,
88+
Computed: true,
89+
Description: "Zone id of instance.",
90+
},
91+
"zone": {
92+
Type: schema.TypeString,
93+
Computed: true,
94+
Description: "Zone of instance.",
95+
},
96+
"master_ip": {
97+
Type: schema.TypeString,
98+
Computed: true,
99+
Description: "Master ip of instance.",
100+
},
101+
"project_id": {
102+
Type: schema.TypeInt,
103+
Computed: true,
104+
Description: "Project id of instance.",
105+
},
106+
"charge_type": {
107+
Type: schema.TypeInt,
108+
Computed: true,
109+
Description: "Charge type of instance.",
110+
},
111+
"status": {
112+
Type: schema.TypeInt,
113+
Computed: true,
114+
Description: "Status of instance.",
115+
},
116+
"add_time": {
117+
Type: schema.TypeString,
118+
Computed: true,
119+
Description: "Add time of instance.",
120+
},
121+
},
122+
},
123+
},
124+
},
125+
}
126+
}
127+
128+
func dataSourceTencentCloudEmrRead(d *schema.ResourceData, meta interface{}) error {
129+
defer logElapsed("data_source.tencentcloud_emr.read")()
130+
131+
logId := getLogId(contextNil)
132+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
133+
134+
emrServer := EMRService{
135+
client: meta.(*TencentCloudClient).apiV3Conn,
136+
}
137+
138+
filters := map[string]interface{}{}
139+
if v, ok := d.GetOk("display_strategy"); ok {
140+
filters["display_strategy"] = v.(string)
141+
}
142+
if v, ok := d.GetOk("prefix_instance_ids"); ok {
143+
filters["prefix_instance_ids"] = v.(string)
144+
}
145+
if v, ok := d.GetOk("project_id"); ok {
146+
filters["project_id"] = v.(int64)
147+
}
148+
var clusters []*emr.ClusterInstancesInfo
149+
var errRet error
150+
err := resource.Retry(readRetryTimeout, func() *resource.RetryError {
151+
clusters, errRet = emrServer.DescribeInstances(ctx, filters)
152+
if errRet != nil {
153+
return retryError(errRet, InternalError)
154+
}
155+
return nil
156+
})
157+
if err != nil {
158+
return err
159+
}
160+
161+
emr_instances := make([]map[string]interface{}, 0, len(clusters))
162+
ids := make([]string, 0, len(clusters))
163+
for _, cluster := range clusters {
164+
mapping := map[string]interface{}{
165+
"cluster_id": cluster.ClusterId,
166+
"cluster_name": cluster.ClusterName,
167+
"ftitle": cluster.Ftitle,
168+
"status": cluster.Status,
169+
"region_id": cluster.RegionId,
170+
"zone_id": cluster.ZoneId,
171+
"zone": cluster.Zone,
172+
"charge_type": cluster.ChargeType,
173+
"master_ip": cluster.MasterIp,
174+
"add_time": cluster.AddTime,
175+
}
176+
emr_instances = append(emr_instances, mapping)
177+
ids = append(ids, (string)(*cluster.Id))
178+
}
179+
d.SetId(helper.DataResourceIdsHash(ids))
180+
err = d.Set("clusters", emr_instances)
181+
if err != nil {
182+
log.Printf("[CRITAL]%s provider set cluster list fail, reason:%s\n ", logId, err.Error())
183+
return err
184+
}
185+
output, ok := d.GetOk("result_output_file")
186+
if ok && output.(string) != "" {
187+
if err := writeToFile(output.(string), emr_instances); err != nil {
188+
return err
189+
}
190+
}
191+
return nil
192+
}

tencentcloud/extension_emr.go

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package tencentcloud
2+
3+
import (
4+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
5+
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
6+
emr "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/emr/v20190103"
7+
)
8+
9+
const (
10+
EmrInternetStatusCreated int64 = 2
11+
EmrInternetStatusDeleted int64 = 201
12+
)
13+
14+
const (
15+
DisplayStrategyIsclusterList = "clusterList"
16+
)
17+
18+
func buildResourceSpecSchema() *schema.Schema {
19+
return &schema.Schema{
20+
Type: schema.TypeList,
21+
Optional: true,
22+
ForceNew: true,
23+
MaxItems: 1,
24+
Elem: &schema.Resource{
25+
Schema: map[string]*schema.Schema{
26+
"spec": {Type: schema.TypeString, Optional: true},
27+
"storage_type": {Type: schema.TypeInt, Optional: true},
28+
"disk_type": {Type: schema.TypeString, Optional: true},
29+
"mem_size": {Type: schema.TypeInt, Optional: true},
30+
"cpu": {Type: schema.TypeInt, Optional: true},
31+
"disk_size": {Type: schema.TypeInt, Optional: true},
32+
},
33+
},
34+
}
35+
}
36+
37+
func ParseMultiDisks(_multiDisks []map[string]interface{}) []*emr.MultiDisk {
38+
multiDisks := make([]*emr.MultiDisk, len(_multiDisks))
39+
for _, item := range _multiDisks {
40+
var diskType string
41+
var volume int64
42+
var count int64
43+
for subK, subV := range item {
44+
if subK == "disk_type" {
45+
diskType = subV.(string)
46+
} else if subK == "volume" {
47+
volume = subV.(int64)
48+
} else if subK == "count" {
49+
count = subV.(int64)
50+
}
51+
}
52+
multiDisks = append(multiDisks,
53+
&emr.MultiDisk{
54+
DiskType: common.StringPtr(diskType),
55+
Volume: common.Int64Ptr(volume),
56+
Count: common.Int64Ptr(count),
57+
})
58+
}
59+
60+
return multiDisks
61+
}
62+
63+
func ParseTags(_tags []map[string]string) []*emr.Tag {
64+
tags := make([]*emr.Tag, len(_tags))
65+
for _, item := range _tags {
66+
for k, v := range item {
67+
tags = append(tags, &emr.Tag{TagKey: &k, TagValue: &v})
68+
}
69+
}
70+
return tags
71+
}
72+
73+
func ParseResource(_resource map[string]interface{}) *emr.Resource {
74+
resultResource := &emr.Resource{}
75+
for k, v := range _resource {
76+
if k == "spec" {
77+
resultResource.Spec = common.StringPtr(v.(string))
78+
} else if k == "storage_type" {
79+
resultResource.StorageType = common.Int64Ptr((int64)(v.(int)))
80+
} else if k == "disk_type" {
81+
resultResource.DiskType = common.StringPtr(v.(string))
82+
} else if k == "mem_size" {
83+
resultResource.MemSize = common.Int64Ptr((int64)(v.(int)))
84+
} else if k == "cpu" {
85+
resultResource.Cpu = common.Int64Ptr((int64)(v.(int)))
86+
} else if k == "disk_size" {
87+
resultResource.DiskSize = common.Int64Ptr((int64)(v.(int)))
88+
} else if k == "root_size" {
89+
resultResource.RootSize = common.Int64Ptr((int64)(v.(int)))
90+
} else if k == "multi_disks" {
91+
multiDisks := v.([]map[string]interface{})
92+
resultResource.MultiDisks = ParseMultiDisks(multiDisks)
93+
} else if k == "tags" {
94+
tags := v.([]map[string]string)
95+
resultResource.Tags = ParseTags(tags)
96+
} else if k == "instance_type" {
97+
resultResource.InstanceType = common.StringPtr(v.(string))
98+
} else if k == "local_disk_num" {
99+
resultResource.LocalDiskNum = common.Uint64Ptr(v.(uint64))
100+
} else if k == "DiskNum" {
101+
resultResource.DiskNum = common.Uint64Ptr(v.(uint64))
102+
}
103+
}
104+
return resultResource
105+
}

tencentcloud/provider.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,13 @@ VPN
550550
tencentcloud_vpn_gateway_route
551551
tencentcloud_vpn_connection
552552
553+
EMR
554+
Data Source
555+
tencentcloud_emr
556+
557+
Resource
558+
tencentcloud_emr_cluster
559+
553560
DNSPOD
554561
Resource
555562
tencentcloud_dnspod_domain_instance
@@ -667,6 +674,7 @@ func Provider() terraform.ResourceProvider {
667674

668675
DataSourcesMap: map[string]*schema.Resource{
669676
"tencentcloud_availability_regions": dataSourceTencentCloudAvailabilityRegions(),
677+
"tencentcloud_emr": dataSourceTencentCloudEmr(),
670678
"tencentcloud_availability_zones": dataSourceTencentCloudAvailabilityZones(),
671679
"tencentcloud_availability_zones_by_product": dataSourceTencentCloudAvailabilityZonesByProduct(),
672680
"tencentcloud_instances": dataSourceTencentCloudInstances(),
@@ -825,6 +833,7 @@ func Provider() terraform.ResourceProvider {
825833
},
826834

827835
ResourcesMap: map[string]*schema.Resource{
836+
"tencentcloud_emr_cluster": resourceTencentCloudEmrCluster(),
828837
"tencentcloud_instance": resourceTencentCloudInstance(),
829838
"tencentcloud_reserved_instance": resourceTencentCloudReservedInstance(),
830839
"tencentcloud_key_pair": resourceTencentCloudKeyPair(),

tencentcloud/resource_tc_clb_instance_topic_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,8 @@ func testAccCheckClbInstanceTopicExists(n string) resource.TestCheckFunc {
4343
clsService := ClsService{
4444
client: testAccProvider.Meta().(*TencentCloudClient).apiV3Conn,
4545
}
46-
47-
instance, err := clsService.DescribeTopicsById(ctx, rs.Primary.ID)
48-
46+
topicName := rs.Primary.Attributes["topic_name"]
47+
instance, err := clsService.DescribeTopicsById(ctx, topicName)
4948
if err != nil {
5049
return err
5150
}

0 commit comments

Comments
 (0)