# Copyright 2009-2014 Eucalyptus Systems, Inc.
#
# Redistribution and use of this software in source and binary forms,
# with or without modification, are permitted provided that the following
# conditions are met:
#
# Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from euca2ools.commands.ec2 import EC2Request
from requestbuilder import Arg, Filter, GenericTagFilter
class DescribeInstances(EC2Request):
DESCRIPTION = 'Show information about instances'
ARGS = [Arg('InstanceId', metavar='INSTANCE', nargs='*',
help='limit results to specific instances')]
FILTERS = [Filter('architecture', help='CPU architecture'),
Filter('association.allocation-id',
help='''[VPC only] allocation ID bound to a network
interface's elastic IP address'''),
Filter('association.association-id', help='''[VPC only]
association ID returned when an elastic IP was associated
with a network interface'''),
Filter('association.ip-owner-id',
help='''[VPC only] ID of the owner of the elastic IP
address associated with a network interface'''),
Filter('association.public-ip', help='''[VPC only] address of
the elastic IP address bound to a network interface'''),
Filter('availability-zone'),
Filter('block-device-mapping.attach-time',
help='volume attachment time'),
Filter('block-device-mapping.delete-on-termination',
help='''whether a volume is deleted upon instance
termination'''),
Filter('block-device-mapping.device-name',
help='volume device name (e.g. /dev/sdf)'),
Filter('block-device-mapping.status', help='volume status'),
Filter('block-device-mapping.volume-id', help='volume ID'),
Filter('client-token',
help='idempotency token provided at instance run time'),
Filter('dns-name', help='public DNS name'),
# EC2's documentation for "group-id" refers VPC users to
# "instance.group-id", while their documentation for the latter
# refers them to the former. Consequently, I'm not going to
# document a difference for either. They both seem to work for
# non-VPC instances.
Filter('group-id', help='security group ID'),
Filter('group-name', help='security group name'),
Filter('hypervisor', help='hypervisor type'),
Filter('iam-instance-profile.arn',
help="ARN of the instance's instance profile"),
Filter('image-id', help='machine image ID'),
Filter('instance.group-id', help='security group ID'),
Filter('instance.group-name', help='security group name'),
Filter('instance-id'),
Filter('instance-lifecycle',
help='whether this is a spot instance'),
Filter('instance-state-code', type=int,
help='numeric code identifying instance state'),
Filter('instance-state-name', help='instance state'),
Filter('instance-type'),
Filter('ip-address', help='public IP address'),
Filter('kernel-id', help='kernel image ID'),
Filter('key-name',
help='key pair name provided at instance launch time'),
Filter('launch-index',
help='launch index within a reservation'),
Filter('launch-time', help='instance launch time'),
Filter('monitoring-state',
help='monitoring state ("enabled" or "disabled")'),
Filter('network-interface.addresses.association.ip-owner-id',
help='''[VPC only] ID of the owner of the private IP
address associated with a network interface'''),
Filter('network-interface.addresses.association.public-ip',
help='''[VPC only] ID of the association of an elastic IP
address with a network interface'''),
Filter('network-interface.addresses.primary',
help='''[VPC only] whether the IP address of the VPC
network interface is the primary private IP address
("true" or "false")'''),
Filter('network-interface.addresses.private-ip-address',
help='''[VPC only] network interface's private IP
address'''),
Filter('network-interface.attachment.device-index', type=int,
help='''[VPC only] device index to which a network
interface is attached'''),
Filter('network-interface.attachment.attach-time',
help='''[VPC only] time a network interface was attached
to an instance'''),
Filter('network-interface.attachment.attachment-id',
help='''[VPC only] ID of a network interface's
attachment'''),
Filter('network-interface.attachment.delete-on-termination',
help='''[VPC only] whether a network interface attachment
is deleted when an instance is terminated ("true" or
"false")'''),
Filter('network-interface.attachment.instance-owner-id',
help='''[VPC only] ID of the instance to which a network
interface is attached'''),
Filter('network-interface.attachment.status',
help="[VPC only] network interface's attachment status"),
Filter('network-interface.availability-zone',
help="[VPC only] network interface's availability zone"),
Filter('network-interface.description',
help='[VPC only] description of a network interface'),
Filter('network-interface.group-id',
help="[VPC only] network interface's security group ID"),
Filter('network-interface.group-name', help='''[VPC only]
network interface's security group name'''),
Filter('network-interface.mac-address',
help="[VPC only] network interface's hardware address"),
Filter('network-interface.network-interface.id',
help='[VPC only] ID of a network interface'),
Filter('network-interface.owner-id',
help="[VPC only] ID of a network interface's owner"),
Filter('network-interface.private-dns-name',
help="[VPC only] network interface's private DNS name"),
Filter('network-interface.requester-id',
help="[VPC only] network interface's requester ID"),
Filter('network-interface.requester-managed',
help='''[VPC only] whether the network interface is
managed by the service'''),
Filter('network-interface.source-destination-check',
help='''[VPC only] whether source/destination checking is
enabled for a network interface ("true" or "false")'''),
Filter('network-interface.status',
help="[VPC only] network interface's status"),
Filter('network-interface.subnet-id',
help="[VPC only] ID of a network interface's subnet"),
Filter('network-interface.vpc-id',
help="[VPC only] ID of a network interface's VPC"),
Filter('owner-id', help="instance owner's account ID"),
Filter('placement-group-name'),
Filter('platform', help='"windows" for Windows instances'),
Filter('private-dns-name'),
Filter('private-ip-address'),
Filter('product-code'),
Filter('product-code.type',
help='type of product code ("devpay" or "marketplace")'),
Filter('ramdisk-id', help='ramdisk image ID'),
Filter('reason',
help="reason for the instance's current state"),
Filter('requester-id',
help='ID of the entity that launched an instance'),
Filter('reservation-id',
help='''ID of the instance's reservation'''),
Filter('root-device-name',
help='root device name (e.g. /dev/sda1)'),
Filter('root-device-type',
help='root device type ("ebs" or "instance-store")'),
Filter('spot-instance-request-id'),
Filter('state-reason-code',
help='reason code for the most recent state change'),
Filter('state-reason-message',
help='message describing the most recent state change'),
Filter('subnet-id',
help='[VPC only] ID of the subnet the instance is in'),
Filter('tag-key',
help='name of any tag assigned to the instance'),
Filter('tag-value',
help='value of any tag assigned to the instance'),
GenericTagFilter('tag:KEY',
help='specific tag key/value combination'),
Filter('virtualization-type'),
Filter('vpc-id',
help='[VPC only] ID of the VPC the instance is in')]
LIST_TAGS = ['reservationSet', 'instancesSet', 'groupSet', 'tagSet',
'blockDeviceMapping', 'productCodes', 'networkInterfaceSet',
'privateIpAddressesSet']
def print_result(self, result):
for reservation in result.get('reservationSet'):
self.print_reservation(reservation)