Răsfoiți Sursa

Add support for filtering subnets for a specific network

Enis Afgan 10 ani în urmă
părinte
comite
729ee2e16a

+ 7 - 4
cloudbridge/cloud/interfaces/services.py

@@ -567,7 +567,7 @@ class SubnetService(PageableObjectMixin, CloudService):
         """
         Returns a Subnet given its ID or ``None`` if not found.
 
-        :type network_id: ``str``
+        :type network_id: :class:`.Network` object or ``str``
         :param network_id: The ID of the subnet to retrieve.
 
         :rtype: ``object`` of :class:`.Subnet`
@@ -576,11 +576,14 @@ class SubnetService(PageableObjectMixin, CloudService):
         pass
 
     @abstractmethod
-    def list(self, limit=None, marker=None):
+    def list(self, network=None, limit=None, marker=None):
         """
-        List all subnets.
+        List all subnets or filter them by the supplied network ID.
 
-        :rtype: ``list`` of :class:`.Network`
+        :type network: ``str``
+        :param network: Network object or ID with which to filter the subnets.
+
+        :rtype: ``list`` of :class:`.Subnet`
         :return: list of Subnet objects
         """
         pass

+ 7 - 2
cloudbridge/cloud/providers/aws/services.py

@@ -677,8 +677,13 @@ class AWSSubnetService(BaseSubnetService):
             return AWSSubnet(self.provider, subnets[0])
         return None
 
-    def list(self):
-        subnets = self.provider.vpc_conn.get_all_subnets()
+    def list(self, network=None):
+        fltr = None
+        if network:
+            network_id = (network.id if isinstance(network, AWSNetwork) else
+                          network)
+            fltr = {'vpc-id': network_id}
+        subnets = self.provider.vpc_conn.get_all_subnets(filters=fltr)
         return [AWSSubnet(self.provider, subnet) for subnet in subnets]
 
     def create(self, network, cidr_block, name=None):

+ 7 - 1
cloudbridge/cloud/providers/openstack/services.py

@@ -676,7 +676,13 @@ class OpenStackSubnetService(BaseSubnetService):
         subnet = (s for s in self.list() if s.id == subnet_id)
         return next(subnet, None)
 
-    def list(self):
+    def list(self, network=None):
+        if network:
+            network_id = (network.id if isinstance(network, OpenStackNetwork)
+                          else network)
+            subnets = self.list()
+            return [subnet for subnet in subnets if network_id in
+                    subnet.network_id]
         subnets = self.provider.neutron.list_subnets().get('subnets', [])
         return [OpenStackSubnet(self.provider, subnet) for subnet in subnets]
 

+ 1 - 1
test/test_network_service.py

@@ -41,7 +41,7 @@ class CloudNetworkServiceTestCase(ProviderTestBase):
                     self.provider.network.subnets.delete(subnet=subnet)
             ):
                 # test list method
-                subnetl = self.provider.network.subnets.list()
+                subnetl = self.provider.network.subnets.list(network=net)
                 list_subnetl = [n for n in subnetl if n.name == subnet_name]
                 self.assertTrue(
                     len(list_subnetl) == 1,