From 7bee747a7cd6488ff7995e531f283afb31301807 Mon Sep 17 00:00:00 2001 From: Lior Goikhburg Date: Thu, 15 May 2014 21:12:01 +0400 Subject: [PATCH 1/3] [LIBCLOUD-554] Add support for providing filters and VPC IDs --- libcloud/compute/drivers/ec2.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/libcloud/compute/drivers/ec2.py b/libcloud/compute/drivers/ec2.py index 494336936d..bacccf2382 100644 --- a/libcloud/compute/drivers/ec2.py +++ b/libcloud/compute/drivers/ec2.py @@ -2251,15 +2251,42 @@ def ex_register_image(self, name, description=None, architecture=None, ) return image - def ex_list_networks(self): + def ex_list_networks(self, network_ids=None, filters=None): """ Return a list of :class:`EC2Network` objects for the current region. + :param network_ids: One or more VPC IDs + :type network_ids: ``list`` + + :param filters: The filters so that the response includes + information for only certain VPCs + :type filters: ``dict`` + :rtype: ``list`` of :class:`EC2Network` """ params = {'Action': 'DescribeVpcs'} + if network_ids is not None: + for network_idx, network_id in enumerate(network_ids, 1): + network_key = 'VpcId.%s' % network_idx + params[network_key] = network_id + + if filters is not None: + for filter_idx, filter_data in enumerate(filters.items(), 1): + filter_name, filter_values = filter_data + filter_key = 'Filter.%s.Name' % filter_idx + params[filter_key] = filter_name + + if isinstance(filter_values, list): + for value_idx, value in enumerate(filter_values, 1): + value_key = 'Filter.%s.Value.%s' % (filter_idx, + value_idx) + params[value_key] = value + else: + value_key = 'Filter.%s.Value.1' % filter_idx + params[value_key] = filter_values + return self._to_networks( self.connection.request(self.path, params=params).object ) From d1e5caa77bbe2f3d147942e545b3e10678184b28 Mon Sep 17 00:00:00 2001 From: Lior Goikhburg Date: Fri, 16 May 2014 15:40:27 +0400 Subject: [PATCH 2/3] [LIBCLOUD-554] Fix compatibility with python 2.5. Add better docstring --- libcloud/compute/drivers/ec2.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/libcloud/compute/drivers/ec2.py b/libcloud/compute/drivers/ec2.py index bacccf2382..5d2ced3deb 100644 --- a/libcloud/compute/drivers/ec2.py +++ b/libcloud/compute/drivers/ec2.py @@ -2256,11 +2256,14 @@ def ex_list_networks(self, network_ids=None, filters=None): Return a list of :class:`EC2Network` objects for the current region. - :param network_ids: One or more VPC IDs + :param network_ids: Return only networks matching the provided + network IDs. If not specified, a list of all + the networks in the corresponding region + is returned. :type network_ids: ``list`` :param filters: The filters so that the response includes - information for only certain VPCs + information for only certain networks. :type filters: ``dict`` :rtype: ``list`` of :class:`EC2Network` @@ -2268,18 +2271,21 @@ def ex_list_networks(self, network_ids=None, filters=None): params = {'Action': 'DescribeVpcs'} if network_ids is not None: - for network_idx, network_id in enumerate(network_ids, 1): + for network_idx, network_id in enumerate(network_ids): + network_idx += 1 # We want 1-based indexes network_key = 'VpcId.%s' % network_idx params[network_key] = network_id if filters is not None: - for filter_idx, filter_data in enumerate(filters.items(), 1): + for filter_idx, filter_data in enumerate(filters.items()): + filter_idx += 1 # We want 1-based indexes filter_name, filter_values = filter_data filter_key = 'Filter.%s.Name' % filter_idx params[filter_key] = filter_name if isinstance(filter_values, list): - for value_idx, value in enumerate(filter_values, 1): + for value_idx, value in enumerate(filter_values): + value_idx += 1 # We want 1-based indexes value_key = 'Filter.%s.Value.%s' % (filter_idx, value_idx) params[value_key] = value From bb8d997cfe5931476e539cd88d333df0d7ed8a01 Mon Sep 17 00:00:00 2001 From: Lior Goikhburg Date: Fri, 16 May 2014 17:29:08 +0400 Subject: [PATCH 3/3] [LIBCLOUD-554] Add tests for VPC IDs and Filters --- libcloud/test/compute/test_ec2.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/libcloud/test/compute/test_ec2.py b/libcloud/test/compute/test_ec2.py index 0a2cf1eb28..b5267f4151 100644 --- a/libcloud/test/compute/test_ec2.py +++ b/libcloud/test/compute/test_ec2.py @@ -919,6 +919,25 @@ def test_ex_list_networks(self): self.assertEqual('available', vpcs[1].extra['state']) self.assertEqual('dopt-7eded312', vpcs[1].extra['dhcp_options_id']) + def test_ex_list_networks_network_ids(self): + network_ids = ['vpc-532335e1'] + vpcs = self.driver.ex_list_networks(network_ids=network_ids) + + # result should be one object + self.assertEqual(len(vpcs), 1) + # object id should match network id we requested + self.assertEqual('vpc-532335e1', vpcs[0].id) + + def test_ex_list_networks_network_filters(self): + filters = {'dhcp-options-id':'dopt-7eded312', # matches two networks + 'cidr': '192.168.51.0/24'} # matches one network + vpcs = self.driver.ex_list_networks(filters=filters) + + # result should be one object + self.assertEqual(len(vpcs), 1) + # object id should match network id with cidr we requested + self.assertEqual('vpc-532335e1', vpcs[0].id) + def test_ex_create_network(self): vpc = self.driver.ex_create_network('192.168.55.0/24', name='Test VPC',