func dataSourceAlibabacloudStackVpcsRead()

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)
}