in alibabacloudstack/data_source_apsarastack_vpc_vpcs.go [183:346]
func dataSourceAlibabacloudStackVpcsRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
request := vpc.CreateDescribeVpcsRequest()
client.InitRpcRequest(*request.RpcRequest)
request.PageSize = requests.NewInteger(PageSizeLarge)
request.PageNumber = requests.NewInteger(1)
if v, ok := d.GetOk("dhcp_options_set_id"); ok {
request.DhcpOptionsSetId = v.(string)
}
if v, ok := d.GetOkExists("dry_run"); ok {
request.DryRun = requests.NewBoolean(v.(bool))
}
if v, ok := d.GetOkExists("is_default"); ok {
request.IsDefault = requests.NewBoolean(v.(bool))
}
if v, ok := d.GetOk("resource_group_id"); ok {
request.ResourceGroupId = v.(string)
}
if v, ok := d.GetOk("tags"); ok {
var tags []vpc.DescribeVpcsTag
for key, value := range v.(map[string]interface{}) {
tags = append(tags, vpc.DescribeVpcsTag{
Key: key,
Value: value.(string),
})
}
request.Tag = &tags
}
if v, ok := d.GetOk("vpc_name"); ok {
request.VpcName = v.(string)
}
if v, ok := d.GetOk("vpc_owner_id"); ok {
request.VpcOwnerId = requests.NewInteger(v.(int))
}
var allVpcs []vpc.Vpc
invoker := NewInvoker()
for {
var raw interface{}
var err error
err = invoker.Run(func() error {
raw, err = client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeVpcs(request)
})
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return err
})
response, ok := raw.(*vpc.DescribeVpcsResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_vpcs", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
if len(response.Vpcs.Vpc) < 1 {
break
}
allVpcs = append(allVpcs, response.Vpcs.Vpc...)
if len(response.Vpcs.Vpc) < PageSizeLarge {
break
}
page, err := getNextpageNumber(request.PageNumber)
if err != nil {
return errmsgs.WrapError(err)
}
request.PageNumber = page
}
var filteredVpcs []vpc.Vpc
var route_tables []string
var r *regexp.Regexp
if nameRegex, ok := d.GetOk("name_regex"); ok && nameRegex.(string) != "" {
r = regexp.MustCompile(nameRegex.(string))
}
// ids
idsMap := make(map[string]string)
if v, ok := d.GetOk("ids"); ok {
for _, vv := range v.([]interface{}) {
idsMap[Trim(vv.(string))] = Trim(vv.(string))
}
}
for _, v := range allVpcs {
if r != nil && !r.MatchString(v.VpcName) {
continue
}
if len(idsMap) > 0 {
if _, ok := idsMap[v.VpcId]; !ok {
continue
}
}
if cidrBlock, ok := d.GetOk("cidr_block"); ok && v.CidrBlock != cidrBlock.(string) {
continue
}
if status, ok := d.GetOk("status"); ok && string(v.Status) != status.(string) {
continue
}
if isDefault, ok := d.GetOk("is_default"); ok && v.IsDefault != isDefault.(bool) {
continue
}
if vswitchId, ok := d.GetOk("vswitch_id"); ok && !vpcVswitchIdListContains(v.VSwitchIds.VSwitchId, vswitchId.(string)) {
continue
}
request := vpc.CreateDescribeVRoutersRequest()
client.InitRpcRequest(*request.RpcRequest)
request.VRouterId = v.VRouterId
var response *vpc.DescribeVRoutersResponse
var ok bool
wait := incrementalWait(1*time.Second, 1*time.Second)
err := resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeVRouters(request)
})
response, ok = raw.(*vpc.DescribeVRoutersResponse)
if err != nil {
if errmsgs.IsThrottling(err) {
wait()
return resource.RetryableError(err)
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_vpcs", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg))
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return nil
})
if err != nil {
return err
}
if len(response.VRouters.VRouter) > 0 {
route_tables = append(route_tables, response.VRouters.VRouter[0].RouteTableIds.RouteTableId[0])
} else {
route_tables = append(route_tables, "")
}
filteredVpcs = append(filteredVpcs, v)
}
return vpcsDecriptionAttributes(d, filteredVpcs, route_tables, meta)
}