Skip to content

Commit

Permalink
Add alicloud_adb_db_cluster_classes datasource to search ADB availabl…
Browse files Browse the repository at this point in the history
…e classes.
  • Loading branch information
zql-tqy committed Apr 13, 2021
1 parent bd5e0c2 commit fc2e132
Show file tree
Hide file tree
Showing 11 changed files with 240 additions and 16 deletions.
1 change: 1 addition & 0 deletions alicloud/connectivity/regions.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,3 +116,4 @@ var TsdbInstanceSupportRegions = []Region{Beijing, Hangzhou, Shenzhen, Shanghai,
var EipanycastSupportRegions = []Region{Hangzhou}
var VpcIpv6SupportRegions = []Region{Hangzhou, Shanghai, Shenzhen, Beijing, Huhehaote, Hongkong, APSouthEast1}
var EssdSupportRegions = []Region{Zhangjiakou, Huhehaote}
var AdbDBClusterUnSupportRegions = []Region{EUCentral1}
127 changes: 127 additions & 0 deletions alicloud/data_source_alicloud_adb_db_cluster_classes.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package alicloud

import (
"github.com/PaesslerAG/jsonpath"
util "github.com/alibabacloud-go/tea-utils/service"
"github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
)

func dataSourceAlicloudAdbDbClusterClasses() *schema.Resource {
return &schema.Resource{
Read: dataSourceAlicloudAdbDbClusterClassesRead,

Schema: map[string]*schema.Schema{
"zone_id": {
Type: schema.TypeString,
Optional: true,
},
"payment_type": {
Type: schema.TypeString,
Optional: true,
Default: "PayAsYouGo",
ValidateFunc: validation.StringInSlice([]string{"PayAsYouGo", "Subscription"}, false),
},
"output_file": {
Type: schema.TypeString,
Optional: true,
},
"available_zone_list": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"zone_id": {
Type: schema.TypeString,
Computed: true,
},
"classes": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
},
},
},
},
}
}

func dataSourceAlicloudAdbDbClusterClassesRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)

action := "DescribeAvailableResource"
request := make(map[string]interface{})
request["RegionId"] = client.RegionId

if v, ok := d.GetOk("zone_id"); ok {
request["ZoneId"] = v.(string)
}
if v, ok := d.GetOk("payment_type"); ok {
request["payment_type"] = convertAdbDbClusterDBClusterPaymentTypeRequest(v.(string))
}

response := make(map[string]interface{})
conn, err := client.NewAdsClient()
runtime := util.RuntimeOptions{}
runtime.SetAutoretry(true)
response, err = conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2019-03-15"), StringPointer("AK"), nil, request, &runtime)
if err != nil {
return WrapErrorf(err, DataDefaultErrorMsg, "alicloud_adb_db_cluster_classes", action, AlibabaCloudSdkGoERROR)
}
addDebug(action, response, request)

resp, err := jsonpath.Get("$.AvailableZoneList", response)
if err != nil {
return WrapErrorf(err, FailedGetAttributeMsg, action, "$.AvailableZoneList", response)
}

result := resp.([]interface{})
objects := make([]map[string]interface{}, 0)
zoneIds := make([]string, 0)
s := make([]map[string]interface{}, 0)
for _, v := range result {
item := v.(map[string]interface{})
objects = append(objects, item)
}

for _, object := range objects {
classes := make([]string, 0)
mapping := map[string]interface{}{
"zone_id": object["ZoneId"],
}
zoneIds = append(zoneIds, object["ZoneId"].(string))
if supportedMode, ok := object["SupportedMode"]; ok {
if supportedModes, ok := supportedMode.([]interface{}); ok {
for _, supportedMode := range supportedModes {
if supportedSerialList, ok := supportedMode.(map[string]interface{})["SupportedSerialList"]; ok {
if supportedSerials, ok := supportedSerialList.([]interface{}); ok {
for _, supportedSerial := range supportedSerials {
if supportedInstanceClassList, ok := supportedSerial.(map[string]interface{})["SupportedInstanceClassList"]; ok {
if supportedInstanceClasses, ok := supportedInstanceClassList.([]interface{}); ok {
for _, supportedInstanceClass := range supportedInstanceClasses {
classes = append(classes, supportedInstanceClass.(map[string]interface{})["InstanceClass"].(string))
}
}
}
}
}
}
}
}
}
mapping["classes"] = classes
s = append(s, mapping)
}

d.SetId(dataResourceIdHash(zoneIds))
if err := d.Set("available_zone_list", s); err != nil {
return WrapError(err)
}

if output, ok := d.GetOk("output_file"); ok && output.(string) != "" {
writeToFile(output.(string), s)
}
return nil
}
44 changes: 44 additions & 0 deletions alicloud/data_source_alicloud_adb_db_cluster_classes_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package alicloud

import (
"testing"

"github.com/hashicorp/terraform-plugin-sdk/helper/acctest"
)

