alicloud/data_source_alicloud_vpcs.go (379 lines of code) (raw):
package alicloud
import (
"fmt"
"regexp"
"github.com/PaesslerAG/jsonpath"
"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 dataSourceAlicloudVpcs() *schema.Resource {
return &schema.Resource{
Read: dataSourceAlicloudVpcsRead,
Schema: map[string]*schema.Schema{
"cidr_block": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
},
"vswitch_id": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
},
"dhcp_options_set_id": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
},
"dry_run": {
Type: schema.TypeBool,
Optional: true,
ForceNew: true,
},
"is_default": {
Type: schema.TypeBool,
Optional: true,
ForceNew: true,
},
"resource_group_id": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
},
"status": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
ValidateFunc: validation.StringInSlice([]string{"Available", "Pending"}, false),
},
"tags": tagsSchema(),
"ids": {
Type: schema.TypeList,
Optional: true,
ForceNew: true,
Elem: &schema.Schema{Type: schema.TypeString},
Computed: true,
},
"name_regex": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.ValidateRegexp,
ForceNew: true,
},
"names": {
Type: schema.TypeList,
Elem: &schema.Schema{Type: schema.TypeString},
Computed: true,
},
"vpc_name": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
},
"vpc_owner_id": {
Type: schema.TypeInt,
Optional: true,
ForceNew: true,
},
"output_file": {
Type: schema.TypeString,
Optional: true,
},
"page_number": {
Type: schema.TypeInt,
Optional: true,
},
"page_size": {
Type: schema.TypeInt,
Optional: true,
Default: 50,
},
"vpcs": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"region_id": {
Type: schema.TypeString,
Computed: true,
},
"creation_time": {
Type: schema.TypeString,
Computed: true,
},
"cidr_block": {
Type: schema.TypeString,
Computed: true,
},
"description": {
Type: schema.TypeString,
Computed: true,
},
"dhcp_options_set_id": {
Type: schema.TypeString,
Computed: true,
},
"dhcp_options_set_status": {
Type: schema.TypeString,
Computed: true,
},
"dns_hostname_status": {
Type: schema.TypeString,
Computed: true,
},
"ipv6_cidr_block": {
Type: schema.TypeString,
Computed: true,
},
"is_default": {
Type: schema.TypeBool,
Computed: true,
},
"resource_group_id": {
Type: schema.TypeString,
Computed: true,
},
"route_table_id": {
Type: schema.TypeString,
Computed: true,
},
"router_id": {
Type: schema.TypeString,
Computed: true,
},
"vrouter_id": {
Type: schema.TypeString,
Computed: true,
},
"secondary_cidr_blocks": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"status": {
Type: schema.TypeString,
Computed: true,
},
"tags": {
Type: schema.TypeMap,
Computed: true,
},
"user_cidrs": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"vswitch_ids": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"id": {
Type: schema.TypeString,
Computed: true,
},
"vpc_id": {
Type: schema.TypeString,
Computed: true,
},
"vpc_name": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"enable_details": {
Type: schema.TypeBool,
Optional: true,
Default: true,
},
"total_count": {
Type: schema.TypeInt,
Computed: true,
},
},
}
}
func dataSourceAlicloudVpcsRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
action := "DescribeVpcs"
request := make(map[string]interface{})
if v, ok := d.GetOk("dhcp_options_set_id"); ok {
request["DhcpOptionsSetId"] = v
}
if v, ok := d.GetOkExists("dry_run"); ok {
request["DryRun"] = v
}
if v, ok := d.GetOkExists("is_default"); ok {
request["IsDefault"] = v
}
request["RegionId"] = client.RegionId
if v, ok := d.GetOk("resource_group_id"); ok {
request["ResourceGroupId"] = 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
}
if v, ok := d.GetOk("vpc_name"); ok {
request["VpcName"] = v
}
if v, ok := d.GetOk("vpc_owner_id"); ok {
request["VpcOwnerId"] = v
}
if v, ok := d.GetOk("page_number"); ok && v.(int) > 0 {
request["PageNumber"] = v.(int)
} else {
request["PageNumber"] = 1
}
if v, ok := d.GetOk("page_size"); ok && v.(int) > 0 {
request["PageSize"] = v.(int)
} else {
request["PageSize"] = PageSizeLarge
}
var objects []interface{}
var vpcNameRegex *regexp.Regexp
if v, ok := d.GetOk("name_regex"); ok {
r, err := regexp.Compile(v.(string))
if err != nil {
return WrapError(err)
}
vpcNameRegex = 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)
}
}
status, statusOk := d.GetOk("status")
var response map[string]interface{}
var err error
for {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, request, true)
if err != nil {
return WrapErrorf(err, DataDefaultErrorMsg, "alicloud_vpcs", action, AlibabaCloudSdkGoERROR)
}
addDebug(action, response, request)
resp, err := jsonpath.Get("$.Vpcs.Vpc", response)
if err != nil {
return WrapErrorf(err, FailedGetAttributeMsg, action, "$.Vpcs.Vpc", response)
}
result, _ := resp.([]interface{})
if isPagingRequest(d) {
objects = result
break
}
for _, v := range result {
item := v.(map[string]interface{})
if v, ok := d.GetOk("cidr_block"); ok && v.(string) != "" && item["CidrBlock"].(string) != v.(string) {
continue
}
if v, ok := d.GetOk("vswitch_id"); ok && !vpcVswitchIdListContains(item, v.(string)) {
continue
}
if vpcNameRegex != nil {
if !vpcNameRegex.MatchString(fmt.Sprint(item["VpcName"])) {
continue
}
}
if len(idsMap) > 0 {
if _, ok := idsMap[fmt.Sprint(item["VpcId"])]; !ok {
continue
}
}
if statusOk && status.(string) != "" && status.(string) != item["Status"].(string) {
continue
}
objects = append(objects, item)
}
if len(result) < request["PageSize"].(int) {
break
}
request["PageNumber"] = request["PageNumber"].(int) + 1
}
ids := make([]string, 0)
names := make([]interface{}, 0)
s := make([]map[string]interface{}, 0)
for _, v := range objects {
object := v.(map[string]interface{})
mapping := map[string]interface{}{
"region_id": object["RegionId"],
"creation_time": object["CreationTime"],
"cidr_block": object["CidrBlock"],
"description": object["Description"],
"dhcp_options_set_id": object["DhcpOptionsSetId"],
"dhcp_options_set_status": object["DhcpOptionsSetStatus"],
"dns_hostname_status": object["DnsHostnameStatus"],
"ipv6_cidr_block": object["Ipv6CidrBlock"],
"is_default": object["IsDefault"],
"resource_group_id": object["ResourceGroupId"],
"router_id": object["VRouterId"],
"vrouter_id": object["VRouterId"],
"secondary_cidr_blocks": object["SecondaryCidrBlocks"].(map[string]interface{})["SecondaryCidrBlock"],
"status": object["Status"],
"user_cidrs": object["UserCidrs"].(map[string]interface{})["UserCidr"],
"vswitch_ids": object["VSwitchIds"].(map[string]interface{})["VSwitchId"],
"id": fmt.Sprint(object["VpcId"]),
"vpc_id": fmt.Sprint(object["VpcId"]),
"vpc_name": object["VpcName"],
}
tagsMaps, _ := jsonpath.Get("$.Tags.Tag", object)
mapping["tags"] = tagsToMap(tagsMaps)
if detailedEnabled := d.Get("enable_details"); !detailedEnabled.(bool) {
ids = append(ids, fmt.Sprint(object["VpcId"]))
names = append(names, object["VpcName"])
s = append(s, mapping)
continue
}
vpcService := VpcService{client}
id := fmt.Sprint(object["VpcId"])
getResp, err := vpcService.DescribeRouteTableList(id)
if err != nil {
return WrapError(err)
}
mapping["route_table_id"] = getResp["RouteTableId"]
ids = append(ids, fmt.Sprint(object["VpcId"]))
names = append(names, object["VpcName"])
s = append(s, mapping)
}
d.SetId(dataResourceIdHash(ids))
if err := d.Set("ids", ids); err != nil {
return WrapError(err)
}
if err := d.Set("names", names); err != nil {
return WrapError(err)
}
if err := d.Set("vpcs", s); err != nil {
return WrapError(err)
}
if err := d.Set("total_count", formatInt(response["TotalCount"])); err != nil {
return WrapError(err)
}
if output, ok := d.GetOk("output_file"); ok && output.(string) != "" {
writeToFile(output.(string), s)
}
return nil
}
func vpcVswitchIdListContains(vpc map[string]interface{}, vswitchId string) bool {
if v, ok := vpc["VSwitchIds"].(map[string]interface{})["VSwitchId"].([]interface{}); ok {
for _, idListItem := range v {
if fmt.Sprint(idListItem) == vswitchId {
return true
}
}
return false
}
return false
}