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)
 
 

Reply via email to