func()

in internal/resources/providers/awslib/ec2/provider.go [468:511]


func (p *Provider) DescribeVolumes(ctx context.Context, instances []*Ec2Instance) ([]*Volume, error) {
	instanceFilter := lo.Map(instances, func(ins *Ec2Instance, _ int) string { return *ins.InstanceId })
	volumes, err := awslib.MultiRegionFetch(ctx, p.clients, func(ctx context.Context, region string, c Client) ([]*Volume, error) {
		input := &ec2.DescribeVolumesInput{
			Filters: []types.Filter{
				{
					Name:   aws.String("attachment.instance-id"),
					Values: instanceFilter,
				},
			},
		}
		allVolumes := []types.Volume{}
		for {
			output, err := c.DescribeVolumes(ctx, input)
			if err != nil {
				return nil, err
			}
			allVolumes = append(allVolumes, output.Volumes...)
			if output.NextToken == nil {
				break
			}
			input.NextToken = output.NextToken
		}

		var result []*Volume
		for _, vol := range allVolumes {
			if len(vol.Attachments) != 1 {
				p.log.Errorf("Volume %s has %d attachments", *vol.VolumeId, len(vol.Attachments))
				continue
			}

			result = append(result, &Volume{
				VolumeId:   *vol.VolumeId,
				Size:       int(*vol.Size),
				Region:     region,
				Encrypted:  *vol.Encrypted,
				InstanceId: *vol.Attachments[0].InstanceId,
				Device:     *vol.Attachments[0].Device,
			})
		}
		return result, nil
	})
	return lo.Flatten(volumes), err
}