Changed the return type to a list of EC2Network objects Updated list/delete network tests
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/77770348 Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/77770348 Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/77770348 Branch: refs/heads/trunk Commit: 7777034875c8d09be6b20a1f3821c715fa1dad75 Parents: 6d6c2c7 Author: Chris DeRamus <[email protected]> Authored: Mon Dec 23 09:18:04 2013 -0500 Committer: Chris DeRamus <[email protected]> Committed: Mon Dec 23 09:18:04 2013 -0500 ---------------------------------------------------------------------- libcloud/compute/drivers/ec2.py | 144 ++++++++++++------- .../test/compute/fixtures/ec2/describe_vpcs.xml | 2 +- libcloud/test/compute/test_ec2.py | 22 +-- 3 files changed, 104 insertions(+), 64 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/77770348/libcloud/compute/drivers/ec2.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/ec2.py b/libcloud/compute/drivers/ec2.py index 9cc8281..bd25da7 100644 --- a/libcloud/compute/drivers/ec2.py +++ b/libcloud/compute/drivers/ec2.py @@ -503,6 +503,24 @@ class ExEC2AvailabilityZone(object): % (self.name, self.zone_state, self.region_name)) +class EC2Network(object): + """ + Represents information about a VPC (Virtual Private Cloud) network + + Note: This class is EC2 specific. + """ + + def __init__(self, id, name, cidr_block, extra=None): + self.id = id + self.name = name + self.cidr_block = cidr_block + self.extra = extra or {} + + def __repr__(self): + return (('<EC2Network: id=%s, name=%s') + % (self.id, self.name)) + + class BaseEC2NodeDriver(NodeDriver): """ Base Amazon EC2 node driver. @@ -720,6 +738,73 @@ class BaseEC2NodeDriver(NodeDriver): 'description': description, 'state': state}) + def _to_networks(self, response): + return [self._to_network(el) for el in response.findall( + fixxpath(xpath='vpcSet/item', namespace=NAMESPACE)) + ] + + def _to_network(self, element): + # Get the network id + vpc_id = findtext(element=element, + xpath='vpcId', + namespace=NAMESPACE) + + # Get our tag items + tag_items = findall(element=element, + xpath='tagSet/item', + namespace=NAMESPACE) + + # Loop through all tag items to build our dictionary + tags = {} + for tag in tag_items: + key = findtext(element=tag, + xpath='key', + namespace=NAMESPACE) + + value = findtext(element=tag, + xpath='value', + namespace=NAMESPACE) + + tags[key] = value + + # Set our name if the Name key/value if available + # If we don't get anything back then use the vpc_id + name = tags.get('Name', vpc_id) + + cidr_block = findtext(element=element, + xpath='cidrBlock', + namespace=NAMESPACE) + + # Build our extra attributes map + extra_attributes_map = { + 'state': { + 'xpath': 'state', + 'type': str + }, + 'dhcp_options_id': { + 'xpath': 'dhcpOptionsId', + 'type': str + }, + 'instance_tenancy': { + 'xpath': 'instanceTenancy', + 'type': str + }, + 'is_default': { + 'xpath': 'isDefault', + 'type': str + } + } + + # Define and build our extra dictionary + extra = {} + for attribute, values in extra_attributes_map.items(): + type_func = values['type'] + value = findattr(element=element, xpath=values['xpath'], + namespace=NAMESPACE) + extra[attribute] = type_func(value) + + return EC2Network(vpc_id, name, cidr_block, extra=extra) + def list_nodes(self, ex_node_ids=None): """ List all nodes @@ -1238,63 +1323,16 @@ class BaseEC2NodeDriver(NodeDriver): def ex_list_networks(self): """ - Return all private virtual private cloud (VPC) networks + Return a list of :class:`EC2Network` objects for the + current region. - :return: list of network dicts - :rtype: ``list`` + :rtype: ``list`` of :class:`EC2Network` """ params = {'Action': 'DescribeVpcs'} - result = self.connection.request(self.path, - params=params.copy()).object - - # The list which we return - networks = [] - for element in findall(element=result, - xpath='vpcSet/item', - namespace=NAMESPACE): - - # Get the network id - vpc_id = findtext(element=element, - xpath='vpcId', - namespace=NAMESPACE) - - # Get tags - 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)) - - # Set our name is the Name key/value if available - # If we don't get anything back then use the vpc_id - name = tags.get('Name', vpc_id) - - networks.append({'vpc_id': vpc_id, - 'name': name, - 'state': findtext(element=element, - xpath='state', - namespace=NAMESPACE), - 'cidr_block': findtext(element=element, - xpath='cidrBlock', - namespace=NAMESPACE), - 'dhcp_options_id': findtext(element=element, - xpath='dhcpOptionsId', - namespace=NAMESPACE), - 'tags': tags, - 'instance_tenancy': findtext(element=element, - xpath= - 'instance_tenancy', - namespace=NAMESPACE), - 'is_default': findtext(element=element, - xpath='isDefault', - namespace=NAMESPACE)}) - - return networks + return self._to_networks( + self.connection.request(self.path, params=params).object + ) def ex_create_network(self, cidr_block, name=None, instance_tenancy='default'): http://git-wip-us.apache.org/repos/asf/libcloud/blob/77770348/libcloud/test/compute/fixtures/ec2/describe_vpcs.xml ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/fixtures/ec2/describe_vpcs.xml b/libcloud/test/compute/fixtures/ec2/describe_vpcs.xml index ae1f516..0341edb 100644 --- a/libcloud/test/compute/fixtures/ec2/describe_vpcs.xml +++ b/libcloud/test/compute/fixtures/ec2/describe_vpcs.xml @@ -13,7 +13,7 @@ <item> <vpcId>vpc-62ded30e</vpcId> <state>available</state> - <cidrBlock>192.168.51.1/24</cidrBlock> + <cidrBlock>192.168.52.0/24</cidrBlock> <dhcpOptionsId>dopt-7eded312</dhcpOptionsId> <tagSet> <item> http://git-wip-us.apache.org/repos/asf/libcloud/blob/77770348/libcloud/test/compute/test_ec2.py ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/test_ec2.py b/libcloud/test/compute/test_ec2.py index 48aaf8d..10412cf 100644 --- a/libcloud/test/compute/test_ec2.py +++ b/libcloud/test/compute/test_ec2.py @@ -713,15 +713,17 @@ class EC2Tests(LibcloudTestCase, TestCaseMixin): self.assertEqual(len(vpcs), 2) - self.assertEqual('vpc-532335e1', vpcs[0]['vpc_id']) - self.assertEqual('available', vpcs[0]['state']) - self.assertEqual('dopt-7eded312', vpcs[0]['dhcp_options_id']) - self.assertEqual('vpc-532335e1', vpcs[0]['name']) - - self.assertEqual('vpc-62ded30e', vpcs[1]['vpc_id']) - self.assertEqual('available', vpcs[1]['state']) - self.assertEqual('dopt-7eded312', vpcs[1]['dhcp_options_id']) - self.assertEqual('Test VPC', vpcs[1]['name']) + self.assertEqual('vpc-532335e1', vpcs[0].id) + self.assertEqual('vpc-532335e1', vpcs[0].name) + self.assertEqual('192.168.51.0/24', vpcs[0].cidr_block) + self.assertEqual('available', vpcs[0].extra['state']) + self.assertEqual('dopt-7eded312', vpcs[0].extra['dhcp_options_id']) + + self.assertEqual('vpc-62ded30e', vpcs[1].id) + self.assertEqual('Test VPC', vpcs[1].name) + self.assertEqual('192.168.52.0/24', vpcs[1].cidr_block) + self.assertEqual('available', vpcs[1].extra['state']) + self.assertEqual('dopt-7eded312', vpcs[1].extra['dhcp_options_id']) def test_ex_create_network(self): vpc = self.driver.ex_create_network('192.168.55.0/24', @@ -736,7 +738,7 @@ class EC2Tests(LibcloudTestCase, TestCaseMixin): vpcs = self.driver.ex_list_networks() vpc = vpcs[0] - resp = self.driver.ex_destroy_network(vpc['vpc_id']) + resp = self.driver.ex_destroy_network(vpc.id) self.assertTrue(resp)
