Author: tomaz
Date: Sun Jun 26 15:32:48 2011
New Revision: 1139816
URL: http://svn.apache.org/viewvc?rev=1139816&view=rev
Log:
pep8 style fixes.
Patch contributed by Wiktor as part of LIBCLOUD-84.
Modified:
libcloud/trunk/libcloud/compute/drivers/ec2.py
Modified: libcloud/trunk/libcloud/compute/drivers/ec2.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/ec2.py?rev=1139816&r1=1139815&r2=1139816&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/ec2.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/ec2.py Sun Jun 26 15:32:48 2011
@@ -31,7 +31,8 @@ from xml.etree import ElementTree as ET
from libcloud.utils import fixxpath, findtext, findattr, findall
from libcloud.common.base import ConnectionUserAndKey
from libcloud.common.aws import AWSBaseResponse
-from libcloud.common.types import InvalidCredsError, MalformedResponseError,
LibcloudError
+from libcloud.common.types import (InvalidCredsError, MalformedResponseError,
+ LibcloudError)
from libcloud.compute.providers import Provider
from libcloud.compute.types import NodeState
from libcloud.compute.base import Node, NodeDriver, NodeLocation, NodeSize
@@ -129,9 +130,9 @@ EC2_INSTANCE_TYPES = {
'disk': 1690,
'bandwidth': None
},
-}
+ }
-CLUSTER_INSTANCES_IDS = [ 'cg1.4xlarge', 'cc1.4xlarge' ]
+CLUSTER_INSTANCES_IDS = ['cg1.4xlarge', 'cc1.4xlarge']
EC2_US_EAST_INSTANCE_TYPES = dict(EC2_INSTANCE_TYPES)
EC2_US_WEST_INSTANCE_TYPES = dict(EC2_INSTANCE_TYPES)
@@ -139,6 +140,7 @@ EC2_EU_WEST_INSTANCE_TYPES = dict(EC2_IN
EC2_AP_SOUTHEAST_INSTANCE_TYPES = dict(EC2_INSTANCE_TYPES)
EC2_AP_NORTHEAST_INSTANCE_TYPES = dict(EC2_INSTANCE_TYPES)
+
class EC2NodeLocation(NodeLocation):
def __init__(self, id, name, country, driver, availability_zone):
super(EC2NodeLocation, self).__init__(id, name, country, driver)
@@ -150,10 +152,12 @@ class EC2NodeLocation(NodeLocation):
% (self.id, self.name, self.country,
self.availability_zone.name, self.driver.name))
+
class EC2Response(AWSBaseResponse):
"""
EC2 specific response parsing and error handling.
"""
+
def parse_error(self):
err_list = []
# Okay, so for Eucalyptus, you can get a 403, with no body,
@@ -165,7 +169,8 @@ class EC2Response(AWSBaseResponse):
try:
body = ET.XML(self.body)
except:
- raise MalformedResponseError("Failed to parse XML",
body=self.body, driver=EC2NodeDriver)
+ raise MalformedResponseError("Failed to parse XML",
+ body=self.body, driver=EC2NodeDriver)
for err in body.findall('Errors/Error'):
code, message = err.getchildren()
@@ -182,6 +187,7 @@ class EC2Response(AWSBaseResponse):
raise IdempotentParamError(err_list[-1])
return "\n".join(err_list)
+
class EC2Connection(ConnectionUserAndKey):
"""
Repersents a single connection to the EC2 Endpoint
@@ -197,7 +203,8 @@ class EC2Connection(ConnectionUserAndKey
params['Version'] = API_VERSION
params['Timestamp'] = time.strftime('%Y-%m-%dT%H:%M:%SZ',
time.gmtime())
- params['Signature'] = self._get_aws_auth_param(params, self.key,
self.action)
+ params['Signature'] = self._get_aws_auth_param(params, self.key,
+ self.action)
return params
def _get_aws_auth_param(self, params, secret_key, path='/'):
@@ -225,12 +232,14 @@ class EC2Connection(ConnectionUserAndKey
)
return b64_hmac
+
class ExEC2AvailabilityZone(object):
"""
Extension class which stores information about an EC2 availability zone.
Note: This class is EC2 specific.
"""
+
def __init__(self, name, zone_state, region_name):
self.name = name
self.zone_state = zone_state
@@ -241,6 +250,7 @@ class ExEC2AvailabilityZone(object):
'region_name=%s>')
% (self.name, self.zone_state, self.region_name))
+
class EC2NodeDriver(NodeDriver):
"""
Amazon EC2 node driver
@@ -281,19 +291,20 @@ class EC2NodeDriver(NodeDriver):
def _get_terminate_boolean(self, element):
status = element.findtext(".//{%s}%s" % (NAMESPACE, 'name'))
- return any([ term_status == status
- for term_status
- in ('shutting-down', 'terminated') ])
+ return any([term_status == status
+ for term_status
+ in ('shutting-down', 'terminated')])
def _to_nodes(self, object, xpath, groups=None):
- return [ self._to_node(el, groups=groups)
- for el in object.findall(fixxpath(xpath=xpath,
namespace=NAMESPACE)) ]
+ return [self._to_node(el, groups=groups)
+ for el in object.findall(fixxpath(xpath=xpath,
+ namespace=NAMESPACE))]
def _to_node(self, element, groups=None):
try:
state = self.NODE_STATE_MAP[
- findattr(element=element, xpath="instanceState/name",
- namespace=NAMESPACE)
+ findattr(element=element, xpath="instanceState/name",
+ namespace=NAMESPACE)
]
except KeyError:
state = NodeState.UNKNOWN
@@ -301,8 +312,10 @@ class EC2NodeDriver(NodeDriver):
instance_id = findtext(element=element, xpath='instanceId',
namespace=NAMESPACE)
tags = dict((findtext(element=item, xpath='key', namespace=NAMESPACE),
- findtext(element=item, xpath='value', namespace=NAMESPACE))
- for item in findall(element=element, xpath='tagSet/item',
namespace=NAMESPACE))
+ findtext(element=item, xpath='value',
+ namespace=NAMESPACE))
+ for item in findall(element=element, xpath='tagSet/item',
+ namespace=NAMESPACE))
name = tags.get('Name', instance_id)
@@ -322,43 +335,46 @@ class EC2NodeDriver(NodeDriver):
'instanceId': findattr(element=element, xpath="instanceId",
namespace=NAMESPACE),
'imageId': findattr(element=element, xpath="imageId",
- namespace=NAMESPACE),
- 'private_dns': findattr(element=element,
xpath="privateDnsName",
+ namespace=NAMESPACE),
+ 'private_dns': findattr(element=element,
+ xpath="privateDnsName",
namespace=NAMESPACE),
'status': findattr(element=element, xpath="instanceState/name",
namespace=NAMESPACE),
'keyname': findattr(element=element, xpath="keyName",
namespace=NAMESPACE),
- 'launchindex': findattr(element=element,
xpath="amiLaunchIndex",
+ 'launchindex': findattr(element=element,
+ xpath="amiLaunchIndex",
namespace=NAMESPACE),
'productcode':
[p.text for p in findall(element=element,
- xpath="productCodesSet/item/productCode",
- namespace=NAMESPACE
- )],
+ xpath="productCodesSet/item/productCode",
+ namespace=NAMESPACE
+ )],
'instancetype': findattr(element=element, xpath="instanceType",
namespace=NAMESPACE),
'launchdatetime': findattr(element=element, xpath="launchTime",
namespace=NAMESPACE),
- 'availability': findattr(element,
xpath="placement/availabilityZone",
+ 'availability': findattr(element,
+ xpath="placement/availabilityZone",
namespace=NAMESPACE),
'kernelid': findattr(element=element, xpath="kernelId",
namespace=NAMESPACE),
'ramdiskid': findattr(element=element, xpath="ramdiskId",
namespace=NAMESPACE),
- 'clienttoken' : findattr(element=element, xpath="clientToken",
- namespace=NAMESPACE),
+ 'clienttoken': findattr(element=element, xpath="clientToken",
+ namespace=NAMESPACE),
'groups': groups,
- 'tags': tags,
+ 'tags': tags
}
)
return n
def _to_images(self, object):
- return [ self._to_image(el)
- for el in object.findall(
- fixxpath(xpath='imagesSet/item', namespace=NAMESPACE)
- ) ]
+ return [self._to_image(el)
+ for el in object.findall(
+ fixxpath(xpath='imagesSet/item', namespace=NAMESPACE)
+ )]
def _to_image(self, element):
n = NodeImage(id=findtext(element=element, xpath='imageId',
@@ -369,14 +385,15 @@ class EC2NodeDriver(NodeDriver):
return n
def list_nodes(self):
- params = {'Action': 'DescribeInstances' }
- elem=self.connection.request(self.path, params=params).object
- nodes=[]
+ params = {'Action': 'DescribeInstances'}
+ elem = self.connection.request(self.path, params=params).object
+ nodes = []
for rs in findall(element=elem, xpath='reservationSet/item',
namespace=NAMESPACE):
- groups=[g.findtext('')
- for g in findall(element=rs,
xpath='groupSet/item/groupId',
- namespace=NAMESPACE)]
+ groups = [g.findtext('')
+ for g in findall(element=rs,
+ xpath='groupSet/item/groupId',
+ namespace=NAMESPACE)]
nodes += self._to_nodes(rs, 'instancesSet/item', groups)
nodes_elastic_ips_mappings = self.ex_describe_addresses(nodes)
@@ -385,19 +402,18 @@ class EC2NodeDriver(NodeDriver):
return nodes
def list_sizes(self, location=None):
- # Cluster instances are currently only available in the US - N.
Virginia Region
- include_cluser_instances = self.region_name == 'us-east-1'
- sizes = self._get_sizes(include_cluser_instances =
- include_cluser_instances)
-
+ # Cluster instances are currently only available
+ # in the US - N. Virginia Region
+ include_ci = self.region_name == 'us-east-1'
+ sizes = self._get_sizes(include_cluser_instances=include_ci)
return sizes
def _get_sizes(self, include_cluser_instances=False):
sizes = []
for key, values in self._instance_types.iteritems():
- if not include_cluser_instances and \
+ if not include_cluser_instances and\
key in CLUSTER_INSTANCES_IDS:
- continue
+ continue
attributes = copy.deepcopy(values)
attributes.update({'price': self._get_size_price(size_id=key)})
sizes.append(NodeSize(driver=self, **attributes))
@@ -412,7 +428,8 @@ class EC2NodeDriver(NodeDriver):
def list_locations(self):
locations = []
- for index, availability_zone in
enumerate(self.ex_list_availability_zones()):
+ for index, availability_zone in \
+ enumerate(self.ex_list_availability_zones()):
locations.append(EC2NodeLocation(index,
self.friendly_name,
self.country,
@@ -434,16 +451,16 @@ class EC2NodeDriver(NodeDriver):
params = {
'Action': 'CreateKeyPair',
'KeyName': name,
- }
+ }
response = self.connection.request(self.path, params=params).object
key_material = findtext(element=response, xpath='keyMaterial',
- namespace=NAMESPACE)
+ namespace=NAMESPACE)
key_fingerprint = findtext(element=response, xpath='keyFingerprint',
namespace=NAMESPACE)
return {
'keyMaterial': key_material,
'keyFingerprint': key_fingerprint,
- }
+ }
def ex_import_keypair(self, name, keyfile):
"""imports a new public key
@@ -469,13 +486,14 @@ class EC2NodeDriver(NodeDriver):
}
response = self.connection.request(self.path, params=params).object
- key_name = findtext(element=response, xpath='keyName',
namespace=NAMESPACE)
+ key_name = findtext(element=response, xpath='keyName',
+ namespace=NAMESPACE)
key_fingerprint = findtext(element=response, xpath='keyFingerprint',
namespace=NAMESPACE)
return {
- 'keyName': key_name,
- 'keyFingerprint': key_fingerprint,
- }
+ 'keyName': key_name,
+ 'keyFingerprint': key_fingerprint,
+ }
def ex_describe_keypairs(self, name):
"""Describes a keypiar by name
@@ -495,7 +513,7 @@ class EC2NodeDriver(NodeDriver):
key_name = findattr(element=response, xpath='keySet/item/keyName',
namespace=NAMESPACE)
return {
- 'keyName': key_name
+ 'keyName': key_name
}
def ex_create_security_group(self, name, description):
@@ -504,7 +522,8 @@ class EC2NodeDriver(NodeDriver):
@note: This is a non-standard extension API, and only works for EC2.
@type name: C{str}
- @param name: The name of the security group to Create. This must be
unique.
+ @param name: The name of the security group to Create.
+ This must be unique.
@type description: C{str}
@param description: Human readable description of a Security Group.
@@ -583,7 +602,8 @@ class EC2NodeDriver(NodeDriver):
params=params.copy()).object
availability_zones = []
- for element in findall(element=result,
xpath='availabilityZoneInfo/item',
+ for element in findall(element=result,
+ xpath='availabilityZoneInfo/item',
namespace=NAMESPACE):
name = findtext(element=element, xpath='zoneName',
namespace=NAMESPACE)
@@ -610,12 +630,12 @@ class EC2NodeDriver(NodeDriver):
@return dict Node tags
"""
- params = { 'Action': 'DescribeTags',
- 'Filter.0.Name': 'resource-id',
- 'Filter.0.Value.0': node.id,
- 'Filter.1.Name': 'resource-type',
- 'Filter.1.Value.0': 'instance',
- }
+ params = {'Action': 'DescribeTags',
+ 'Filter.0.Name': 'resource-id',
+ 'Filter.0.Value.0': node.id,
+ 'Filter.1.Name': 'resource-type',
+ 'Filter.1.Value.0': 'instance',
+ }
result = self.connection.request(self.path,
params=params.copy()).object
@@ -624,7 +644,8 @@ class EC2NodeDriver(NodeDriver):
for element in findall(element=result, xpath='tagSet/item',
namespace=NAMESPACE):
key = findtext(element=element, xpath='key', namespace=NAMESPACE)
- value = findtext(element=element, xpath='value',
namespace=NAMESPACE)
+ value = findtext(element=element,
+ xpath='value', namespace=NAMESPACE)
tags[key] = value
return tags
@@ -641,8 +662,8 @@ class EC2NodeDriver(NodeDriver):
if not tags:
return
- params = { 'Action': 'CreateTags',
- 'ResourceId.0': node.id }
+ params = {'Action': 'CreateTags',
+ 'ResourceId.0': node.id}
for i, key in enumerate(tags):
params['Tag.%d.Key' % i] = key
params['Tag.%d.Value' % i] = tags[key]
@@ -662,8 +683,8 @@ class EC2NodeDriver(NodeDriver):
if not tags:
return
- params = { 'Action': 'DeleteTags',
- 'ResourceId.0': node.id }
+ params = {'Action': 'DeleteTags',
+ 'ResourceId.0': node.id}
for i, key in enumerate(tags):
params['Tag.%d.Key' % i] = key
params['Tag.%d.Value' % i] = tags[key]
@@ -679,23 +700,24 @@ class EC2NodeDriver(NodeDriver):
@param nodes: List of C{Node} instances
@return dict Dictionary where a key is a node ID and the value is a
- list with the Elastic IP addresses associated with this
node.
+ list with the Elastic IP addresses associated with
+ this node.
"""
if not nodes:
return {}
- params = { 'Action': 'DescribeAddresses' }
+ params = {'Action': 'DescribeAddresses'}
if len(nodes) == 1:
- params.update({
- 'Filter.0.Name': 'instance-id',
- 'Filter.0.Value.0': nodes[0].id
- })
+ params.update({
+ 'Filter.0.Name': 'instance-id',
+ 'Filter.0.Value.0': nodes[0].id
+ })
result = self.connection.request(self.path,
params=params.copy()).object
- node_instance_ids = [ node.id for node in nodes ]
+ node_instance_ids = [node.id for node in nodes]
nodes_elastic_ip_mappings = {}
for node_id in node_instance_ids:
@@ -741,7 +763,7 @@ class EC2NodeDriver(NodeDriver):
attributes = attributes or {}
attributes.update({'InstanceId': node.id})
- params = { 'Action': 'ModifyInstanceAttribute' }
+ params = {'Action': 'ModifyInstanceAttribute'}
params.update(attributes)
result = self.connection.request(self.path,
@@ -767,9 +789,10 @@ class EC2NodeDriver(NodeDriver):
current_instance_type = node.extra['instancetype']
if current_instance_type == new_size.id:
- raise ValueError('New instance size is the same as the current
one')
+ raise ValueError('New instance size is the same as' +
+ 'the current one')
- attributes = { 'InstanceType.Value': new_size.id }
+ attributes = {'InstanceType.Value': new_size.id}
return self.ex_modify_instance_attribute(node, attributes)
def create_node(self, **kwargs):
@@ -801,8 +824,8 @@ class EC2NodeDriver(NodeDriver):
params = {
'Action': 'RunInstances',
'ImageId': image.id,
- 'MinCount': kwargs.get('ex_mincount','1'),
- 'MaxCount': kwargs.get('ex_maxcount','1'),
+ 'MinCount': kwargs.get('ex_mincount', '1'),
+ 'MaxCount': kwargs.get('ex_maxcount', '1'),
'InstanceType': size.id
}
@@ -810,15 +833,16 @@ class EC2NodeDriver(NodeDriver):
if not isinstance(kwargs['ex_securitygroup'], list):
kwargs['ex_securitygroup'] = [kwargs['ex_securitygroup']]
for sig in range(len(kwargs['ex_securitygroup'])):
- params['SecurityGroup.%d' % (sig+1,)] =
kwargs['ex_securitygroup'][sig]
+ params['SecurityGroup.%d' % (sig + 1,)] = \
+ kwargs['ex_securitygroup'][sig]
if 'location' in kwargs:
- availability_zone = getattr(kwargs['location'],
'availability_zone',
- None)
+ availability_zone = getattr(kwargs['location'],
+ 'availability_zone', None)
if availability_zone:
if availability_zone.region_name != self.region_name:
raise AttributeError('Invalid availability zone: %s'
- % (availability_zone.name))
+ % (availability_zone.name))
params['Placement.AvailabilityZone'] = availability_zone.name
if 'ex_keyname' in kwargs:
@@ -834,7 +858,7 @@ class EC2NodeDriver(NodeDriver):
nodes = self._to_nodes(object, 'instancesSet/item')
for node in nodes:
- tags = {'Name': kwargs['name']}
+ tags = {'Name': kwargs['name']}
self.ex_create_tags(node=node, tags=tags)
node.name = kwargs['name']
node.extra.update({'tags': tags})
@@ -862,19 +886,24 @@ class EC2NodeDriver(NodeDriver):
res = self.connection.request(self.path, params=params).object
return self._get_terminate_boolean(res)
+
class IdempotentParamError(LibcloudError):
"""
- Request used the same client token as a previous, but non-identical
request.
+ Request used the same client token as a previous,
+ but non-identical request.
"""
+
def __str__(self):
return repr(self.value)
+
class EC2EUConnection(EC2Connection):
"""
Connection class for EC2 in the Western Europe Region
"""
host = EC2_EU_WEST_HOST
+
class EC2EUNodeDriver(EC2NodeDriver):
"""
Driver class for EC2 in the Western Europe Region
@@ -888,6 +917,7 @@ class EC2EUNodeDriver(EC2NodeDriver):
connectionCls = EC2EUConnection
_instance_types = EC2_EU_WEST_INSTANCE_TYPES
+
class EC2USWestConnection(EC2Connection):
"""
Connection class for EC2 in the Western US Region
@@ -895,6 +925,7 @@ class EC2USWestConnection(EC2Connection)
host = EC2_US_WEST_HOST
+
class EC2USWestNodeDriver(EC2NodeDriver):
"""
Driver class for EC2 in the Western US Region
@@ -908,6 +939,7 @@ class EC2USWestNodeDriver(EC2NodeDriver)
connectionCls = EC2USWestConnection
_instance_types = EC2_US_WEST_INSTANCE_TYPES
+
class EC2APSEConnection(EC2Connection):
"""
Connection class for EC2 in the Southeast Asia Pacific Region
@@ -915,6 +947,7 @@ class EC2APSEConnection(EC2Connection):
host = EC2_AP_SOUTHEAST_HOST
+
class EC2APNEConnection(EC2Connection):
"""
Connection class for EC2 in the Northeast Asia Pacific Region
@@ -922,6 +955,7 @@ class EC2APNEConnection(EC2Connection):
host = EC2_AP_NORTHEAST_HOST
+
class EC2APSENodeDriver(EC2NodeDriver):
"""
Driver class for EC2 in the Southeast Asia Pacific Region
@@ -935,6 +969,7 @@ class EC2APSENodeDriver(EC2NodeDriver):
connectionCls = EC2APSEConnection
_instance_types = EC2_AP_SOUTHEAST_INSTANCE_TYPES
+
class EC2APNENodeDriver(EC2NodeDriver):
"""
Driver class for EC2 in the Northeast Asia Pacific Region
@@ -948,6 +983,7 @@ class EC2APNENodeDriver(EC2NodeDriver):
connectionCls = EC2APNEConnection
_instance_types = EC2_AP_NORTHEAST_INSTANCE_TYPES
+
class EucConnection(EC2Connection):
"""
Connection class for Eucalyptus
@@ -955,6 +991,7 @@ class EucConnection(EC2Connection):
host = None
+
class EucNodeDriver(EC2NodeDriver):
"""
Driver class for Eucalyptus
@@ -964,41 +1001,44 @@ class EucNodeDriver(EC2NodeDriver):
connectionCls = EucConnection
_instance_types = EC2_US_WEST_INSTANCE_TYPES
- def __init__(self, key, secret=None, secure=True, host=None, path=None,
port=None):
+ def __init__(self, key, secret=None, secure=True, host=None,
+ path=None, port=None):
super(EucNodeDriver, self).__init__(key, secret, secure, host, port)
if path is None:
path = "/services/Eucalyptus"
self.path = path
def list_locations(self):
- raise NotImplementedError, \
- 'list_locations not implemented for this driver'
+ raise NotImplementedError(
+ 'list_locations not implemented for this driver')
+
# Nimbus clouds have 3 EC2-style instance types but their particular RAM
# allocations are configured by the admin
NIMBUS_INSTANCE_TYPES = {
'm1.small': {
- 'id' : 'm1.small',
+ 'id': 'm1.small',
'name': 'Small Instance',
'ram': None,
'disk': None,
'bandwidth': None,
- },
+ },
'm1.large': {
- 'id' : 'm1.large',
+ 'id': 'm1.large',
'name': 'Large Instance',
'ram': None,
'disk': None,
'bandwidth': None,
- },
+ },
'm1.xlarge': {
- 'id' : 'm1.xlarge',
+ 'id': 'm1.xlarge',
'name': 'Extra Large Instance',
'ram': None,
'disk': None,
'bandwidth': None,
- },
-}
+ },
+ }
+
class NimbusConnection(EC2Connection):
"""
@@ -1007,6 +1047,7 @@ class NimbusConnection(EC2Connection):
host = None
+
class NimbusNodeDriver(EC2NodeDriver):
"""
Driver class for Nimbus