Просмотр исходного кода

Create a SubnetService by moving subnet related methods out of the NetworkService; add SubnetService get method; update tests.

Enis Afgan 10 лет назад
Родитель
Сommit
371ea1b7c7

+ 8 - 0
cloudbridge/cloud/base/services.py

@@ -14,6 +14,7 @@ from cloudbridge.cloud.interfaces.services import RegionService
 from cloudbridge.cloud.interfaces.services import SecurityGroupService
 from cloudbridge.cloud.interfaces.services import SecurityService
 from cloudbridge.cloud.interfaces.services import SnapshotService
+from cloudbridge.cloud.interfaces.services import SubnetService
 from cloudbridge.cloud.interfaces.services import VolumeService
 from .resources import BasePageableObjectMixin
 
@@ -149,3 +150,10 @@ class BaseNetworkService(
         if network:
             network.delete()
         return True
+
+
+class BaseSubnetService(
+        BasePageableObjectMixin, SubnetService, BaseCloudService):
+
+    def __init__(self, provider):
+        super(BaseSubnetService, self).__init__(provider)

+ 52 - 9
cloudbridge/cloud/interfaces/services.py

@@ -532,20 +532,63 @@ class NetworkService(PageableObjectMixin, CloudService):
         """
         pass
 
+    @abstractproperty
+    def subnets(self):
+        """
+        Provides access to subnets.
+
+        Example:
+
+        .. code-block:: python
+
+            # Print all subnets
+            for s in provider.network.subnets:
+                print(s.id, s.name)
+
+            # Get subnet by ID
+            s = provider.network.subnets.get('subnet-id')
+            print(s.id, s.name)
+
+        :rtype: :class:`.SubnetService`
+        :return: a SubnetService object
+        """
+        pass
+
+
+class SubnetService(PageableObjectMixin, CloudService):
+
+    """
+    Base interface for a Subnet Service.
+    """
+    __metaclass__ = ABCMeta
+
+    @abstractmethod
+    def get(self, subnet_id):
+        """
+        Returns a Subnet given its ID or ``None`` if not found.
+
+        :type network_id: ``str``
+        :param network_id: The ID of the subnet to retrieve.
+
+        :rtype: ``object`` of :class:`.Subnet`
+        return: a Subnet object
+        """
+        pass
+
     @abstractmethod
-    def list_subnets(self):
+    def list(self, limit=None, marker=None):
         """
         List all subnets.
 
-        :rtype: list of :class:`.Subnet`
-        :return: A list of existing Subnet objects.
+        :rtype: ``list`` of :class:`.Network`
+        :return: list of Subnet objects
         """
         pass
 
     @abstractmethod
-    def create_subnet(self, network, cidr_block, name=None):
+    def create(self, network_id, cidr_block, name=None):
         """
-        Create a new network subnet.
+        Create a new subnet within the supplied network.
 
         :type network: :class:`.Network` object or ``str``
         :param network: Network object or ID under which to create the subnet.
@@ -564,12 +607,12 @@ class NetworkService(PageableObjectMixin, CloudService):
         pass
 
     @abstractmethod
-    def delete_subnet(self, subnet):
+    def delete(self, subnet):
         """
-        Delete a subnet.
+        Delete an existing Subnet.
 
-        :type network: :class:`.Subnet` object or ``str``
-        :param network: Subnet object or ID of the subnet to delete.
+        :type subnet: :class:`.Subnet` object or ``str``
+        :param subnet: Subnet object or ID of the subnet to delete.
 
         :rtype: ``bool``
         :return:  ``True`` if the subnet does not exist, ``False`` otherwise.

+ 21 - 3
cloudbridge/cloud/providers/aws/services.py

@@ -23,6 +23,7 @@ from cloudbridge.cloud.base.services import BaseRegionService
 from cloudbridge.cloud.base.services import BaseSecurityGroupService
 from cloudbridge.cloud.base.services import BaseSecurityService
 from cloudbridge.cloud.base.services import BaseSnapshotService
+from cloudbridge.cloud.base.services import BaseSubnetService
 from cloudbridge.cloud.base.services import BaseVolumeService
 from cloudbridge.cloud.interfaces.resources \
     import InvalidConfigurationException
@@ -636,6 +637,7 @@ class AWSNetworkService(BaseNetworkService):
 
     def __init__(self, provider):
         super(AWSNetworkService, self).__init__(provider)
+        self._subnet_svc = AWSSubnetService(self.provider)
 
     def get(self, network_id):
         network = self.provider.vpc_conn.get_all_vpcs(vpc_ids=[network_id])
@@ -659,11 +661,27 @@ class AWSNetworkService(BaseNetworkService):
             cb_network.name = name
         return cb_network
 
-    def list_subnets(self):
+    @property
+    def subnets(self):
+        return self._subnet_svc
+
+
+class AWSSubnetService(BaseSubnetService):
+
+    def __init__(self, provider):
+        super(AWSSubnetService, self).__init__(provider)
+
+    def get(self, subnet_id):
+        subnets = self.provider.vpc_conn.get_all_subnets([subnet_id])
+        if subnets:
+            return AWSSubnet(self.provider, subnets[0])
+        return None
+
+    def list(self):
         subnets = self.provider.vpc_conn.get_all_subnets()
         return [AWSSubnet(self.provider, subnet) for subnet in subnets]
 
-    def create_subnet(self, network, cidr_block, name=None):
+    def create(self, network, cidr_block, name=None):
         network_id = network.id if isinstance(network, AWSNetwork) else network
         subnet = self.provider.vpc_conn.create_subnet(network_id, cidr_block)
         cb_subnet = AWSSubnet(self.provider, subnet)
@@ -671,6 +689,6 @@ class AWSNetworkService(BaseNetworkService):
             cb_subnet.name = name
         return cb_subnet
 
-    def delete_subnet(self, subnet):
+    def delete(self, subnet):
         subnet_id = subnet.id if isinstance(subnet, AWSSubnet) else subnet
         return self.provider.vpc_conn.delete_subnet(subnet_id=subnet_id)

+ 19 - 3
cloudbridge/cloud/providers/openstack/services.py

@@ -21,6 +21,7 @@ from cloudbridge.cloud.base.services import BaseRegionService
 from cloudbridge.cloud.base.services import BaseSecurityGroupService
 from cloudbridge.cloud.base.services import BaseSecurityService
 from cloudbridge.cloud.base.services import BaseSnapshotService
+from cloudbridge.cloud.base.services import BaseSubnetService
 from cloudbridge.cloud.base.services import BaseVolumeService
 from cloudbridge.cloud.interfaces.resources import InstanceType
 from cloudbridge.cloud.interfaces.resources import KeyPair
@@ -643,6 +644,7 @@ class OpenStackNetworkService(BaseNetworkService):
 
     def __init__(self, provider):
         super(OpenStackNetworkService, self).__init__(provider)
+        self._subnet_svc = OpenStackSubnetService(self.provider)
 
     def get(self, network_id):
         network = (n for n in self.list() if n.id == network_id)
@@ -660,11 +662,25 @@ class OpenStackNetworkService(BaseNetworkService):
         network = self.provider.neutron.create_network({'network': net_info})
         return OpenStackNetwork(self.provider, network.get('network'))
 
-    def list_subnets(self):
+    @property
+    def subnets(self):
+        return self._subnet_svc
+
+
+class OpenStackSubnetService(BaseSubnetService):
+
+    def __init__(self, provider):
+        super(OpenStackSubnetService, self).__init__(provider)
+
+    def get(self, subnet_id):
+        subnet = (s for s in self.list() if s.id == subnet_id)
+        return next(subnet, None)
+
+    def list(self):
         subnets = self.provider.neutron.list_subnets().get('subnets', [])
         return [OpenStackSubnet(self.provider, subnet) for subnet in subnets]
 
-    def create_subnet(self, network, cidr_block, name=''):
+    def create(self, network, cidr_block, name=''):
         network_id = (network.id if isinstance(network, OpenStackNetwork)
                       else network)
         subnet_info = {'name': name, 'network_id': network_id,
@@ -673,7 +689,7 @@ class OpenStackNetworkService(BaseNetworkService):
                   .get('subnet'))
         return OpenStackSubnet(self.provider, subnet)
 
-    def delete_subnet(self, subnet):
+    def delete(self, subnet):
         subnet_id = (subnet.id if isinstance(subnet, OpenStackSubnet)
                      else subnet)
         self.provider.neutron.delete_subnet(subnet_id)

+ 4 - 4
test/test_network_service.py

@@ -34,21 +34,21 @@ class CloudNetworkServiceTestCase(ProviderTestBase):
                 .format(name))
 
             # check subnet
-            subnet = self.provider.network.create_subnet(
+            subnet = self.provider.network.subnets.create(
                 network=net, cidr_block="10.0.0.1/24", name=subnet_name)
             with helpers.cleanup_action(
                 lambda:
-                    self.provider.network.delete_subnet(subnet=subnet)
+                    self.provider.network.subnets.delete(subnet=subnet)
             ):
                 # test list method
-                subnetl = self.provider.network.list_subnets()
+                subnetl = self.provider.network.subnets.list()
                 list_subnetl = [n for n in subnetl if n.name == subnet_name]
                 self.assertTrue(
                     len(list_subnetl) == 1,
                     "List subnets does not return the expected subnet %s" %
                     subnet_name)
 
-            subnetl = self.provider.network.list_subnets()
+            subnetl = self.provider.network.subnets.list()
             found_subnet = [n for n in subnetl if n.name == subnet_name]
             self.assertTrue(
                 len(found_subnet) == 0,