func TestAccAlicloudAdbDbClusterClassesDataSource_basic(t *testing.T) {
rand := acctest.RandInt()
resourceId := "data.alicloud_adb_db_cluster_classes.default"

testAccConfig := dataSourceTestAccConfigFunc(resourceId, "", dataSourceAdbDbClusterClassesConfigDependence)

paymentTypeConfig := dataSourceTestAccConfig{
existConfig: testAccConfig(map[string]interface{}{
"payment_type": "PayAsYouGo",
}),
}

var existAdbZonesMapFunc = func(rand int) map[string]string {
return map[string]string{
"available_zone_list.#": CHECKSET,
}
}

var fakeAdbZonesMapFunc = func(rand int) map[string]string {
return map[string]string{
"available_zone_list.#": "0",
}
}

var adbZonesCheckInfo = dataSourceAttr{
resourceId: resourceId,
existMapFunc: existAdbZonesMapFunc,
fakeMapFunc: fakeAdbZonesMapFunc,
}

adbZonesCheckInfo.dataSourceTestCheck(t, rand, paymentTypeConfig)
}

func dataSourceAdbDbClusterClassesConfigDependence(name string) string {
return ""
}
1 change: 1 addition & 0 deletions alicloud/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,7 @@ func Provider() terraform.ResourceProvider {
"alicloud_ecs_snapshots": dataSourceAlicloudEcsSnapshots(),
"alicloud_ecs_key_pairs": dataSourceAlicloudEcsKeyPairs(),
"alicloud_adb_db_clusters": dataSourceAlicloudAdbDbClusters(),
"alicloud_adb_db_cluster_classes": dataSourceAlicloudAdbDbClusterClasses(),
},
ResourcesMap: map[string]*schema.Resource{
"alicloud_instance": resourceAliyunInstance(),
Expand Down
3 changes: 2 additions & 1 deletion alicloud/resource_alicloud_adb_account_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ func TestAccAlicloudAdbAccount_update_forSuper(t *testing.T) {
testAccPreCheck(t)
testAccPreCheckWithNoDefaultVpc(t)
testAccPreCheckWithNoDefaultVswitch(t)
testAccPreCheckWithRegions(t,false, connectivity.AdbDBClusterUnSupportRegions)
},

// module name
Expand Down Expand Up @@ -109,7 +110,7 @@ func resourceAdbAccountConfigDependence(name string) string {
resource "alicloud_adb_cluster" "cluster" {
db_cluster_version = "3.0"
db_cluster_category = "Cluster"
db_node_class = "C8"
db_node_class = data.alicloud_adb_db_cluster_classes.default.available_zone_list[0].classes[0]
db_node_count = 2
db_node_storage = 200
pay_type = "PostPaid"
Expand Down
3 changes: 2 additions & 1 deletion alicloud/resource_alicloud_adb_backup_policy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ func TestAccAlicloudAdbBackupPolicy(t *testing.T) {
testAccPreCheck(t)
testAccPreCheckWithNoDefaultVpc(t)
testAccPreCheckWithNoDefaultVswitch(t)
testAccPreCheckWithRegions(t,false, connectivity.AdbDBClusterUnSupportRegions)
},
IDRefreshName: resourceId,
Providers: testAccProviders,
Expand Down Expand Up @@ -99,7 +100,7 @@ func resourceAdbBackupPolicyConfigDependence(name string) string {
resource "alicloud_adb_cluster" "default" {
db_cluster_version = "3.0"
db_cluster_category = "Cluster"
db_node_class = "C8"
db_node_class = data.alicloud_adb_db_cluster_classes.default.available_zone_list[0].classes[0]
db_node_count = 2
db_node_storage = 200
pay_type = "PostPaid"
Expand Down
3 changes: 2 additions & 1 deletion alicloud/resource_alicloud_adb_connection_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ func TestAccAlicloudAdbConnectionConfig(t *testing.T) {
testAccPreCheck(t)
testAccPreCheckWithNoDefaultVpc(t)
testAccPreCheckWithNoDefaultVswitch(t)
testAccPreCheckWithRegions(t,false, connectivity.AdbDBClusterUnSupportRegions)
},

// module name
Expand Down Expand Up @@ -75,7 +76,7 @@ func resourceAdbConnectionConfigDependence(name string) string {
resource "alicloud_adb_cluster" "cluster" {
db_cluster_version = "3.0"
db_cluster_category = "Cluster"
db_node_class = "C8"
db_node_class = data.alicloud_adb_db_cluster_classes.default.available_zone_list[0].classes[0]
db_node_count = 2
db_node_storage = 200
pay_type = "PostPaid"
Expand Down
9 changes: 5 additions & 4 deletions alicloud/resource_alicloud_adb_db_cluster_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ func TestAccAlicloudAdbDbCluster_basic(t *testing.T) {
resource.Test(t, resource.TestCase{
PreCheck: func() {
testAccPreCheck(t)
testAccPreCheckWithRegions(t,false, connectivity.AdbDBClusterUnSupportRegions)
},

IDRefreshName: resourceId,
Expand All @@ -30,7 +31,7 @@ func TestAccAlicloudAdbDbCluster_basic(t *testing.T) {
{
Config: testAccConfig(map[string]interface{}{
"db_cluster_category": "Cluster",
"db_cluster_class": "C8",
"db_cluster_class": "${data.alicloud_adb_db_cluster_classes.default.available_zone_list[0].classes[0]}",
"db_node_count": "2",
"db_node_storage": "200",
"mode": "reserver",
Expand All @@ -41,7 +42,7 @@ func TestAccAlicloudAdbDbCluster_basic(t *testing.T) {
Check: resource.ComposeTestCheckFunc(
testAccCheck(map[string]string{
"db_cluster_category": "Cluster",
"db_cluster_class": "C8",
"db_cluster_class": CHECKSET,
"db_node_count": "2",
"db_node_storage": "200",
"mode": "reserver",
Expand All @@ -59,13 +60,13 @@ func TestAccAlicloudAdbDbCluster_basic(t *testing.T) {
},
{
Config: testAccConfig(map[string]interface{}{
"db_node_class": "C32",
"db_node_class": "${data.alicloud_adb_db_cluster_classes.this.default[0].classes[1]}",
"db_node_count": "4",
"db_node_storage": "200",
}),
Check: resource.ComposeTestCheckFunc(
testAccCheck(map[string]string{
"db_node_class": "C32",
"db_node_class": CHECKSET,
"db_node_count": "4",
"db_node_storage": "200",
}),
Expand Down
7 changes: 5 additions & 2 deletions alicloud/service_alicloud_common_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -851,11 +851,14 @@ data "alicloud_vswitches" "default" {
resource "alicloud_vswitch" "this" {
count = "${length(data.alicloud_vswitches.default.ids) > 0 ? 0 : 1}"
name = "tf_testAccAdb_vpc"
vswitch_name = "tf_testAccAdb_vpc"
vpc_id = "${data.alicloud_vpcs.default.ids.0}"
availability_zone = "${data.alicloud_zones.default.zones.0.id}"
zone_id = "${data.alicloud_zones.default.zones.0.id}"
cidr_block = "172.16.0.0/24"
}
data "alicloud_adb_db_cluster_classes" "default" {
zone_id = data.alicloud_zones.default.zones.0.id
}
`

const KVStoreCommonTestCase = `
Expand Down
17 changes: 10 additions & 7 deletions website/alicloud.erb
Original file line number Diff line number Diff line change
Expand Up @@ -117,15 +117,18 @@
<li>
<a href="#">Data Sources</a>
<ul class="nav nav-auto-expand">
<li>
<a href="/docs/providers/alicloud/d/adb_clusters.html">alicloud_adb_clusters</a>
</li>
<li>
<a href="/docs/providers/alicloud/d/adb_clusters.html">alicloud_adb_clusters</a>
</li>
<li>
<a href="/docs/providers/alicloud/d/adb_db_clusters.html">alicloud_adb_db_clusters</a>
</li>
<li>
<a href="/docs/providers/alicloud/d/adb_zones.html">alicloud_adb_zones</a>
</li>
</li>
<li>
<a href="/docs/providers/alicloud/d/adb_db_cluster_classes.html">alicloud_adb_db_cluster_classes</a>
</li>
<li>
<a href="/docs/providers/alicloud/d/adb_zones.html">alicloud_adb_zones</a>
</li>
</ul>
</li>
<li>
Expand Down
41 changes: 41 additions & 0 deletions website/docs/d/adb_db_cluster_classes.html.markdown
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
---
subcategory: "AnalyticDB for MySQL (ADB)"
layout: "alicloud"
page_title: "Alicloud: alicloud_adb_db_cluster_classes"
sidebar_current: "docs-alicloud-datasource-adb-db-cluster-classes"
description: |-
Provides a list of available cluster classes for ADB that can be used by an Alibaba Cloud account.
---

# alicloud\_adb\_db\_cluster\_classes

This data source provides available cluster classes for ADB that can be accessed by an Alibaba Cloud account within the region configured in the provider.

-> **NOTE:** Available in v1.122.0+.

## Example Usage

```
# Declare the data source
data "alicloud_adb_db_cluster_classes" "availabile_classes" {}
output "classes" {
value = alicloud_adb_db_cluster_classes.availabile_classes.available_zone_list[0].classes[0]
}
```

## Argument Reference

The following arguments are supported:

* `zone_id` - (Optional) The zone ID of the resource.
* `payment_type` - (Optional) The payment type of the resource. Valid values are `PayAsYouGo` and `Subscription`. Default to `PayAsYouGo`.
* `output_file` - (Optional) File name where to save data source results (after running `terraform plan`).

## Attributes Reference

The following attributes are exported in addition to the arguments listed above:

* `available_zone_list` - A list of availability zones. Each element contains the following attributes:
* `zone_id` - ID of the zone.
* `classes` - The available classes of zone.

0 comments on commit fc2e132

Please sign in to comment.