in alibabacloudstack/data_source_apsarastack_adb_dbclusters.go [225:416]
func dataSourceAlibabacloudStackAdbDbClustersRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
action := "DescribeDBClusters"
request := make(map[string]interface{})
if v, ok := d.GetOk("description"); ok {
request["DBClusterDescription"] = v
}
if v, ok := d.GetOk("resource_group_id"); ok {
request["ResourceGroupId"] = v
}
if v, ok := d.GetOk("status"); ok {
request["DBClusterStatus"] = v
}
if v, ok := d.GetOk("tags"); ok {
tags := make([]map[string]interface{}, 0)
for key, value := range v.(map[string]interface{}) {
tags = append(tags, map[string]interface{}{
"Key": key,
"Value": value.(string),
})
}
request["Tag.*"] = tags
}
request["PageSize"] = PageSizeLarge
request["PageNumber"] = 1
var objects []map[string]interface{}
var descriptionRegex *regexp.Regexp
if v, ok := d.GetOk("description_regex"); ok {
r, err := regexp.Compile(v.(string))
if err != nil {
return errmsgs.WrapError(err)
}
descriptionRegex = r
}
idsMap := make(map[string]string)
if v, ok := d.GetOk("ids"); ok {
for _, vv := range v.([]interface{}) {
if vv == nil {
continue
}
idsMap[vv.(string)] = vv.(string)
}
}
for {
response, err := client.DoTeaRequest("POST", "adb", "2019-03-15", action, "", nil, nil, request)
if err != nil {
return err
}
addDebug(action, response, request)
resp, err := jsonpath.Get("$.Items.DBCluster", response)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.FailedGetAttributeMsg, action, "$.Items.DBCluster", response)
}
result, _ := resp.([]interface{})
for _, v := range result {
item := v.(map[string]interface{})
if descriptionRegex != nil {
if !descriptionRegex.MatchString(fmt.Sprint(item["DBClusterDescription"])) {
continue
}
}
if len(idsMap) > 0 {
if _, ok := idsMap[fmt.Sprint(item["DBClusterId"])]; !ok {
continue
}
}
objects = append(objects, item)
}
if len(result) < PageSizeLarge {
break
}
request["PageNumber"] = request["PageNumber"].(int) + 1
}
descriptions := make([]string, 0)
ids := make([]string, 0)
s := make([]map[string]interface{}, 0)
for _, object := range objects {
mapping := map[string]interface{}{
"commodity_code": object["CommodityCode"],
"connection_string": object["ConnectionString"],
"create_time": object["CreateTime"],
"db_cluster_category": object["Category"],
"id": fmt.Sprint(object["DBClusterId"]),
"db_cluster_id": fmt.Sprint(object["DBClusterId"]),
"db_cluster_network_type": object["DBClusterNetworkType"],
"network_type": object["DBClusterNetworkType"],
"db_cluster_type": object["DBClusterType"],
"db_node_class": object["DBNodeClass"],
"db_node_count": object["DBNodeCount"],
"db_node_storage": object["DBNodeStorage"],
"description": object["DBClusterDescription"],
"disk_type": object["DiskType"],
"dts_job_id": object["DtsJobId"],
"elastic_io_resource": formatInt(object["ElasticIOResource"]),
"engine": object["Engine"],
"executor_count": object["ExecutorCount"],
"expire_time": object["ExpireTime"],
"expired": fmt.Sprint(object["Expired"]),
"lock_mode": object["LockMode"],
"lock_reason": object["LockReason"],
"payment_type": convertAdbDBClusterPaymentTypeResponse(object["PayType"].(string)),
"port": formatInt(object["Port"]),
"rds_instance_id": object["RdsInstanceId"],
"region_id": object["RegionId"],
"resource_group_id": object["ResourceGroupId"],
"status": object["DBClusterStatus"],
"storage_resource": object["StorageResource"],
"vpc_cloud_instance_id": object["VPCCloudInstanceId"],
"vpc_id": object["VPCId"],
"vswitch_id": object["VSwitchId"],
"zone_id": object["ZoneId"],
}
descriptions = append(descriptions, object["DBClusterDescription"].(string))
tags := make(map[string]interface{})
t, _ := jsonpath.Get("$.Tags.Tag", object)
if t != nil {
for _, t := range t.([]interface{}) {
key := t.(map[string]interface{})["Key"].(string)
value := t.(map[string]interface{})["Value"].(string)
if !ignoredTags(key, value) {
tags[key] = value
}
}
}
mapping["tags"] = tags
if detailedEnabled := d.Get("enable_details"); !detailedEnabled.(bool) {
ids = append(ids, fmt.Sprint(object["DBClusterId"]))
s = append(s, mapping)
continue
}
adbService := AdbService{client}
id := fmt.Sprint(object["DBClusterId"])
// 预付费 专有云没有细分 没有 DescribeAutoRenewAttribute 接口
//if object["PayType"].(string) == string(Prepaid) {
// getResp, err := adbService.DescribeAutoRenewAttribute(id)
// if err != nil {
// return errmsgs.WrapError(err)
// }
// mapping["auto_renew_period"] = getResp["Duration"]
// mapping["renewal_status"] = getResp["RenewalStatus"]
//}
getResp1, err := adbService.DescribeDBClusterAccessWhiteList(id)
if err != nil {
return errmsgs.WrapError(err)
}
mapping["security_ips"] = strings.Split(getResp1["SecurityIPList"].(string), ",")
getResp2, err := adbService.DescribeAdbDbCluster(id)
if err != nil {
return errmsgs.WrapError(err)
}
//mapping["engine_version"] = getResp2["EngineVersion"]
mapping["maintain_time"] = getResp2["MaintainTime"]
getResp3, err := adbService.DescribeDBClusters(id)
if err != nil {
return errmsgs.WrapError(err)
}
mapping["db_cluster_version"] = getResp3["DBVersion"]
ids = append(ids, fmt.Sprint(object["DBClusterId"]))
s = append(s, mapping)
}
d.SetId(dataResourceIdHash(ids))
if err := d.Set("ids", ids); err != nil {
return errmsgs.WrapError(err)
}
if err := d.Set("descriptions", descriptions); err != nil {
return errmsgs.WrapError(err)
}
if err := d.Set("clusters", s); err != nil {
return errmsgs.WrapError(err)
}
if output, ok := d.GetOk("output_file"); ok && output.(string) != "" {
if err := writeToFile(output.(string), s); err != nil {
return err
}
}
return nil
}