func dataSourceAlibabacloudStackInstancesRead()

in alibabacloudstack/data_source_apsarastack_ecs_instances.go [195:335]


func dataSourceAlibabacloudStackInstancesRead(d *schema.ResourceData, meta interface{}) error {
	client := meta.(*connectivity.AlibabacloudStackClient)

	request := ecs.CreateDescribeInstancesRequest()
	client.InitRpcRequest(*request.RpcRequest)
	request.Status = d.Get("status").(string)

	if v, ok := d.GetOk("ids"); ok && len(v.([]interface{})) > 0 {
		request.InstanceIds = convertListToJsonString(v.([]interface{}))
	}
	if v, ok := d.GetOk("vpc_id"); ok && v.(string) != "" {
		request.VpcId = v.(string)
	}
	if v, ok := d.GetOk("vswitch_id"); ok && v.(string) != "" {
		request.VSwitchId = v.(string)
	}
	if v, ok := d.GetOk("availability_zone"); ok && v.(string) != "" {
		request.ZoneId = v.(string)
	}
	if v, ok := d.GetOk("tags"); ok {
		var tags []ecs.DescribeInstancesTag

		for key, value := range v.(map[string]interface{}) {
			tags = append(tags, ecs.DescribeInstancesTag{
				Key:   key,
				Value: value.(string),
			})
		}
		request.Tag = &tags
	}

	var allInstances []ecs.Instance
	request.PageSize = requests.NewInteger(PageSizeLarge)
	request.PageNumber = requests.NewInteger(1)

	for {
		raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
			return ecsClient.DescribeInstances(request)
		})
		bresponse, ok := raw.(*ecs.DescribeInstancesResponse)
		if err != nil {
			errmsg := ""
			if ok {
				errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
			}
			return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_instances", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
		}
		addDebug(request.GetActionName(), raw, request.RpcRequest, request)
		if len(bresponse.Instances.Instance) < 1 {
			break
		}

		allInstances = append(allInstances, bresponse.Instances.Instance...)

		if len(bresponse.Instances.Instance) < PageSizeLarge {
			break
		}

		if page, err := getNextpageNumber(request.PageNumber); err != nil {
			return errmsgs.WrapError(err)
		} else {
			request.PageNumber = page
		}
	}

	var filteredInstancesTemp []ecs.Instance

	nameRegex, ok := d.GetOk("name_regex")
	imageId, okImg := d.GetOk("image_id")
	if (ok && nameRegex.(string) != "") || (okImg && imageId.(string) != "") {
		var r *regexp.Regexp
		if nameRegex != "" {
			r = regexp.MustCompile(nameRegex.(string))
		}
		for _, inst := range allInstances {
			if r != nil && !r.MatchString(inst.InstanceName) {
				continue
			}
			if imageId.(string) != "" && inst.ImageId != imageId.(string) {
				continue
			}
			filteredInstancesTemp = append(filteredInstancesTemp, inst)
		}
	} else {
		filteredInstancesTemp = allInstances
	}
	// Filter by ram role name and fetch the instance role name
	instanceIds := make([]string, 0)
	for _, inst := range filteredInstancesTemp {
		if inst.InstanceNetworkType == "classic" {
			continue
		}
		instanceIds = append(instanceIds, inst.InstanceId)
	}
	instanceRoleNameMap := make(map[string]string)
	for index := 0; index < len(instanceIds); index += 100 {
		// DescribeInstanceRamRole parameter InstanceIds supports at most 100 items once
		request := ecs.CreateDescribeInstanceRamRoleRequest()
		client.InitRpcRequest(*request.RpcRequest)
		request.InstanceIds = convertListToJsonString(convertListStringToListInterface(instanceIds[index:IntMin(index+100, len(instanceIds))]))
		request.RamRoleName = d.Get("ram_role_name").(string)
		request.PageSize = requests.NewInteger(PageSizeLarge)
		request.PageNumber = requests.NewInteger(1)
		for {
			raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
				return ecsClient.DescribeInstanceRamRole(request)
			})
			bresponse, ok := raw.(*ecs.DescribeInstanceRamRoleResponse)
			if err != nil {
				errmsg := ""
				if ok {
					errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
				}
				return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_instances", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
			}
			addDebug(request.GetActionName(), raw, request.RpcRequest, request)
			if len(bresponse.InstanceRamRoleSets.InstanceRamRoleSet) < 1 {
				break
			}
			for _, role := range bresponse.InstanceRamRoleSets.InstanceRamRoleSet {
				instanceRoleNameMap[role.InstanceId] = role.RamRoleName
			}

			if len(bresponse.InstanceRamRoleSets.InstanceRamRoleSet) < PageSizeLarge {
				break
			}

			if page, err := getNextpageNumber(request.PageNumber); err != nil {
				return errmsgs.WrapError(err)
			} else {
				request.PageNumber = page
			}
		}
	}
	instanceDiskMappings, err := getInstanceDisksMappings(instanceRoleNameMap, meta)
	if err != nil {
		return errmsgs.WrapError(err)
	}

	return instancessDescriptionAttributes(d, filteredInstancesTemp, instanceRoleNameMap, instanceDiskMappings, meta)
}