diff --git a/alicloud/connectivity/regions.go b/alicloud/connectivity/regions.go index 2d76a12a6f10..1c58f672663c 100644 --- a/alicloud/connectivity/regions.go +++ b/alicloud/connectivity/regions.go @@ -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} diff --git a/alicloud/data_source_alicloud_adb_db_cluster_classes.go b/alicloud/data_source_alicloud_adb_db_cluster_classes.go new file mode 100644 index 000000000000..dffd0d63c1d1 --- /dev/null +++ b/alicloud/data_source_alicloud_adb_db_cluster_classes.go @@ -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["ChargeType"] = 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 +} diff --git a/alicloud/data_source_alicloud_adb_db_cluster_classes_test.go b/alicloud/data_source_alicloud_adb_db_cluster_classes_test.go new file mode 100644 index 000000000000..ca9ddf447e2c --- /dev/null +++ b/alicloud/data_source_alicloud_adb_db_cluster_classes_test.go @@ -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 "" +} diff --git a/alicloud/provider.go b/alicloud/provider.go index bcaa4793b523..171987a83d79 100644 --- a/alicloud/provider.go +++ b/alicloud/provider.go @@ -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(), diff --git a/alicloud/resource_alicloud_adb_account_test.go b/alicloud/resource_alicloud_adb_account_test.go index e2b7cc01105d..5b58948936ce 100644 --- a/alicloud/resource_alicloud_adb_account_test.go +++ b/alicloud/resource_alicloud_adb_account_test.go @@ -34,6 +34,7 @@ func TestAccAlicloudAdbAccount_update_forSuper(t *testing.T) { testAccPreCheck(t) testAccPreCheckWithNoDefaultVpc(t) testAccPreCheckWithNoDefaultVswitch(t) + testAccPreCheckWithRegions(t, false, connectivity.AdbDBClusterUnSupportRegions) }, // module name @@ -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" diff --git a/alicloud/resource_alicloud_adb_backup_policy_test.go b/alicloud/resource_alicloud_adb_backup_policy_test.go index db45138b90c0..db7182ac18c8 100644 --- a/alicloud/resource_alicloud_adb_backup_policy_test.go +++ b/alicloud/resource_alicloud_adb_backup_policy_test.go @@ -27,6 +27,7 @@ func TestAccAlicloudAdbBackupPolicy(t *testing.T) { testAccPreCheck(t) testAccPreCheckWithNoDefaultVpc(t) testAccPreCheckWithNoDefaultVswitch(t) + testAccPreCheckWithRegions(t, false, connectivity.AdbDBClusterUnSupportRegions) }, IDRefreshName: resourceId, Providers: testAccProviders, @@ -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" diff --git a/alicloud/resource_alicloud_adb_connection_test.go b/alicloud/resource_alicloud_adb_connection_test.go index 18fe924527ca..5e53681afb2d 100644 --- a/alicloud/resource_alicloud_adb_connection_test.go +++ b/alicloud/resource_alicloud_adb_connection_test.go @@ -35,6 +35,7 @@ func TestAccAlicloudAdbConnectionConfig(t *testing.T) { testAccPreCheck(t) testAccPreCheckWithNoDefaultVpc(t) testAccPreCheckWithNoDefaultVswitch(t) + testAccPreCheckWithRegions(t, false, connectivity.AdbDBClusterUnSupportRegions) }, // module name @@ -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" diff --git a/alicloud/resource_alicloud_adb_db_cluster_test.go b/alicloud/resource_alicloud_adb_db_cluster_test.go index 2d8ed91bf5a3..cbad8e929bc7 100644 --- a/alicloud/resource_alicloud_adb_db_cluster_test.go +++ b/alicloud/resource_alicloud_adb_db_cluster_test.go @@ -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, @@ -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", @@ -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", @@ -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", }), diff --git a/alicloud/service_alicloud_common_test.go b/alicloud/service_alicloud_common_test.go index cda1c3e6e4a1..e194b92bbcde 100644 --- a/alicloud/service_alicloud_common_test.go +++ b/alicloud/service_alicloud_common_test.go @@ -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 = ` diff --git a/website/alicloud.erb b/website/alicloud.erb index 4267bef2dce0..52430cafbd42 100644 --- a/website/alicloud.erb +++ b/website/alicloud.erb @@ -117,15 +117,18 @@