You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by be...@apache.org on 2011/06/05 10:34:13 UTC
svn commit: r1132067 [3/9] - in /incubator/mesos/trunk: ec2/
third_party/boto-1.8d/ third_party/boto-1.8d/bin/
third_party/boto-1.8d/boto.egg-info/ third_party/boto-1.8d/boto/
third_party/boto-1.8d/boto/cloudfront/ third_party/boto-1.8d/boto/contrib/
t...
Copied: incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/cloudwatch/__init__.py (from r1132066, incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/cloudwatch/__init__.py)
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/cloudwatch/__init__.py?p2=incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/cloudwatch/__init__.py&p1=incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/cloudwatch/__init__.py&r1=1132066&r2=1132067&rev=1132067&view=diff
==============================================================================
--- incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/cloudwatch/__init__.py (original)
+++ incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/cloudwatch/__init__.py Sun Jun 5 08:34:02 2011
@@ -172,12 +172,12 @@ class CloudWatchConnection(AWSQueryConne
"""
Get time-series data for one or more statistics of a given metric.
- @type measure_name: string
- @param measure_name: CPUUtilization|NetworkIO-in|NetworkIO-out|DiskIO-ALL-read|
+ :type measure_name: string
+ :param measure_name: CPUUtilization|NetworkIO-in|NetworkIO-out|DiskIO-ALL-read|
DiskIO-ALL-write|DiskIO-ALL-read-bytes|DiskIO-ALL-write-bytes
- @rtype: list
- @return: A list of L{Images<boto.ec2.image.Image>}
+ :rtype: list
+ :return: A list of :class:`boto.ec2.image.Image`
"""
params = {'Period' : period,
'MeasureName' : measure_name,
Copied: incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/cloudwatch/datapoint.py (from r1132066, incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/cloudwatch/datapoint.py)
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/cloudwatch/datapoint.py?p2=incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/cloudwatch/datapoint.py&p1=incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/cloudwatch/datapoint.py&r1=1132066&r2=1132067&rev=1132067&view=diff
==============================================================================
(empty)
Copied: incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/cloudwatch/metric.py (from r1132066, incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/cloudwatch/metric.py)
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/cloudwatch/metric.py?p2=incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/cloudwatch/metric.py&p1=incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/cloudwatch/metric.py&r1=1132066&r2=1132067&rev=1132067&view=diff
==============================================================================
(empty)
Added: incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/connection.py
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/connection.py?rev=1132067&view=auto
==============================================================================
--- incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/connection.py (added)
+++ incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/connection.py Sun Jun 5 08:34:02 2011
@@ -0,0 +1,1520 @@
+# Copyright (c) 2006-2009 Mitch Garnaat http://garnaat.org/
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish, dis-
+# tribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to the fol-
+# lowing conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+
+"""
+Represents a connection to the EC2 service.
+"""
+
+import urllib
+import xml.sax
+import base64
+import boto
+from boto import config
+from boto.connection import AWSQueryConnection
+from boto.resultset import ResultSet
+from boto.ec2.image import Image, ImageAttribute
+from boto.ec2.instance import Reservation, Instance, ConsoleOutput, InstanceAttribute
+from boto.ec2.keypair import KeyPair
+from boto.ec2.address import Address
+from boto.ec2.volume import Volume
+from boto.ec2.snapshot import Snapshot
+from boto.ec2.snapshot import SnapshotAttribute
+from boto.ec2.zone import Zone
+from boto.ec2.securitygroup import SecurityGroup
+from boto.ec2.regioninfo import RegionInfo
+from boto.ec2.instanceinfo import InstanceInfo
+from boto.ec2.reservedinstance import ReservedInstancesOffering, ReservedInstance
+from boto.ec2.spotinstancerequest import SpotInstanceRequest
+from boto.ec2.spotpricehistory import SpotPriceHistory
+from boto.ec2.spotdatafeedsubscription import SpotDatafeedSubscription
+from boto.ec2.launchspecification import LaunchSpecification
+from boto.exception import EC2ResponseError
+
+#boto.set_stream_logger('ec2')
+
+class EC2Connection(AWSQueryConnection):
+
+ APIVersion = boto.config.get('Boto', 'ec2_version', '2009-11-30')
+ DefaultRegionName = boto.config.get('Boto', 'ec2_region_name', 'us-east-1')
+ DefaultRegionEndpoint = boto.config.get('Boto', 'ec2_region_endpoint',
+ 'ec2.amazonaws.com')
+ SignatureVersion = '2'
+ ResponseError = EC2ResponseError
+
+ def __init__(self, aws_access_key_id=None, aws_secret_access_key=None,
+ is_secure=True, host=None, port=None, proxy=None, proxy_port=None,
+ proxy_user=None, proxy_pass=None, debug=0,
+ https_connection_factory=None, region=None, path='/'):
+ """
+ Init method to create a new connection to EC2.
+
+ B{Note:} The host argument is overridden by the host specified in the boto configuration file.
+ """
+ if not region:
+ region = RegionInfo(self, self.DefaultRegionName, self.DefaultRegionEndpoint)
+ self.region = region
+ AWSQueryConnection.__init__(self, aws_access_key_id,
+ aws_secret_access_key,
+ is_secure, port, proxy, proxy_port,
+ proxy_user, proxy_pass,
+ self.region.endpoint, debug,
+ https_connection_factory, path)
+
+ def get_params(self):
+ """
+ Returns a dictionary containing the value of of all of the keyword
+ arguments passed when constructing this connection.
+ """
+ param_names = ['aws_access_key_id', 'aws_secret_access_key', 'is_secure',
+ 'port', 'proxy', 'proxy_port', 'proxy_user', 'proxy_pass',
+ 'debug', 'https_connection_factory']
+ params = {}
+ for name in param_names:
+ params[name] = getattr(self, name)
+ return params
+
+ # Image methods
+
+ def get_all_images(self, image_ids=None, owners=None, executable_by=None):
+ """
+ Retrieve all the EC2 images available on your account.
+
+ :type image_ids: list
+ :param image_ids: A list of strings with the image IDs wanted
+
+ :type owners: list
+ :param owners: A list of owner IDs
+
+ :type executable_by:
+ :param executable_by:
+
+ :rtype: list
+ :return: A list of :class:`boto.ec2.image.Image`
+ """
+ params = {}
+ if image_ids:
+ self.build_list_params(params, image_ids, 'ImageId')
+ if owners:
+ self.build_list_params(params, owners, 'Owner')
+ if executable_by:
+ self.build_list_params(params, executable_by, 'ExecutableBy')
+ return self.get_list('DescribeImages', params, [('item', Image)])
+
+ def get_all_kernels(self, kernel_ids=None, owners=None):
+ """
+ Retrieve all the EC2 kernels available on your account. Simply filters the list returned
+ by get_all_images because EC2 does not provide a way to filter server-side.
+
+ :type kernel_ids: list
+ :param kernel_ids: A list of strings with the image IDs wanted
+
+ :type owners: list
+ :param owners: A list of owner IDs
+
+ :rtype: list
+ :return: A list of :class:`boto.ec2.image.Image`
+ """
+ rs = self.get_all_images(kernel_ids, owners)
+ kernels = []
+ for image in rs:
+ if image.type == 'kernel':
+ kernels.append(image)
+ return kernels
+
+ def get_all_ramdisks(self, ramdisk_ids=None, owners=None):
+ """
+ Retrieve all the EC2 ramdisks available on your account.
+ Simply filters the list returned by get_all_images because
+ EC2 does not provide a way to filter server-side.
+
+ :type ramdisk_ids: list
+ :param ramdisk_ids: A list of strings with the image IDs wanted
+
+ :type owners: list
+ :param owners: A list of owner IDs
+
+ :rtype: list
+ :return: A list of :class:`boto.ec2.image.Image`
+ """
+ rs = self.get_all_images(ramdisk_ids, owners)
+ ramdisks = []
+ for image in rs:
+ if image.type == 'ramdisk':
+ ramdisks.append(image)
+ return ramdisks
+
+ def get_image(self, image_id):
+ """
+ Shortcut method to retrieve a specific image (AMI).
+
+ :type image_id: string
+ :param image_id: the ID of the Image to retrieve
+
+ :rtype: :class:`boto.ec2.image.Image`
+ :return: The EC2 Image specified or None if the image is not found
+ """
+ try:
+ return self.get_all_images(image_ids=[image_id])[0]
+ except IndexError: # None of those images available
+ return None
+
+ def register_image(self, name, description=None, image_location=None,
+ architecture=None, kernel_id=None, ramdisk_id=None,
+ root_device_name=None, block_device_map=None):
+ """
+ Register an image.
+
+ :type name: string
+ :param name: The name of the AMI.
+
+ :type description: string
+ :param description: The description of the AMI.
+
+ :type image_location: string
+ :param image_location: Full path to your AMI manifest in Amazon S3 storage.
+ Only used for S3-based AMI's.
+
+ :type architecture: string
+ :param architecture: The architecture of the AMI. Valid choices are:
+ i386 | x86_64
+
+ :type kernel_id: string
+ :param kernel_id: The ID of the kernel with which to launch the instances
+
+ :type root_device_name: string
+ :param root_device_name: The root device name (e.g. /dev/sdh)
+
+ :type block_device_map: :class:`boto.ec2.blockdevicemapping.BlockDeviceMapping`
+ :param block_device_map: A BlockDeviceMapping data structure
+ describing the EBS volumes associated
+ with the Image.
+
+ :rtype: string
+ :return: The new image id
+ """
+ params = {'Name': name}
+ if description:
+ params['Description'] = description
+ if architecture:
+ params['Architecture'] = architecture
+ if kernel_id:
+ params['KernelId'] = kernel_id
+ if ramdisk_id:
+ params['RamdiskId'] = ramdisk_id
+ if image_location:
+ params['Location'] = image_location
+ if root_device_name:
+ params['RootDeviceName'] = root_device_name
+ if block_device_map:
+ block_device_map.build_list_params(params)
+ rs = self.get_object('RegisterImage', params, ResultSet)
+ image_id = getattr(rs, 'imageId', None)
+ return image_id
+
+ def deregister_image(self, image_id):
+ """
+ Unregister an AMI.
+
+ :type image_id: string
+ :param image_id: the ID of the Image to unregister
+
+ :rtype: bool
+ :return: True if successful
+ """
+ return self.get_status('DeregisterImage', {'ImageId':image_id})
+
+ def create_image(self, instance_id, name, description=None, no_reboot=False):
+ """
+ Will create an AMI from the instance in the running or stopped
+ state.
+
+ :type instance_id: string
+ :param instance_id: the ID of the instance to image.
+
+ :type name: string
+ :param name: The name of the new image
+
+ :type description: string
+ :param description: An optional human-readable string describing
+ the contents and purpose of the AMI.
+
+ :type no_reboot: bool
+ :param no_reboot: An optional flag indicating that the bundling process
+ should not attempt to shutdown the instance before
+ bundling. If this flag is True, the responsibility
+ of maintaining file system integrity is left to the
+ owner of the instance.
+
+ :rtype: string
+ :return: The new image id
+ """
+ params = {'InstanceId' : instance_id,
+ 'Name' : name}
+ if description:
+ params['Description'] = description
+ if no_reboot:
+ params['NoReboot'] = 'true'
+ rs = self.get_object('CreateImage', params, Image)
+ image_id = getattr(rs, 'imageId', None)
+ if not image_id:
+ image_id = getattr(rs, 'ImageId', None)
+ return image_id
+
+ # ImageAttribute methods
+
+ def get_image_attribute(self, image_id, attribute='launchPermission'):
+ """
+ Gets an attribute from an image.
+ See http://docs.amazonwebservices.com/AWSEC2/2008-02-01/DeveloperGuide/ApiReference-Query-DescribeImageAttribute.html
+
+ :type image_id: string
+ :param image_id: The Amazon image id for which you want info about
+
+ :type attribute: string
+ :param attribute: The attribute you need information about.
+ Valid choices are:
+ * launchPermission
+ * productCodes
+ * blockDeviceMapping
+
+ :rtype: :class:`boto.ec2.image.ImageAttribute`
+ :return: An ImageAttribute object representing the value of the attribute requested
+ """
+ params = {'ImageId' : image_id,
+ 'Attribute' : attribute}
+ return self.get_object('DescribeImageAttribute', params, ImageAttribute)
+
+ def modify_image_attribute(self, image_id, attribute='launchPermission',
+ operation='add', user_ids=None, groups=None,
+ product_codes=None):
+ """
+ Changes an attribute of an image.
+ See http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifyImageAttribute.html
+
+ :type image_id: string
+ :param image_id: The image id you wish to change
+
+ :type attribute: string
+ :param attribute: The attribute you wish to change
+
+ :type operation: string
+ :param operation: Either add or remove (this is required for changing launchPermissions)
+
+ :type user_ids: list
+ :param user_ids: The Amazon IDs of users to add/remove attributes
+
+ :type groups: list
+ :param groups: The groups to add/remove attributes
+
+ :type product_codes: list
+ :param product_codes: Amazon DevPay product code. Currently only one
+ product code can be associated with an AMI. Once
+ set, the product code cannot be changed or reset.
+ """
+ params = {'ImageId' : image_id,
+ 'Attribute' : attribute,
+ 'OperationType' : operation}
+ if user_ids:
+ self.build_list_params(params, user_ids, 'UserId')
+ if groups:
+ self.build_list_params(params, groups, 'UserGroup')
+ if product_codes:
+ self.build_list_params(params, product_codes, 'ProductCode')
+ return self.get_status('ModifyImageAttribute', params)
+
+ def reset_image_attribute(self, image_id, attribute='launchPermission'):
+ """
+ Resets an attribute of an AMI to its default value.
+ See http://docs.amazonwebservices.com/AWSEC2/2008-02-01/DeveloperGuide/ApiReference-Query-ResetImageAttribute.html
+
+ :type image_id: string
+ :param image_id: ID of the AMI for which an attribute will be described
+
+ :type attribute: string
+ :param attribute: The attribute to reset
+
+ :rtype: bool
+ :return: Whether the operation succeeded or not
+ """
+ params = {'ImageId' : image_id,
+ 'Attribute' : attribute}
+ return self.get_status('ResetImageAttribute', params)
+
+ # Instance methods
+
+ def get_all_instances(self, instance_ids=None):
+ """
+ Retrieve all the instances associated with your account.
+
+ :type instance_ids: list
+ :param instance_ids: A list of strings of instance IDs
+
+ :rtype: list
+ :return: A list of :class:`boto.ec2.instance.Reservation`
+ """
+ params = {}
+ if instance_ids:
+ self.build_list_params(params, instance_ids, 'InstanceId')
+ return self.get_list('DescribeInstances', params, [('item', Reservation)])
+
+ def run_instances(self, image_id, min_count=1, max_count=1,
+ key_name=None, security_groups=None,
+ user_data=None, addressing_type=None,
+ instance_type='m1.small', placement=None,
+ kernel_id=None, ramdisk_id=None,
+ monitoring_enabled=False, subnet_id=None,
+ block_device_map=None):
+ """
+ Runs an image on EC2.
+
+ :type image_id: string
+ :param image_id: The ID of the image to run
+
+ :type min_count: int
+ :param min_count: The minimum number of instances to launch
+
+ :type max_count: int
+ :param max_count: The maximum number of instances to launch
+
+ :type key_name: string
+ :param key_name: The name of the key pair with which to launch instances
+
+ :type security_groups: list of strings
+ :param security_groups: The names of the security groups with which to associate instances
+
+ :type user_data: string
+ :param user_data: The user data passed to the launched instances
+
+ :type instance_type: string
+ :param instance_type: The type of instance to run (m1.small, m1.large, m1.xlarge)
+
+ :type placement: string
+ :param placement: The availability zone in which to launch the instances
+
+ :type kernel_id: string
+ :param kernel_id: The ID of the kernel with which to launch the instances
+
+ :type ramdisk_id: string
+ :param ramdisk_id: The ID of the RAM disk with which to launch the instances
+
+ :type monitoring_enabled: bool
+ :param monitoring_enabled: Enable CloudWatch monitoring on the instance.
+
+ :type subnet_id: string
+ :param subnet_id: The subnet ID within which to launch the instances for VPC.
+
+ :type block_device_map: :class:`boto.ec2.blockdevicemapping.BlockDeviceMapping`
+ :param block_device_map: A BlockDeviceMapping data structure
+ describing the EBS volumes associated
+ with the Image.
+
+ :rtype: Reservation
+ :return: The :class:`boto.ec2.instance.Reservation` associated with the request for machines
+ """
+ params = {'ImageId':image_id,
+ 'MinCount':min_count,
+ 'MaxCount': max_count}
+ if key_name:
+ params['KeyName'] = key_name
+ if security_groups:
+ l = []
+ for group in security_groups:
+ if isinstance(group, SecurityGroup):
+ l.append(group.name)
+ else:
+ l.append(group)
+ self.build_list_params(params, l, 'SecurityGroup')
+ if user_data:
+ params['UserData'] = base64.b64encode(user_data)
+ if addressing_type:
+ params['AddressingType'] = addressing_type
+ if instance_type:
+ params['InstanceType'] = instance_type
+ if placement:
+ params['Placement.AvailabilityZone'] = placement
+ if kernel_id:
+ params['KernelId'] = kernel_id
+ if ramdisk_id:
+ params['RamdiskId'] = ramdisk_id
+ if monitoring_enabled:
+ params['Monitoring.Enabled'] = 'true'
+ if subnet_id:
+ params['SubnetId'] = subnet_id
+ if block_device_map:
+ block_device_map.build_list_params(params)
+ return self.get_object('RunInstances', params, Reservation, verb='POST')
+
+ def terminate_instances(self, instance_ids=None):
+ """
+ Terminate the instances specified
+
+ :type instance_ids: list
+ :param instance_ids: A list of strings of the Instance IDs to terminate
+
+ :rtype: list
+ :return: A list of the instances terminated
+ """
+ params = {}
+ if instance_ids:
+ self.build_list_params(params, instance_ids, 'InstanceId')
+ return self.get_list('TerminateInstances', params, [('item', Instance)])
+
+ def stop_instances(self, instance_ids=None):
+ """
+ Stop the instances specified
+
+ :type instance_ids: list
+ :param instance_ids: A list of strings of the Instance IDs to stop
+
+ :rtype: list
+ :return: A list of the instances stopped
+ """
+ params = {}
+ if instance_ids:
+ self.build_list_params(params, instance_ids, 'InstanceId')
+ return self.get_list('StopInstances', params, [('item', Instance)])
+
+ def start_instances(self, instance_ids=None):
+ """
+ Start the instances specified
+
+ :type instance_ids: list
+ :param instance_ids: A list of strings of the Instance IDs to start
+
+ :rtype: list
+ :return: A list of the instances started
+ """
+ params = {}
+ if instance_ids:
+ self.build_list_params(params, instance_ids, 'InstanceId')
+ return self.get_list('StartInstances', params, [('item', Instance)])
+
+ def get_console_output(self, instance_id):
+ """
+ Retrieves the console output for the specified instance.
+ See http://docs.amazonwebservices.com/AWSEC2/2008-02-01/DeveloperGuide/ApiReference-Query-GetConsoleOutput.html
+
+ :type instance_id: string
+ :param instance_id: The instance ID of a running instance on the cloud.
+
+ :rtype: :class:`boto.ec2.instance.ConsoleOutput`
+ :return: The console output as a ConsoleOutput object
+ """
+ params = {}
+ self.build_list_params(params, [instance_id], 'InstanceId')
+ return self.get_object('GetConsoleOutput', params, ConsoleOutput)
+
+ def reboot_instances(self, instance_ids=None):
+ """
+ Reboot the specified instances.
+
+ :type instance_ids: list
+ :param instance_ids: The instances to terminate and reboot
+ """
+ params = {}
+ if instance_ids:
+ self.build_list_params(params, instance_ids, 'InstanceId')
+ return self.get_status('RebootInstances', params)
+
+ def confirm_product_instance(self, product_code, instance_id):
+ params = {'ProductCode' : product_code,
+ 'InstanceId' : instance_id}
+ rs = self.get_object('ConfirmProductInstance', params, ResultSet)
+ return (rs.status, rs.ownerId)
+
+ # InstanceAttribute methods
+
+ def get_instance_attribute(self, instance_id, attribute):
+ """
+ Gets an attribute from an instance.
+
+ :type instance_id: string
+ :param instance_id: The Amazon id of the instance
+
+ :type attribute: string
+ :param attribute: The attribute you need information about
+ Valid choices are:
+ instanceType|kernel|ramdisk|userData|
+ disableApiTermination|
+ instanceInitiatedShutdownBehavior|
+ rootDeviceName|blockDeviceMapping
+
+ :rtype: :class:`boto.ec2.image.ImageAttribute`
+ :return: An ImageAttribute object representing the value of the attribute requested
+ """
+ params = {'InstanceId' : instance_id}
+ if attribute:
+ params['Attribute'] = attribute
+ return self.get_object('DescribeInstanceAttribute', params, InstanceAttribute)
+
+ def modify_image_attribute(self, image_id, attribute='launchPermission',
+ operation='add', user_ids=None, groups=None,
+ product_codes=None):
+ """
+ Changes an attribute of an image.
+ See http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ModifyImageAttribute.html
+
+ :type image_id: string
+ :param image_id: The image id you wish to change
+
+ :type attribute: string
+ :param attribute: The attribute you wish to change
+
+ :type operation: string
+ :param operation: Either add or remove (this is required for changing launchPermissions)
+
+ :type user_ids: list
+ :param user_ids: The Amazon IDs of users to add/remove attributes
+
+ :type groups: list
+ :param groups: The groups to add/remove attributes
+
+ :type product_codes: list
+ :param product_codes: Amazon DevPay product code. Currently only one
+ product code can be associated with an AMI. Once
+ set, the product code cannot be changed or reset.
+ """
+ params = {'ImageId' : image_id,
+ 'Attribute' : attribute,
+ 'OperationType' : operation}
+ if user_ids:
+ self.build_list_params(params, user_ids, 'UserId')
+ if groups:
+ self.build_list_params(params, groups, 'UserGroup')
+ if product_codes:
+ self.build_list_params(params, product_codes, 'ProductCode')
+ return self.get_status('ModifyImageAttribute', params)
+
+ def reset_image_attribute(self, image_id, attribute='launchPermission'):
+ """
+ Resets an attribute of an AMI to its default value.
+ See http://docs.amazonwebservices.com/AWSEC2/2008-02-01/DeveloperGuide/ApiReference-Query-ResetImageAttribute.html
+
+ :type image_id: string
+ :param image_id: ID of the AMI for which an attribute will be described
+
+ :type attribute: string
+ :param attribute: The attribute to reset
+
+ :rtype: bool
+ :return: Whether the operation succeeded or not
+ """
+ params = {'ImageId' : image_id,
+ 'Attribute' : attribute}
+ return self.get_status('ResetImageAttribute', params)
+
+ # Spot Instances
+
+ def get_all_spot_instance_requests(self, request_ids=None):
+ """
+ Retrieve all the spot instances requests associated with your account.
+
+ @type request_ids: list
+ @param request_ids: A list of strings of spot instance request IDs
+
+ @rtype: list
+ @return: A list of
+ :class:`boto.ec2.spotinstancerequest.SpotInstanceRequest`
+ """
+ params = {}
+ if request_ids:
+ self.build_list_params(params, request_ids, 'SpotInstanceRequestId')
+ return self.get_list('DescribeSpotInstanceRequests', params,
+ [('item', SpotInstanceRequest)])
+
+ def get_spot_price_history(self, start_time=None, end_time=None,
+ instance_type=None, product_description=None):
+ """
+ Retrieve the recent history of spot instances pricing.
+
+ @type start_time: str
+ @param start_time: An indication of how far back to provide price
+ changes for. An ISO8601 DateTime string.
+
+ @type end_time: str
+ @param end_time: An indication of how far forward to provide price
+ changes for. An ISO8601 DateTime string.
+
+ @type instance_type: str
+ @param instance_type: Filter responses to a particular instance type.
+
+ @type product_description: str
+ @param product_descripton: Filter responses to a particular platform.
+ Valid values are currently: Linux
+
+ @rtype: list
+ @return: A list tuples containing price and timestamp.
+ """
+ params = {}
+ if start_time:
+ params['StartTime'] = start_time
+ if end_time:
+ params['EndTime'] = end_time
+ if instance_type:
+ params['InstanceType'] = instance_type
+ if product_description:
+ params['ProductDescription'] = product_description
+ return self.get_list('DescribeSpotPriceHistory', params, [('item', SpotPriceHistory)])
+
+ def request_spot_instances(self, price, image_id, count=1, type=None,
+ valid_from=None, valid_until=None,
+ launch_group=None, availability_zone_group=None,
+ key_name=None, security_groups=None,
+ user_data=None, addressing_type=None,
+ instance_type='m1.small', placement=None,
+ kernel_id=None, ramdisk_id=None,
+ monitoring_enabled=False, subnet_id=None,
+ block_device_map=None):
+ """
+ Request instances on the spot market at a particular price.
+
+ :type price: str
+ :param price: The maximum price of your bid
+
+ :type image_id: string
+ :param image_id: The ID of the image to run
+
+ :type count: int
+ :param count: The of instances to requested
+
+ :type type: str
+ :param type: Type of request. Can be 'one-time' or 'persistent'.
+ Default is one-time.
+
+ :type valid_from: str
+ :param valid_from: Start date of the request. An ISO8601 time string.
+
+ :type valid_until: str
+ :param valid_until: End date of the request. An ISO8601 time string.
+
+ :type launch_group: str
+ :param launch_group: If supplied, all requests will be fulfilled
+ as a group.
+
+ :type availability_zone_group: str
+ :param availability_zone_group: If supplied, all requests will be fulfilled
+ within a single availability zone.
+
+ :type key_name: string
+ :param key_name: The name of the key pair with which to launch instances
+
+ :type security_groups: list of strings
+ :param security_groups: The names of the security groups with which to associate instances
+
+ :type user_data: string
+ :param user_data: The user data passed to the launched instances
+
+ :type instance_type: string
+ :param instance_type: The type of instance to run (m1.small, m1.large, m1.xlarge)
+
+ :type placement: string
+ :param placement: The availability zone in which to launch the instances
+
+ :type kernel_id: string
+ :param kernel_id: The ID of the kernel with which to launch the instances
+
+ :type ramdisk_id: string
+ :param ramdisk_id: The ID of the RAM disk with which to launch the instances
+
+ :type monitoring_enabled: bool
+ :param monitoring_enabled: Enable CloudWatch monitoring on the instance.
+
+ :type subnet_id: string
+ :param subnet_id: The subnet ID within which to launch the instances for VPC.
+
+ :type block_device_map: :class:`boto.ec2.blockdevicemapping.BlockDeviceMapping`
+ :param block_device_map: A BlockDeviceMapping data structure
+ describing the EBS volumes associated
+ with the Image.
+
+ :rtype: Reservation
+ :return: The :class:`boto.ec2.instance.Reservation` associated with the request for machines
+ """
+ params = {'LaunchSpecification.ImageId':image_id,
+ 'SpotPrice' : price}
+ if count:
+ params['InstanceCount'] = count
+ if valid_from:
+ params['ValidFrom'] = valid_from
+ if valid_until:
+ params['ValidUntil'] = valid_until
+ if launch_group:
+ params['LaunchGroup'] = launch_group
+ if availability_zone_group:
+ params['AvailabilityZoneGroup'] = availability_zone_group
+ if key_name:
+ params['LaunchSpecification.KeyName'] = key_name
+ if security_groups:
+ l = []
+ for group in security_groups:
+ if isinstance(group, SecurityGroup):
+ l.append(group.name)
+ else:
+ l.append(group)
+ self.build_list_params(params, l,
+ 'LaunchSpecification.SecurityGroup')
+ if user_data:
+ params['LaunchSpecification.UserData'] = base64.b64encode(user_data)
+ if addressing_type:
+ params['LaunchSpecification.AddressingType'] = addressing_type
+ if instance_type:
+ params['LaunchSpecification.InstanceType'] = instance_type
+ if placement:
+ params['LaunchSpecification.Placement.AvailabilityZone'] = placement
+ if kernel_id:
+ params['LaunchSpecification.KernelId'] = kernel_id
+ if ramdisk_id:
+ params['LaunchSpecification.RamdiskId'] = ramdisk_id
+ if monitoring_enabled:
+ params['LaunchSpecification.Monitoring.Enabled'] = 'true'
+ if subnet_id:
+ params['LaunchSpecification.SubnetId'] = subnet_id
+ if block_device_map:
+ block_device_map.build_list_params(params, 'LaunchSpecification.')
+ return self.get_list('RequestSpotInstances', params,
+ [('item', SpotInstanceRequest)],
+ verb='POST')
+
+
+ def cancel_spot_instance_requests(self, request_ids):
+ """
+ Cancel the specified Spot Instance Requests.
+
+ :type request_ids: list
+ :param request_ids: A list of strings of the Request IDs to terminate
+
+ :rtype: list
+ :return: A list of the instances terminated
+ """
+ params = {}
+ if request_ids:
+ self.build_list_params(params, request_ids, 'SpotInstanceRequestId')
+ return self.get_list('CancelSpotInstanceRequests', params, [('item', Instance)])
+
+ def get_spot_datafeed_subscription(self):
+ """
+ Return the current spot instance data feed subscription
+ associated with this account, if any.
+
+ :rtype: :class:`boto.ec2.spotdatafeedsubscription.SpotDatafeedSubscription
+ :return: The datafeed subscription object or None
+ """
+ return self.get_object('DescribeSpotDatafeedSubscription',
+ None, SpotDatafeedSubscription)
+
+ def create_spot_datafeed_subscription(self, bucket, prefix):
+ """
+ Create a spot instance datafeed subscription for this account.
+
+ :type bucket: str or unicode
+ :param bucket: The name of the bucket where spot instance data
+ will be written.
+
+ :type prefix: str or unicode
+ :param prefix: An optional prefix that will be pre-pended to all
+ data files written to the bucket.
+
+ :rtype: :class:`boto.ec2.spotdatafeedsubscription.SpotDatafeedSubscription
+ :return: The datafeed subscription object or None
+ """
+ params = {'Bucket' : bucket}
+ if prefix:
+ params['Prefix'] = prefix
+ return self.get_object('CreateSpotDatafeedSubscription',
+ params, SpotDatafeedSubscription)
+
+ def delete_spot_datafeed_subscription(self):
+ """
+ Delete the current spot instance data feed subscription
+ associated with this account
+
+ :rtype: bool
+ :return: True if successful
+ """
+ return self.get_status('DeleteSpotDatafeedSubscription', None)
+
+ # Zone methods
+
+ def get_all_zones(self, zones=None):
+ """
+ Get all Availability Zones associated with the current region.
+
+ :type zones: list
+ :param zones: Optional list of zones. If this list is present,
+ only the Zones associated with these zone names
+ will be returned.
+
+ :rtype: list of L{boto.ec2.zone.Zone}
+ :return: The requested Zone objects
+ """
+ params = {}
+ if zones:
+ self.build_list_params(params, zones, 'ZoneName')
+ return self.get_list('DescribeAvailabilityZones', params, [('item', Zone)])
+
+ # Address methods
+
+ def get_all_addresses(self, addresses=None):
+ """
+ Get all EIP's associated with the current credentials.
+
+ :type addresses: list
+ :param addresses: Optional list of addresses. If this list is present,
+ only the Addresses associated with these addresses
+ will be returned.
+
+ :rtype: list of L{boto.ec2.address.Address}
+ :return: The requested Address objects
+ """
+ params = {}
+ if addresses:
+ self.build_list_params(params, addresses, 'PublicIp')
+ return self.get_list('DescribeAddresses', params, [('item', Address)])
+
+ def allocate_address(self):
+ """
+ Allocate a new Elastic IP address and associate it with your account.
+
+ :rtype: L{boto.ec2.address.Address}
+ :return: The newly allocated Address
+ """
+ return self.get_object('AllocateAddress', None, Address)
+
+ def associate_address(self, instance_id, public_ip):
+ """
+ Associate an Elastic IP address with a currently running instance.
+
+ :type instance_id: string
+ :param instance_id: The ID of the instance
+
+ :type public_ip: string
+ :param public_ip: The public IP address
+
+ :rtype: bool
+ :return: True if successful
+ """
+ params = {'InstanceId' : instance_id, 'PublicIp' : public_ip}
+ return self.get_status('AssociateAddress', params)
+
+ def disassociate_address(self, public_ip):
+ """
+ Disassociate an Elastic IP address from a currently running instance.
+
+ :type public_ip: string
+ :param public_ip: The public IP address
+
+ :rtype: bool
+ :return: True if successful
+ """
+ params = {'PublicIp' : public_ip}
+ return self.get_status('DisassociateAddress', params)
+
+ def release_address(self, public_ip):
+ """
+ Free up an Elastic IP address
+
+ :type public_ip: string
+ :param public_ip: The public IP address
+
+ :rtype: bool
+ :return: True if successful
+ """
+ params = {'PublicIp' : public_ip}
+ return self.get_status('ReleaseAddress', params)
+
+ # Volume methods
+
+ def get_all_volumes(self, volume_ids=None):
+ """
+ Get all Volumes associated with the current credentials.
+
+ :type volume_ids: list
+ :param volume_ids: Optional list of volume ids. If this list is present,
+ only the volumes associated with these volume ids
+ will be returned.
+
+ :rtype: list of L{boto.ec2.volume.Volume}
+ :return: The requested Volume objects
+ """
+ params = {}
+ if volume_ids:
+ self.build_list_params(params, volume_ids, 'VolumeId')
+ return self.get_list('DescribeVolumes', params, [('item', Volume)])
+
+ def create_volume(self, size, zone, snapshot=None):
+ """
+ Create a new EBS Volume.
+
+ :type size: int
+ :param size: The size of the new volume, in GiB
+
+ :type zone: string or L{boto.ec2.zone.Zone}
+ :param zone: The availability zone in which the Volume will be created.
+
+ :type snapshot: string or L{boto.ec2.snapshot.Snapshot}
+ :param snapshot: The snapshot from which the new Volume will be created.
+ """
+ if isinstance(zone, Zone):
+ zone = zone.name
+ params = {'AvailabilityZone' : zone}
+ if size:
+ params['Size'] = size
+ if snapshot:
+ if isinstance(snapshot, Snapshot):
+ snapshot = snapshot.id
+ params['SnapshotId'] = snapshot
+ return self.get_object('CreateVolume', params, Volume)
+
+ def delete_volume(self, volume_id):
+ """
+ Delete an EBS volume.
+
+ :type volume_id: str
+ :param volume_id: The ID of the volume to be delete.
+
+ :rtype: bool
+ :return: True if successful
+ """
+ params = {'VolumeId': volume_id}
+ return self.get_status('DeleteVolume', params)
+
+ def attach_volume(self, volume_id, instance_id, device):
+ """
+ Attach an EBS volume to an EC2 instance.
+
+ :type volume_id: str
+ :param volume_id: The ID of the EBS volume to be attached.
+
+ :type instance_id: str
+ :param instance_id: The ID of the EC2 instance to which it will
+ be attached.
+
+ :type device: str
+ :param device: The device on the instance through which the
+ volume will be exposted (e.g. /dev/sdh)
+
+ :rtype: bool
+ :return: True if successful
+ """
+ params = {'InstanceId' : instance_id,
+ 'VolumeId' : volume_id,
+ 'Device' : device}
+ return self.get_status('AttachVolume', params)
+
+ def detach_volume(self, volume_id, instance_id=None, device=None, force=False):
+ """
+ Detach an EBS volume from an EC2 instance.
+
+ :type volume_id: str
+ :param volume_id: The ID of the EBS volume to be attached.
+
+ :type instance_id: str
+ :param instance_id: The ID of the EC2 instance from which it will
+ be detached.
+
+ :type device: str
+ :param device: The device on the instance through which the
+ volume is exposted (e.g. /dev/sdh)
+
+ :type force: bool
+ :param force: Forces detachment if the previous detachment attempt did
+ not occur cleanly. This option can lead to data loss or
+ a corrupted file system. Use this option only as a last
+ resort to detach a volume from a failed instance. The
+ instance will not have an opportunity to flush file system
+ caches nor file system meta data. If you use this option,
+ you must perform file system check and repair procedures.
+
+ :rtype: bool
+ :return: True if successful
+ """
+ params = {'VolumeId' : volume_id}
+ if instance_id:
+ params['InstanceId'] = instance_id
+ if device:
+ params['Device'] = device
+ if force:
+ params['Force'] = 'true'
+ return self.get_status('DetachVolume', params)
+
+ # Snapshot methods
+
+ def get_all_snapshots(self, snapshot_ids=None, owner=None, restorable_by=None):
+ """
+ Get all EBS Snapshots associated with the current credentials.
+
+ :type snapshot_ids: list
+ :param snapshot_ids: Optional list of snapshot ids. If this list is present,
+ only the Snapshots associated with these snapshot ids
+ will be returned.
+
+ :type owner: str
+ :param owner: If present, only the snapshots owned by the specified user
+ will be returned. Valid values are:
+ self | amazon | AWS Account ID
+
+ :type restorable_by: str
+ :param restorable_by: If present, only the snapshots that are restorable
+ by the specified account id will be returned.
+
+ :rtype: list of L{boto.ec2.snapshot.Snapshot}
+ :return: The requested Snapshot objects
+ """
+ params = {}
+ if snapshot_ids:
+ self.build_list_params(params, snapshot_ids, 'SnapshotId')
+ if owner:
+ params['Owner'] = owner
+ if restorable_by:
+ params['RestorableBy'] = restorable_by
+ return self.get_list('DescribeSnapshots', params, [('item', Snapshot)])
+
+ def create_snapshot(self, volume_id, description=None):
+ """
+ Create a snapshot of an existing EBS Volume.
+
+ :type volume_id: str
+ :param volume_id: The ID of the volume to be snapshot'ed
+
+ :type description: str
+ :param description: A description of the snapshot. Limited to 255 characters.
+
+ :rtype: bool
+ :return: True if successful
+ """
+ params = {'VolumeId' : volume_id}
+ if description:
+ params['Description'] = description[0:255]
+ return self.get_object('CreateSnapshot', params, Snapshot)
+
+ def delete_snapshot(self, snapshot_id):
+ params = {'SnapshotId': snapshot_id}
+ return self.get_status('DeleteSnapshot', params)
+
+ def get_snapshot_attribute(self, snapshot_id, attribute='createVolumePermission'):
+ """
+ Get information about an attribute of a snapshot. Only one attribute can be
+ specified per call.
+
+ :type snapshot_id: str
+ :param snapshot_id: The ID of the snapshot.
+
+ :type attribute: str
+ :param attribute: The requested attribute. Valid values are:
+ createVolumePermission
+
+ :rtype: list of L{boto.ec2.snapshotattribute.SnapshotAttribute}
+ :return: The requested Snapshot attribute
+ """
+ params = {'Attribute' : attribute}
+ if snapshot_id:
+ params['SnapshotId'] = snapshot_id
+ return self.get_object('DescribeSnapshotAttribute', params, SnapshotAttribute)
+
+ def modify_snapshot_attribute(self, snapshot_id, attribute='createVolumePermission',
+ operation='add', user_ids=None, groups=None):
+ """
+ Changes an attribute of an image.
+
+ :type snapshot_id: string
+ :param snapshot_id: The snapshot id you wish to change
+
+ :type attribute: string
+ :param attribute: The attribute you wish to change. Valid values are:
+ createVolumePermission
+
+ :type operation: string
+ :param operation: Either add or remove (this is required for changing
+ snapshot ermissions)
+
+ :type user_ids: list
+ :param user_ids: The Amazon IDs of users to add/remove attributes
+
+ :type groups: list
+ :param groups: The groups to add/remove attributes. The only valid
+ value at this time is 'all'.
+
+ """
+ params = {'SnapshotId' : snapshot_id,
+ 'Attribute' : attribute,
+ 'OperationType' : operation}
+ if user_ids:
+ self.build_list_params(params, user_ids, 'UserId')
+ if groups:
+ self.build_list_params(params, groups, 'UserGroup')
+ return self.get_status('ModifySnapshotAttribute', params)
+
+ def reset_snapshot_attribute(self, snapshot_id, attribute='createVolumePermission'):
+ """
+ Resets an attribute of a snapshot to its default value.
+
+ :type snapshot_id: string
+ :param snapshot_id: ID of the snapshot
+
+ :type attribute: string
+ :param attribute: The attribute to reset
+
+ :rtype: bool
+ :return: Whether the operation succeeded or not
+ """
+ params = {'SnapshotId' : snapshot_id,
+ 'Attribute' : attribute}
+ return self.get_status('ResetSnapshotAttribute', params)
+
+ # Keypair methods
+
+ def get_all_key_pairs(self, keynames=None):
+ """
+ Get all key pairs associated with your account.
+
+ :type keynames: list
+ :param keynames: A list of the names of keypairs to retrieve.
+ If not provided, all key pairs will be returned.
+
+ :rtype: list
+ :return: A list of :class:`boto.ec2.keypair.KeyPair`
+ """
+ params = {}
+ if keynames:
+ self.build_list_params(params, keynames, 'KeyName')
+ return self.get_list('DescribeKeyPairs', params, [('item', KeyPair)])
+
+ def get_key_pair(self, keyname):
+ """
+ Convenience method to retrieve a specific keypair (KeyPair).
+
+ :type image_id: string
+ :param image_id: the ID of the Image to retrieve
+
+ :rtype: :class:`boto.ec2.keypair.KeyPair`
+ :return: The KeyPair specified or None if it is not found
+ """
+ try:
+ return self.get_all_key_pairs(keynames=[keyname])[0]
+ except IndexError: # None of those key pairs available
+ return None
+
+ def create_key_pair(self, key_name):
+ """
+ Create a new key pair for your account.
+ This will create the key pair within the region you
+ are currently connected to.
+
+ :type key_name: string
+ :param key_name: The name of the new keypair
+
+ :rtype: :class:`boto.ec2.keypair.KeyPair`
+ :return: The newly created :class:`boto.ec2.keypair.KeyPair`.
+ The material attribute of the new KeyPair object
+ will contain the the unencrypted PEM encoded RSA private key.
+ """
+ params = {'KeyName':key_name}
+ return self.get_object('CreateKeyPair', params, KeyPair)
+
+ def delete_key_pair(self, key_name):
+ """
+ Delete a key pair from your account.
+
+ :type key_name: string
+ :param key_name: The name of the keypair to delete
+ """
+ params = {'KeyName':key_name}
+ return self.get_status('DeleteKeyPair', params)
+
+ # SecurityGroup methods
+
+ def get_all_security_groups(self, groupnames=None):
+ """
+ Get all security groups associated with your account in a region.
+
+ :type groupnames: list
+ :param groupnames: A list of the names of security groups to retrieve.
+ If not provided, all security groups will be returned.
+
+ :rtype: list
+ :return: A list of :class:`boto.ec2.securitygroup.SecurityGroup`
+ """
+ params = {}
+ if groupnames:
+ self.build_list_params(params, groupnames, 'GroupName')
+ return self.get_list('DescribeSecurityGroups', params, [('item', SecurityGroup)])
+
+ def create_security_group(self, name, description):
+ """
+ Create a new security group for your account.
+ This will create the security group within the region you
+ are currently connected to.
+
+ :type name: string
+ :param name: The name of the new security group
+
+ :type description: string
+ :param description: The description of the new security group
+
+ :rtype: :class:`boto.ec2.securitygroup.SecurityGroup`
+ :return: The newly created :class:`boto.ec2.keypair.KeyPair`.
+ """
+ params = {'GroupName':name, 'GroupDescription':description}
+ group = self.get_object('CreateSecurityGroup', params, SecurityGroup)
+ group.name = name
+ group.description = description
+ return group
+
+ def delete_security_group(self, name):
+ """
+ Delete a security group from your account.
+
+ :type key_name: string
+ :param key_name: The name of the keypair to delete
+ """
+ params = {'GroupName':name}
+ return self.get_status('DeleteSecurityGroup', params)
+
+ def authorize_security_group(self, group_name, src_security_group_name=None,
+ src_security_group_owner_id=None,
+ ip_protocol=None, from_port=None, to_port=None,
+ cidr_ip=None):
+ """
+ Add a new rule to an existing security group.
+ You need to pass in either src_security_group_name and
+ src_security_group_owner_id OR ip_protocol, from_port, to_port,
+ and cidr_ip. In other words, either you are authorizing another
+ group or you are authorizing some ip-based rule.
+
+ :type group_name: string
+ :param group_name: The name of the security group you are adding
+ the rule to.
+
+ :type src_security_group_name: string
+ :param src_security_group_name: The name of the security group you are
+ granting access to.
+
+ :type src_security_group_owner_id: string
+ :param src_security_group_owner_id: The ID of the owner of the security group you are
+ granting access to.
+
+ :type ip_protocol: string
+ :param ip_protocol: Either tcp | udp | icmp
+
+ :type from_port: int
+ :param from_port: The beginning port number you are enabling
+
+ :type to_port: int
+ :param to_port: The ending port number you are enabling
+
+ :type to_port: string
+ :param to_port: The CIDR block you are providing access to.
+ See http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing
+
+ :rtype: bool
+ :return: True if successful.
+ """
+ params = {'GroupName':group_name}
+ if src_security_group_name:
+ params['SourceSecurityGroupName'] = src_security_group_name
+ if src_security_group_owner_id:
+ params['SourceSecurityGroupOwnerId'] = src_security_group_owner_id
+ if ip_protocol:
+ params['IpProtocol'] = ip_protocol
+ if from_port:
+ params['FromPort'] = from_port
+ if to_port:
+ params['ToPort'] = to_port
+ if cidr_ip:
+ params['CidrIp'] = urllib.quote(cidr_ip)
+ return self.get_status('AuthorizeSecurityGroupIngress', params)
+
+ def revoke_security_group(self, group_name, src_security_group_name=None,
+ src_security_group_owner_id=None,
+ ip_protocol=None, from_port=None, to_port=None,
+ cidr_ip=None):
+ """
+ Remove an existing rule from an existing security group.
+ You need to pass in either src_security_group_name and
+ src_security_group_owner_id OR ip_protocol, from_port, to_port,
+ and cidr_ip. In other words, either you are revoking another
+ group or you are revoking some ip-based rule.
+
+ :type group_name: string
+ :param group_name: The name of the security group you are removing
+ the rule from.
+
+ :type src_security_group_name: string
+ :param src_security_group_name: The name of the security group you are
+ revoking access to.
+
+ :type src_security_group_owner_id: string
+ :param src_security_group_owner_id: The ID of the owner of the security group you are
+ revoking access to.
+
+ :type ip_protocol: string
+ :param ip_protocol: Either tcp | udp | icmp
+
+ :type from_port: int
+ :param from_port: The beginning port number you are disabling
+
+ :type to_port: int
+ :param to_port: The ending port number you are disabling
+
+ :type to_port: string
+ :param to_port: The CIDR block you are revoking access to.
+ See http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing
+
+ :rtype: bool
+ :return: True if successful.
+ """
+ params = {'GroupName':group_name}
+ if src_security_group_name:
+ params['SourceSecurityGroupName'] = src_security_group_name
+ if src_security_group_owner_id:
+ params['SourceSecurityGroupOwnerId'] = src_security_group_owner_id
+ if ip_protocol:
+ params['IpProtocol'] = ip_protocol
+ if from_port:
+ params['FromPort'] = from_port
+ if to_port:
+ params['ToPort'] = to_port
+ if cidr_ip:
+ params['CidrIp'] = cidr_ip
+ return self.get_status('RevokeSecurityGroupIngress', params)
+
+ #
+ # Regions
+ #
+
+ def get_all_regions(self):
+ """
+ Get all available regions for the EC2 service.
+
+ :rtype: list
+ :return: A list of :class:`boto.ec2.regioninfo.RegionInfo`
+ """
+ return self.get_list('DescribeRegions', None, [('item', RegionInfo)])
+
+ #
+ # Reservation methods
+ #
+
+ def get_all_reserved_instances_offerings(self, reserved_instances_id=None,
+ instance_type=None,
+ availability_zone=None,
+ product_description=None):
+ """
+ Describes Reserved Instance offerings that are available for purchase.
+
+ :type reserved_instances_id: str
+ :param reserved_instances_id: Displays Reserved Instances with the specified offering IDs.
+
+ :type instance_type: str
+ :param instance_type: Displays Reserved Instances of the specified instance type.
+
+ :type availability_zone: str
+ :param availability_zone: Displays Reserved Instances within the specified Availability Zone.
+
+ :type product_description: str
+ :param product_description: Displays Reserved Instances with the specified product description.
+
+ :rtype: list
+ :return: A list of :class:`boto.ec2.reservedinstance.ReservedInstancesOffering`
+ """
+ params = {}
+ if reserved_instances_id:
+ params['ReservedInstancesId'] = reserved_instances_id
+ if instance_type:
+ params['InstanceType'] = instance_type
+ if availability_zone:
+ params['AvailabilityZone'] = availability_zone
+ if product_description:
+ params['ProductDescription'] = product_description
+
+ return self.get_list('DescribeReservedInstancesOfferings',
+ params, [('item', ReservedInstancesOffering)])
+
+ def get_all_reserved_instances(self, reserved_instances_id=None):
+ """
+ Describes Reserved Instance offerings that are available for purchase.
+
+ :type reserved_instance_ids: list
+ :param reserved_instance_ids: A list of the reserved instance ids that will be returned.
+ If not provided, all reserved instances will be returned.
+
+ :rtype: list
+ :return: A list of :class:`boto.ec2.reservedinstance.ReservedInstance`
+ """
+ params = {}
+ if reserved_instances_id:
+ self.build_list_params(params, reserved_instances_id, 'ReservedInstancesId')
+ return self.get_list('DescribeReservedInstances',
+ params, [('item', ReservedInstance)])
+
+ def purchase_reserved_instance_offering(self, reserved_instances_offering_id,
+ instance_count=1):
+ """
+ Purchase a Reserved Instance for use with your account.
+ ** CAUTION **
+ This request can result in large amounts of money being charged to your
+ AWS account. Use with caution!
+
+ :type reserved_instances_offering_id: string
+ :param reserved_instances_offering_id: The offering ID of the Reserved
+ Instance to purchase
+
+ :type instance_count: int
+ :param instance_count: The number of Reserved Instances to purchase.
+ Default value is 1.
+
+ :rtype: :class:`boto.ec2.reservedinstance.ReservedInstance`
+ :return: The newly created Reserved Instance
+ """
+ params = {'ReservedInstancesOfferingId' : reserved_instances_offering_id,
+ 'InstanceCount' : instance_count}
+ return self.get_object('PurchaseReservedInstancesOffering', params, ReservedInstance)
+
+ #
+ # Monitoring
+ #
+
+ def monitor_instance(self, instance_id):
+ """
+ Enable CloudWatch monitoring for the supplied instance.
+
+ :type instance_id: string
+ :param instance_id: The instance id
+
+ :rtype: list
+ :return: A list of :class:`boto.ec2.instanceinfo.InstanceInfo`
+ """
+ params = {'InstanceId' : instance_id}
+ return self.get_list('MonitorInstances', params, [('item', InstanceInfo)])
+
+ def unmonitor_instance(self, instance_id):
+ """
+ Disable CloudWatch monitoring for the supplied instance.
+
+ :type instance_id: string
+ :param instance_id: The instance id
+
+ :rtype: list
+ :return: A list of :class:`boto.ec2.instanceinfo.InstanceInfo`
+ """
+ params = {'InstanceId' : instance_id}
+ return self.get_list('UnmonitorInstances', params, [('item', InstanceInfo)])
+
Copied: incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/ec2object.py (from r1132066, incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/ec2object.py)
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/ec2object.py?p2=incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/ec2object.py&p1=incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/ec2object.py&r1=1132066&r2=1132067&rev=1132067&view=diff
==============================================================================
(empty)
Copied: incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/__init__.py (from r1132066, incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/elb/__init__.py)
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/__init__.py?p2=incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/__init__.py&p1=incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/elb/__init__.py&r1=1132066&r2=1132067&rev=1132067&view=diff
==============================================================================
--- incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/elb/__init__.py (original)
+++ incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/__init__.py Sun Jun 5 08:34:02 2011
@@ -56,19 +56,20 @@ class ELBConnection(AWSQueryConnection):
for i in range(1, len(items)+1):
params[label % i] = items[i-1]
- def get_all_load_balancers(self, load_balancer_names=None):
+ def get_all_load_balancers(self, load_balancer_name=None):
"""
Retrieve all load balancers associated with your account.
- @type load_balancer_names: list
- @param load_balancer_names: A list of strings of load balancer names
+ :type load_balancer_names: str
+ :param load_balancer_names: An optional filter string to get only one ELB
- @rtype: list
- @return: A list of L{LoadBalancer<boto.ec2.elb.loadbalancer.LoadBalancer>}
+ :rtype: list
+ :return: A list of :class:`boto.ec2.elb.loadbalancer.LoadBalancer`
"""
params = {}
- if load_balancer_names:
- self.build_list_params(params, load_balancer_names, 'LoadBalancerName.%d')
+ if load_balancer_name:
+ #self.build_list_params(params, load_balancer_names, 'LoadBalancerName.%d')
+ params['LoadBalancerName'] = load_balancer_name
return self.get_list('DescribeLoadBalancers', params, [('member', LoadBalancer)])
@@ -76,21 +77,21 @@ class ELBConnection(AWSQueryConnection):
"""
Create a new load balancer for your account.
- @type name: string
- @param name: The mnemonic name associated with the new load balancer
+ :type name: string
+ :param name: The mnemonic name associated with the new load balancer
- @type zones: List of strings
- @param zones: The names of the availability zone(s) to add.
+ :type zones: List of strings
+ :param zones: The names of the availability zone(s) to add.
- @type listeners: List of tuples
- @param listeners: Each tuple contains three values.
+ :type listeners: List of tuples
+ :param listeners: Each tuple contains three values.
(LoadBalancerPortNumber, InstancePortNumber, Protocol)
where LoadBalancerPortNumber and InstancePortNumber are
integer values between 1 and 65535 and Protocol is a
string containing either 'TCP' or 'HTTP'.
- @rtype: L{AccessPoint<boto.ec2.elb.loadbalancer.LoadBalancer}
- @return: The newly created L{LoadBalancer<boto.ec2.elb.loadbalancer.LoadBalancer}
+ :rtype: :class:`boto.ec2.elb.loadbalancer.LoadBalancer`
+ :return: The newly created :class:`boto.ec2.elb.loadbalancer.LoadBalancer`
"""
params = {'LoadBalancerName' : name}
for i in range(0, len(listeners)):
@@ -108,8 +109,8 @@ class ELBConnection(AWSQueryConnection):
"""
Delete a Load Balancer from your account.
- @type name: string
- @param name: The name of the Load Balancer to delete
+ :type name: string
+ :param name: The name of the Load Balancer to delete
"""
params = {'LoadBalancerName': name}
return self.get_status('DeleteLoadBalancer', params)
@@ -121,14 +122,14 @@ class ELBConnection(AWSQueryConnection):
Adding zones that are already registered with the Load Balancer
has no effect.
- @type load_balancer_name: string
- @param load_balancer_name: The name of the Load Balancer
+ :type load_balancer_name: string
+ :param load_balancer_name: The name of the Load Balancer
- @type zones: List of strings
- @param zones: The name of the zone(s) to add.
+ :type zones: List of strings
+ :param zones: The name of the zone(s) to add.
- @rtype: List of strings
- @return: An updated list of zones for this Load Balancer.
+ :rtype: List of strings
+ :return: An updated list of zones for this Load Balancer.
"""
params = {'LoadBalancerName' : load_balancer_name}
@@ -143,14 +144,14 @@ class ELBConnection(AWSQueryConnection):
has no effect.
You cannot remove all zones from an Load Balancer.
- @type load_balancer_name: string
- @param load_balancer_name: The name of the Load Balancer
+ :type load_balancer_name: string
+ :param load_balancer_name: The name of the Load Balancer
- @type zones: List of strings
- @param zones: The name of the zone(s) to remove.
+ :type zones: List of strings
+ :param zones: The name of the zone(s) to remove.
- @rtype: List of strings
- @return: An updated list of zones for this Load Balancer.
+ :rtype: List of strings
+ :return: An updated list of zones for this Load Balancer.
"""
params = {'LoadBalancerName' : load_balancer_name}
@@ -161,14 +162,14 @@ class ELBConnection(AWSQueryConnection):
"""
Add new Instances to an existing Load Balancer.
- @type load_balancer_name: string
- @param load_balancer_name: The name of the Load Balancer
+ :type load_balancer_name: string
+ :param load_balancer_name: The name of the Load Balancer
- @type instances: List of strings
- @param instances: The instance ID's of the EC2 instances to add.
+ :type instances: List of strings
+ :param instances: The instance ID's of the EC2 instances to add.
- @rtype: List of strings
- @return: An updated list of instances for this Load Balancer.
+ :rtype: List of strings
+ :return: An updated list of instances for this Load Balancer.
"""
params = {'LoadBalancerName' : load_balancer_name}
@@ -179,14 +180,14 @@ class ELBConnection(AWSQueryConnection):
"""
Remove Instances from an existing Load Balancer.
- @type load_balancer_name: string
- @param load_balancer_name: The name of the Load Balancer
+ :type load_balancer_name: string
+ :param load_balancer_name: The name of the Load Balancer
- @type instances: List of strings
- @param instances: The instance ID's of the EC2 instances to remove.
+ :type instances: List of strings
+ :param instances: The instance ID's of the EC2 instances to remove.
- @rtype: List of strings
- @return: An updated list of instances for this Load Balancer.
+ :rtype: List of strings
+ :return: An updated list of instances for this Load Balancer.
"""
params = {'LoadBalancerName' : load_balancer_name}
@@ -197,16 +198,16 @@ class ELBConnection(AWSQueryConnection):
"""
Get current state of all Instances registered to an Load Balancer.
- @type load_balancer_name: string
- @param load_balancer_name: The name of the Load Balancer
+ :type load_balancer_name: string
+ :param load_balancer_name: The name of the Load Balancer
- @type instances: List of strings
- @param instances: The instance ID's of the EC2 instances
+ :type instances: List of strings
+ :param instances: The instance ID's of the EC2 instances
to return status for. If not provided,
the state of all instances will be returned.
- @rtype: List of L{InstanceState<boto.ec2.elb.instancestate.InstanceState>}
- @return: list of state info for instances in this Load Balancer.
+ :rtype: List of :class:`boto.ec2.elb.instancestate.InstanceState`
+ :return: list of state info for instances in this Load Balancer.
"""
params = {'LoadBalancerName' : load_balancer_name}
@@ -218,15 +219,15 @@ class ELBConnection(AWSQueryConnection):
"""
Define a health check for the EndPoints.
- @type name: string
- @param name: The mnemonic name associated with the new access point
+ :type name: string
+ :param name: The mnemonic name associated with the new access point
- @type health_check: L{HealthCheck<boto.ec2.elb.healthcheck.HealthCheck>}
- @param health_check: A HealthCheck object populated with the desired
+ :type health_check: :class:`boto.ec2.elb.healthcheck.HealthCheck`
+ :param health_check: A HealthCheck object populated with the desired
values.
- @rtype: L{HealthCheck<boto.ec2.elb.healthcheck.HealthCheck}
- @return: The updated L{HealthCheck<boto.ec2.elb.healthcheck.HealthCheck}
+ :rtype: :class:`boto.ec2.elb.healthcheck.HealthCheck`
+ :return: The updated :class:`boto.ec2.elb.healthcheck.HealthCheck`
"""
params = {'LoadBalancerName' : name,
'HealthCheck.Timeout' : health_check.timeout,
Copied: incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/healthcheck.py (from r1132066, incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/elb/healthcheck.py)
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/healthcheck.py?p2=incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/healthcheck.py&p1=incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/elb/healthcheck.py&r1=1132066&r2=1132067&rev=1132067&view=diff
==============================================================================
(empty)
Copied: incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/instancestate.py (from r1132066, incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/elb/instancestate.py)
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/instancestate.py?p2=incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/instancestate.py&p1=incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/elb/instancestate.py&r1=1132066&r2=1132067&rev=1132067&view=diff
==============================================================================
(empty)
Copied: incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/listelement.py (from r1132066, incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/elb/listelement.py)
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/listelement.py?p2=incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/listelement.py&p1=incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/elb/listelement.py&r1=1132066&r2=1132067&rev=1132067&view=diff
==============================================================================
(empty)
Copied: incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/listener.py (from r1132066, incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/elb/listener.py)
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/listener.py?p2=incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/listener.py&p1=incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/elb/listener.py&r1=1132066&r2=1132067&rev=1132067&view=diff
==============================================================================
(empty)
Copied: incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/loadbalancer.py (from r1132066, incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/elb/loadbalancer.py)
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/loadbalancer.py?p2=incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/loadbalancer.py&p1=incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/elb/loadbalancer.py&r1=1132066&r2=1132067&rev=1132067&view=diff
==============================================================================
--- incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/elb/loadbalancer.py (original)
+++ incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/elb/loadbalancer.py Sun Jun 5 08:34:02 2011
@@ -77,8 +77,8 @@ class LoadBalancer(object):
Enable availability zones to this Access Point.
All zones must be in the same region as the Access Point.
- @type zones: string or List of strings
- @param zones: The name of the zone(s) to add.
+ :type zones: string or List of strings
+ :param zones: The name of the zone(s) to add.
"""
if isinstance(zones, str) or isinstance(zones, unicode):
@@ -90,8 +90,8 @@ class LoadBalancer(object):
"""
Disable availability zones from this Access Point.
- @type zones: string or List of strings
- @param zones: The name of the zone(s) to add.
+ :type zones: string or List of strings
+ :param zones: The name of the zone(s) to add.
"""
if isinstance(zones, str) or isinstance(zones, unicode):
@@ -106,8 +106,8 @@ class LoadBalancer(object):
Adding endpoints that are already registered with the Load Balancer
has no effect.
- @type zones: string or List of instance id's
- @param zones: The name of the endpoint(s) to add.
+ :type zones: string or List of instance id's
+ :param zones: The name of the endpoint(s) to add.
"""
if isinstance(instances, str) or isinstance(instances, unicode):
@@ -121,8 +121,8 @@ class LoadBalancer(object):
Removing instances that are not registered with the Load Balancer
has no effect.
- @type zones: string or List of instance id's
- @param zones: The name of the endpoint(s) to add.
+ :type zones: string or List of instance id's
+ :param zones: The name of the endpoint(s) to add.
"""
if isinstance(instances, str) or isinstance(instances, unicode):
Copied: incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/image.py (from r1132066, incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/image.py)
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/image.py?p2=incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/image.py&p1=incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/image.py&r1=1132066&r2=1132067&rev=1132067&view=diff
==============================================================================
--- incubator/mesos/trunk/third_party/boto-1.8d/boto/ec2/image.py (original)
+++ incubator/mesos/trunk/third_party/boto-1.9b/boto/ec2/image.py Sun Jun 5 08:34:02 2011
@@ -20,7 +20,17 @@
# IN THE SOFTWARE.
from boto.ec2.ec2object import EC2Object
+from boto.ec2.blockdevicemapping import BlockDeviceMapping
+class ProductCodes(list):
+
+ def startElement(self, name, attrs, connection):
+ pass
+
+ def endElement(self, name, value, connection):
+ if name == 'productCode':
+ self.append(value)
+
class Image(EC2Object):
"""
Represents an EC2 Image
@@ -32,16 +42,32 @@ class Image(EC2Object):
self.location = None
self.state = None
self.ownerId = None
+ self.owner_alias = None
self.is_public = False
self.architecture = None
+ self.platform = None
self.type = None
self.kernel_id = None
self.ramdisk_id = None
- self.product_codes = []
+ self.name = None
+ self.description = None
+ self.product_codes = ProductCodes()
+ self.block_device_mapping = None
+ self.root_device_type = None
+ self.root_device_name = None
def __repr__(self):
return 'Image:%s' % self.id
+ def startElement(self, name, attrs, connection):
+ if name == 'blockDeviceMapping':
+ self.block_device_mapping = BlockDeviceMapping()
+ return self.block_device_mapping
+ elif name == 'productCodes':
+ return self.product_codes
+ else:
+ return None
+
def endElement(self, name, value, connection):
if name == 'imageId':
self.id = value
@@ -51,12 +77,6 @@ class Image(EC2Object):
self.state = value
elif name == 'imageOwnerId':
self.ownerId = value
- elif name == 'imageType':
- self.type = value
- elif name == 'kernelId':
- self.kernel_id = value
- elif name == 'ramdiskId':
- self.ramdisk_id = value
elif name == 'isPublic':
if value == 'false':
self.is_public = False
@@ -69,45 +89,82 @@ class Image(EC2Object):
self.id
)
)
- elif name == 'productCode':
- self.product_codes.append(value)
+ elif name == 'architecture':
+ self.architecture = value
+ elif name == 'imageType':
+ self.type = value
+ elif name == 'kernelId':
+ self.kernel_id = value
+ elif name == 'ramdiskId':
+ self.ramdisk_id = value
+ elif name == 'imageOwnerAlias':
+ self.owner_alias = value
+ elif name == 'platform':
+ self.platform = value
+ elif name == 'name':
+ self.name = value
+ elif name == 'description':
+ self.description = value
+ elif name == 'rootDeviceType':
+ self.root_device_type = value
+ elif name == 'rootDeviceName':
+ self.root_device_name = value
else:
setattr(self, name, value)
def run(self, min_count=1, max_count=1, key_name=None,
security_groups=None, user_data=None,
- addressing_type=None, instance_type='m1.small', placement=None):
+ addressing_type=None, instance_type='m1.small', placement=None,
+ kernel_id=None, ramdisk_id=None,
+ monitoring_enabled=False, subnet_id=None):
"""
Runs this instance.
- @type min_count: int
- @param min_count: The minimum number of instances to start
+ :type min_count: int
+ :param min_count: The minimum number of instances to start
+
+ :type max_count: int
+ :param max_count: The maximum number of instances to start
- @type max_count: int
- @param max_count: The maximum number of instances to start
+ :type key_name: string
+ :param key_name: The keypair to run this instance with.
- @type key_name: string
- @param key_name: The keypair to run this instance with.
+ :type security_groups:
+ :param security_groups:
- @type security_groups:
- @param security_groups:
+ :type user_data:
+ :param user_data:
- @type user_data:
- @param user_data:
+ :type addressing_type:
+ :param daddressing_type:
- @type addressing_type:
- @param daddressing_type:
+ :type instance_type: string
+ :param instance_type: The type of instance to run (m1.small, m1.large, m1.xlarge)
+
+ :type placement:
+ :param placement:
+
+ :type kernel_id: string
+ :param kernel_id: The ID of the kernel with which to launch the instances
- @type instance_type: string
- @param instance_type: The type of instance to run (m1.small, m1.large, m1.xlarge)
+ :type ramdisk_id: string
+ :param ramdisk_id: The ID of the RAM disk with which to launch the instances
- @type placement:
- @param placement:
+ :type monitoring_enabled: bool
+ :param monitoring_enabled: Enable CloudWatch monitoring on the instance.
+
+ :type subnet_id: string
+ :param subnet_id: The subnet ID within which to launch the instances for VPC.
+
+ :rtype: Reservation
+ :return: The :class:`boto.ec2.instance.Reservation` associated with the request for machines
"""
return self.connection.run_instances(self.id, min_count, max_count,
key_name, security_groups,
user_data, addressing_type,
- instance_type, placement)
+ instance_type, placement,
+ kernel_id, ramdisk_id,
+ monitoring_enabled, subnet_id)
def deregister(self):
return self.connection.deregister_image(self.id)
@@ -152,7 +209,11 @@ class ImageAttribute:
self.attrs = {}
def startElement(self, name, attrs, connection):
- return None
+ if name == 'blockDeviceMapping':
+ self.attrs['block_device_mapping'] = BlockDeviceMapping()
+ return self.attrs['block_device_mapping']
+ else:
+ return None
def endElement(self, name, value, connection):
if name == 'launchPermission':