Skip to content

Commit b10cbd9

Browse files
tongyimingmikatong
andauthored
feat: add datasource for cynosdb spec (#1247)
* feat: add datasource for cynosdb spec * merge Co-authored-by: mikatong <mikatong@tencent.com>
1 parent b8fe491 commit b10cbd9

File tree

7 files changed

+253
-11
lines changed

7 files changed

+253
-11
lines changed

go.sum

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -503,8 +503,6 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.445 h1:Bh7XD0y
503503
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.445/go.mod h1:jMDD351efCFpT1+KVFbcpu6SbmP4TYmp4qkoCfr63nQ=
504504
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.359 h1:cNKqelPgUxrJkLY0Azd2QHr/UMYOPPnmqs88clt2akk=
505505
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.359/go.mod h1:GlTYjlrf8EKEMu+Z2MXfaM2/nHGUBBF/huBBJqGyGwI=
506-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.487 h1:/iZ931/+8b5IlTiOB9qGHUYMbQtbmSSlHaSZTtVjxF8=
507-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.487/go.mod h1:ro6h0Lg0BKK+8ugBdomSCy0ItTxr3MANinnHcONluVQ=
508506
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.488 h1:A1seXWtMf2atBjSNYvcwxyDoFzCMgqyVnsxnWzhqJEA=
509507
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.488/go.mod h1:T8mL4dQLkPTL6VtVMeBYol3asSUS53ycP9PJf5Qp1GE=
510508
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335 h1:D8qrelkK5udv8RzJJIABMzItGIyaZoYnxEVeIsYqiNw=
@@ -556,12 +554,6 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdmq v1.0.268 h1:ez5lvK
556554
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdmq v1.0.268/go.mod h1:fchXZhmqaYaG2c4wTCBTdnW6TFAtxl3D/P/yuuuLMfA=
557555
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tem v1.0.472 h1:9Jzrgx78+5XnZ8myNYjCYZn5ZF+tbSIpF6KWGgWr0uY=
558556
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tem v1.0.472/go.mod h1:ayIL2FNqk7HH5fPQrkWtYjgU4jL7if63f7x+yRwb4a0=
559-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.463 h1:QA9uGf9PjzitWIRFtf/NjsB4HjeuJdFi43RvTXNJQ5M=
560-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.463/go.mod h1:D8kkDqqTJQe/qYhXsQkwD3ACxXPoAXwNR4JWe1rOQIs=
561-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.480 h1:sP9z+Q7acbqElkzRfWbESLWycmpQHFKM+qIbeFyW24I=
562-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.480/go.mod h1:XC6UD5UnzncR6O48Ya/FsIdkiPJT/jSKlUjolzpfayg=
563-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.484 h1:7+1ltleuaAz/jI3NIapvOsl7wzu8UcJYjnh+d4UWAtc=
564-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.484/go.mod h1:o3AyKFiYfjK7U/DsDzz1XmTRmXrTsemx/gx/630d+DE=
565557
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.486 h1:JRtQYtJB9sErV9tXY6xbrC3RmXNepBKd7aV3inxkUPs=
566558
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.486/go.mod h1:wtPJIKxQUR3KoL2KWAt/Qi8KMR4ayKHiOeVJ6sTSC4U=
567559
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tke v1.0.480 h1:oZptW2Fo1pW8fKz/dv+RJLr2q8UC1qkqDqWs3rDgvQ8=
@@ -777,16 +769,13 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks
777769
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
778770
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
779771
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
780-
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
781772
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
782773
gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
783774
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
784-
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
785775
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
786776
gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
787777
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
788778
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
789-
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
790779
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
791780
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
792781
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
/*
2+
Use this data source to query which instance types of Redis are available in a specific region.
3+
4+
Example Usage
5+
6+
```hcl
7+
data "tencentcloud_cynosdb_zone_config" "foo" {
8+
}
9+
```
10+
*/
11+
package tencentcloud
12+
13+
import (
14+
"context"
15+
"fmt"
16+
"log"
17+
18+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
19+
)
20+
21+
func dataSourceTencentCynosdbZoneConfig() *schema.Resource {
22+
return &schema.Resource{
23+
Read: dataSourceTencentCynosdbZoneConfigRead,
24+
Schema: map[string]*schema.Schema{
25+
"result_output_file": {
26+
Type: schema.TypeString,
27+
Optional: true,
28+
Description: "Used to save results.",
29+
},
30+
31+
// Computed values
32+
"list": {
33+
Type: schema.TypeList,
34+
Description: "A list of zone. Each element contains the following attributes:",
35+
Computed: true,
36+
Elem: &schema.Resource{
37+
Schema: map[string]*schema.Schema{
38+
"cpu": {
39+
Type: schema.TypeInt,
40+
Computed: true,
41+
Description: "Instance CPU, unit: core.",
42+
},
43+
"memory": {
44+
Type: schema.TypeInt,
45+
Computed: true,
46+
Description: "Instance memory, unit: GB.",
47+
},
48+
"max_storage_size": {
49+
Type: schema.TypeInt,
50+
Computed: true,
51+
Description: "The maximum available storage for the instance, unit GB.",
52+
},
53+
"min_storage_size": {
54+
Type: schema.TypeInt,
55+
Computed: true,
56+
Description: "Minimum available storage of the instance, unit: GB.",
57+
},
58+
"machine_type": {
59+
Type: schema.TypeString,
60+
Computed: true,
61+
Description: "Machine type.",
62+
},
63+
"max_io_bandwidth": {
64+
Type: schema.TypeInt,
65+
Computed: true,
66+
Description: "Max io bandwidth.",
67+
},
68+
"zone_stock_infos": {
69+
Type: schema.TypeList,
70+
Computed: true,
71+
Description: "Regional inventory information.",
72+
Elem: &schema.Resource{
73+
Schema: map[string]*schema.Schema{
74+
"zone": {
75+
Type: schema.TypeString,
76+
Computed: true,
77+
Description: "Availability zone.",
78+
},
79+
"has_stock": {
80+
Type: schema.TypeBool,
81+
Computed: true,
82+
Description: "Has stock.",
83+
},
84+
},
85+
},
86+
},
87+
},
88+
},
89+
},
90+
},
91+
}
92+
}
93+
94+
func dataSourceTencentCynosdbZoneConfigRead(d *schema.ResourceData, meta interface{}) error {
95+
defer logElapsed("data_source.tencentcloud_cynosdb_zone_config.read")()
96+
97+
logId := getLogId(contextNil)
98+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
99+
100+
service := CynosdbService{client: meta.(*TencentCloudClient).apiV3Conn}
101+
region := meta.(*TencentCloudClient).apiV3Conn.Region
102+
103+
instanceSpecSet, err := service.DescribeRedisZoneConfig(ctx)
104+
if err != nil {
105+
return fmt.Errorf("api[DescribeRedisZoneConfig]fail, return %s", err.Error())
106+
}
107+
108+
result := make([]map[string]interface{}, 0)
109+
110+
for _, instanceSpec := range instanceSpecSet {
111+
resultItem := make(map[string]interface{})
112+
resultItem["cpu"] = *instanceSpec.Cpu
113+
resultItem["memory"] = *instanceSpec.Memory
114+
resultItem["max_storage_size"] = *instanceSpec.MaxStorageSize
115+
resultItem["min_storage_size"] = *instanceSpec.MinStorageSize
116+
resultItem["machine_type"] = *instanceSpec.MachineType
117+
resultItem["max_io_bandwidth"] = *instanceSpec.MaxIoBandWidth
118+
zoneStockInfos := make([]map[string]interface{}, 0)
119+
for _, zoneStockInfoItem := range instanceSpec.ZoneStockInfos {
120+
zoneStockInfo := make(map[string]interface{})
121+
zoneStockInfo["zone"] = *zoneStockInfoItem.Zone
122+
zoneStockInfo["has_stock"] = *zoneStockInfoItem.HasStock
123+
124+
zoneStockInfos = append(zoneStockInfos, zoneStockInfo)
125+
}
126+
resultItem["zone_stock_infos"] = zoneStockInfos
127+
result = append(result, resultItem)
128+
}
129+
130+
id := "cynosdb_zoneconfig_" + region
131+
d.SetId(id)
132+
d.Set("list", result)
133+
134+
if output, ok := d.GetOk("result_output_file"); ok && output.(string) != "" {
135+
136+
if err := writeToFile(output.(string), result); err != nil {
137+
log.Printf("[CRITAL]%s output file[%s] fail, reason[%s]\n",
138+
logId, output.(string), err.Error())
139+
return err
140+
}
141+
142+
}
143+
return nil
144+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package tencentcloud
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
7+
)
8+
9+
func TestAccDataSourceCynosdbZoneConfig_basic(t *testing.T) {
10+
t.Parallel()
11+
12+
resource.Test(t, resource.TestCase{
13+
PreCheck: func() { testAccPreCheck(t) },
14+
Providers: testAccProviders,
15+
Steps: []resource.TestStep{
16+
{
17+
Config: testAccDataSourceCynosdbZoneConfig(),
18+
Check: resource.ComposeTestCheckFunc(
19+
testAccCheckTencentCloudDataSourceID("data.tencentcloud_cynosdb_zone_config.test"),
20+
resource.TestCheckResourceAttrSet("data.tencentcloud_cynosdb_zone_config.test", "list.#"),
21+
resource.TestCheckResourceAttrSet("data.tencentcloud_cynosdb_zone_config.test", "list.0.cpu"),
22+
resource.TestCheckResourceAttrSet("data.tencentcloud_cynosdb_zone_config.test", "list.0.memory"),
23+
resource.TestCheckResourceAttrSet("data.tencentcloud_cynosdb_zone_config.test", "list.0.max_storage_size"),
24+
resource.TestCheckResourceAttrSet("data.tencentcloud_cynosdb_zone_config.test", "list.0.min_storage_size"),
25+
resource.TestCheckResourceAttrSet("data.tencentcloud_cynosdb_zone_config.test", "list.0.machine_type"),
26+
resource.TestCheckResourceAttrSet("data.tencentcloud_cynosdb_zone_config.test", "list.0.max_io_bandwidth"),
27+
resource.TestCheckResourceAttrSet("data.tencentcloud_cynosdb_zone_config.test", "list.0.zone_stock_infos.#"),
28+
resource.TestCheckResourceAttrSet("data.tencentcloud_cynosdb_zone_config.test", "list.0.zone_stock_infos.0.zone"),
29+
resource.TestCheckResourceAttrSet("data.tencentcloud_cynosdb_zone_config.test", "list.0.zone_stock_infos.0.has_stock"),
30+
),
31+
},
32+
},
33+
})
34+
}
35+
36+
func testAccDataSourceCynosdbZoneConfig() string {
37+
return `data "tencentcloud_cynosdb_zone_config" "test" {
38+
39+
}`
40+
}

tencentcloud/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ CynosDB
289289
Data Source
290290
tencentcloud_cynosdb_clusters
291291
tencentcloud_cynosdb_instances
292+
tencentcloud_cynosdb_zone_config
292293
293294
Resource
294295
tencentcloud_cynosdb_cluster
@@ -934,6 +935,7 @@ func Provider() terraform.ResourceProvider {
934935
"tencentcloud_audits": dataSourceTencentCloudAudits(),
935936
"tencentcloud_cynosdb_clusters": dataSourceTencentCloudCynosdbClusters(),
936937
"tencentcloud_cynosdb_instances": dataSourceTencentCloudCynosdbInstances(),
938+
"tencentcloud_cynosdb_zone_config": dataSourceTencentCynosdbZoneConfig(),
937939
"tencentcloud_vod_adaptive_dynamic_streaming_templates": dataSourceTencentCloudVodAdaptiveDynamicStreamingTemplates(),
938940
"tencentcloud_vod_image_sprite_templates": dataSourceTencentCloudVodImageSpriteTemplates(),
939941
"tencentcloud_vod_procedure_templates": dataSourceTencentCloudVodProcedureTemplates(),

tencentcloud/service_tencentcloud_cynosdb.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,28 @@ type CynosdbService struct {
1818
client *connectivity.TencentCloudClient
1919
}
2020

21+
func (me *CynosdbService) DescribeRedisZoneConfig(ctx context.Context) (instanceSpecSet []*cynosdb.InstanceSpec, err error) {
22+
logId := getLogId(ctx)
23+
request := cynosdb.NewDescribeInstanceSpecsRequest()
24+
25+
request.DbType = helper.String("MYSQL")
26+
request.IncludeZoneStocks = helper.Bool(true)
27+
28+
err = resource.Retry(readRetryTimeout, func() *resource.RetryError {
29+
ratelimit.Check(request.GetAction())
30+
response, e := me.client.UseCynosdbClient().DescribeInstanceSpecs(request)
31+
if e != nil {
32+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]",
33+
logId, request.GetAction(), request.ToJsonString(), e.Error())
34+
return retryError(e)
35+
}
36+
instanceSpecSet = response.Response.InstanceSpecSet
37+
return nil
38+
})
39+
40+
return
41+
}
42+
2143
func (me *CynosdbService) DescribeClusters(ctx context.Context, filters map[string]string) (clusters []*cynosdb.CynosdbCluster, errRet error) {
2244
logId := getLogId(ctx)
2345
request := cynosdb.NewDescribeClustersRequest()
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
---
2+
subcategory: "CynosDB"
3+
layout: "tencentcloud"
4+
page_title: "TencentCloud: tencentcloud_cynosdb_zone_config"
5+
sidebar_current: "docs-tencentcloud-datasource-cynosdb_zone_config"
6+
description: |-
7+
Use this data source to query which instance types of Redis are available in a specific region.
8+
---
9+
10+
# tencentcloud_cynosdb_zone_config
11+
12+
Use this data source to query which instance types of Redis are available in a specific region.
13+
14+
## Example Usage
15+
16+
```hcl
17+
data "tencentcloud_cynosdb_zone_config" "foo" {
18+
}
19+
```
20+
21+
## Argument Reference
22+
23+
The following arguments are supported:
24+
25+
* `result_output_file` - (Optional, String) Used to save results.
26+
27+
## Attributes Reference
28+
29+
In addition to all arguments above, the following attributes are exported:
30+
31+
* `list` - A list of zone. Each element contains the following attributes:
32+
* `cpu` - Instance CPU, unit: core.
33+
* `machine_type` - Machine type.
34+
* `max_io_bandwidth` - Max io bandwidth.
35+
* `max_storage_size` - The maximum available storage for the instance, unit GB.
36+
* `memory` - Instance memory, unit: GB.
37+
* `min_storage_size` - Minimum available storage of the instance, unit: GB.
38+
* `zone_stock_infos` - Regional inventory information.
39+
* `has_stock` - Has stock.
40+
* `zone` - Availability zone.
41+
42+

website/tencentcloud.erb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,9 @@
794794
<li>
795795
<a href="/docs/providers/tencentcloud/d/cynosdb_instances.html">tencentcloud_cynosdb_instances</a>
796796
</li>
797+
<li>
798+
<a href="/docs/providers/tencentcloud/d/cynosdb_zone_config.html">tencentcloud_cynosdb_zone_config</a>
799+
</li>
797800
</ul>
798801
</li>
799802
<li>

0 commit comments

Comments
 (0)