input:b0003v0627p0001e0001-e0,1,2,3,4,k110,111,112,r8,a0,1,m4,lsfw
  #   ˆl–äY>”ÊeJuA3pÜjbÑ¿¿„Y?ÂÁ ,;    # 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'),
               F