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 }