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