2
0
almahmoud 7 жил өмнө
parent
commit
44336f7ef3

+ 38 - 0
cloudbridge/cloud/base/subservices.py

@@ -3,6 +3,7 @@ import logging
 from cloudbridge.cloud.interfaces.subservices import BucketObjectSubService
 from cloudbridge.cloud.interfaces.subservices import FloatingIPSubService
 from cloudbridge.cloud.interfaces.subservices import GatewaySubService
+from cloudbridge.cloud.interfaces.subservices import SubnetSubService
 from cloudbridge.cloud.interfaces.subservices import VMFirewallRuleSubService
 
 from .resources import BasePageableObjectMixin
@@ -128,3 +129,40 @@ class BaseFloatingIPSubService(FloatingIPSubService, BasePageableObjectMixin):
     def delete(self, fip):
         return self._provider.networking._floating_ips.delete(self.gateway,
                                                               fip)
+
+
+class BaseSubnetSubService(SubnetSubService, BasePageableObjectMixin):
+
+    def __init__(self, provider, network):
+        self.__provider = provider
+        self.network = network
+
+    @property
+    def _provider(self):
+        return self.__provider
+
+    def get(self, subnet_id):
+        sn = self._provider.networking.subnets.get(self.network, subnet_id)
+        if sn.network_id != self.network.id:
+            log.warning("The SubnetSubService nested in the network '{}' "
+                        "returned subnet '{}' which is attached to another "
+                        "network '{}'".format(str(self.network), str(sn),
+                                              str(sn.network)))
+        return sn
+
+    def list(self, limit=None, marker=None):
+        return self._provider.networking.subnets.list(network=self.network,
+                                                      limit=limit,
+                                                      marker=marker)
+
+    def find(self, **kwargs):
+        return self._provider.networking.subnets.find(network=self.network,
+                                                      **kwargs)
+
+    def create(self, label, cidr_block, zone):
+        return self._provider.networking.subnets.create(label,
+                                                        self.network,
+                                                        cidr_block, zone)
+
+    def delete(self, subnet):
+        return self._provider.networking.subnets.delete(subnet)

+ 81 - 0
cloudbridge/cloud/interfaces/subservices.py

@@ -318,3 +318,84 @@ class VMFirewallRuleSubService(PageableObjectMixin):
         :param rule_id: The VM firewall rule to be deleted.
         """
         pass
+
+
+class SubnetSubService(PageableObjectMixin):
+    """
+    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 subnet_id: ``str``
+        :param subnet_id: The ID of the Subnet to retrieve.
+
+        :rtype: ``object`` of :class:`.Subnet`
+        :return: a Subnet object
+        """
+        pass
+
+    @abstractmethod
+    def list(self, limit=None, marker=None):
+        """
+        List subnets within the network holding this subservice.
+
+        :rtype: ``list`` of :class:`.Subnet`
+        :return: list of Subnet objects
+        """
+        pass
+
+    @abstractmethod
+    def find(self, **kwargs):
+        """
+        Searches for a Subnet by a given list of attributes.
+
+        Supported attributes: label
+
+        Example:
+
+        .. code-block:: python
+
+            subnet = provider.networking.networks.get('id').subnets.find(
+                        label='my-subnet')
+
+
+        :rtype: List of ``object`` of :class:`.Subnet`
+        :return: A list of Subnet objects matching the supplied attributes.
+        """
+        pass
+
+    @abstractmethod
+    def create(self, label, cidr_block, zone):
+        """
+        Create a new subnet within the network holding this subservice.
+
+        :type label: ``str``
+        :param label: The subnet label.
+
+        :type cidr_block: ``str``
+        :param cidr_block: CIDR block within the Network to assign to the
+                           subnet.
+
+        :type zone: ``str``
+        :param zone: A placement zone for the subnet. Some providers
+                     may not support this, in which case the value is ignored.
+
+        :rtype: ``object`` of :class:`.Subnet`
+        :return:  A Subnet object
+        """
+        pass
+
+    @abstractmethod
+    def delete(self, subnet_id):
+        """
+        Delete an existing Subnet.
+
+        :type subnet_id: ``str``
+        :param subnet_id: The ID of the Subnet to be deleted.
+        """
+        pass

+ 4 - 2
cloudbridge/cloud/providers/aws/resources.py

@@ -40,6 +40,7 @@ from .helpers import trim_empty_params
 from .subservices import AWSBucketObjectSubService
 from .subservices import AWSFloatingIPSubService
 from .subservices import AWSGatewaySubService
+from .subservices import AWSSubnetSubService
 from .subservices import AWSVMFirewallRuleSubService
 
 log = logging.getLogger(__name__)
@@ -849,8 +850,9 @@ class AWSNetwork(BaseNetwork):
     def __init__(self, provider, network):
         super(AWSNetwork, self).__init__(provider)
         self._vpc = network
-        self._gtw_container = AWSGatewaySubService(provider, self)
         self._unknown_state = False
+        self._gtw_container = AWSGatewaySubService(provider, self)
+        self._subnet_svc = AWSSubnetSubService(provider, self)
 
     @property
     def id(self):
@@ -895,7 +897,7 @@ class AWSNetwork(BaseNetwork):
 
     @property
     def subnets(self):
-        return [AWSSubnet(self._provider, s) for s in self._vpc.subnets.all()]
+        return self._subnet_svc
 
     def refresh(self):
         try:

+ 8 - 2
cloudbridge/cloud/providers/aws/subservices.py

@@ -2,8 +2,8 @@ import logging
 
 from cloudbridge.cloud.base.subservices import BaseBucketObjectSubService
 from cloudbridge.cloud.base.subservices import BaseFloatingIPSubService
-from cloudbridge.cloud.base.subservices import \
-    BaseGatewaySubService
+from cloudbridge.cloud.base.subservices import BaseGatewaySubService
+from cloudbridge.cloud.base.subservices import BaseSubnetSubService
 from cloudbridge.cloud.base.subservices import BaseVMFirewallRuleSubService
 
 log = logging.getLogger(__name__)
@@ -31,3 +31,9 @@ class AWSFloatingIPSubService(BaseFloatingIPSubService):
 
     def __init__(self, provider, gateway):
         super(AWSFloatingIPSubService, self).__init__(provider, gateway)
+
+
+class AWSSubnetSubService(BaseSubnetSubService):
+
+    def __init__(self, provider, network):
+        super(AWSSubnetSubService, self).__init__(provider, network)

+ 3 - 5
cloudbridge/cloud/providers/azure/resources.py

@@ -45,6 +45,7 @@ from . import helpers as azure_helpers
 from .subservices import AzureBucketObjectSubService
 from .subservices import AzureFloatingIPSubService
 from .subservices import AzureGatewaySubService
+from .subservices import AzureSubnetSubService
 from .subservices import AzureVMFirewallRuleSubService
 
 log = logging.getLogger(__name__)
@@ -717,6 +718,7 @@ class AzureNetwork(BaseNetwork):
         if not self._network.tags:
             self._network.tags = {}
         self._gateway_service = AzureGatewaySubService(provider, self)
+        self._subnet_svc = AzureSubnetSubService(provider, self)
 
     @property
     def id(self):
@@ -794,11 +796,7 @@ class AzureNetwork(BaseNetwork):
 
     @property
     def subnets(self):
-        """
-        List all the subnets in this network
-        :return:
-        """
-        return self._provider.networking.subnets.list(network=self.id)
+        return self._subnet_svc
 
     def create_subnet(self, label, cidr_block, zone):
         """

+ 8 - 2
cloudbridge/cloud/providers/azure/subservices.py

@@ -1,9 +1,9 @@
 import logging
 
 from cloudbridge.cloud.base.subservices import BaseBucketObjectSubService
-from cloudbridge.cloud.base.subservices import \
-    BaseFloatingIPSubService
+from cloudbridge.cloud.base.subservices import BaseFloatingIPSubService
 from cloudbridge.cloud.base.subservices import BaseGatewaySubService
+from cloudbridge.cloud.base.subservices import BaseSubnetSubService
 from cloudbridge.cloud.base.subservices import BaseVMFirewallRuleSubService
 
 log = logging.getLogger(__name__)
@@ -30,3 +30,9 @@ class AzureFloatingIPSubService(BaseFloatingIPSubService):
 
     def __init__(self, provider, gateway):
         super(AzureFloatingIPSubService, self).__init__(provider, gateway)
+
+
+class AzureSubnetSubService(BaseSubnetSubService):
+
+    def __init__(self, provider, network):
+        super(AzureSubnetSubService, self).__init__(provider, network)

+ 3 - 1
cloudbridge/cloud/providers/gce/resources.py

@@ -47,6 +47,7 @@ from cloudbridge.cloud.interfaces.resources import VolumeState
 from . import helpers
 from .subservices import GCEFloatingIPSubService
 from .subservices import GCEGatewaySubService
+from .subservices import GCESubnetSubService
 from .subservices import GCEVMFirewallRuleSubService
 from .subservices import GCSBucketObjectSubService
 
@@ -1257,6 +1258,7 @@ class GCENetwork(BaseNetwork):
         super(GCENetwork, self).__init__(provider)
         self._network = network
         self._gateway_container = GCEGatewaySubService(provider, self)
+        self._subnet_svc = GCESubnetSubService(provider, self)
 
     @property
     def resource_url(self):
@@ -1307,7 +1309,7 @@ class GCENetwork(BaseNetwork):
 
     @property
     def subnets(self):
-        return list(self._provider.networking.subnets.iter(network=self))
+        return self._subnet_svc
 
     def create_subnet(self, label, cidr_block, zone):
         return self._provider.networking.subnets.create(

+ 8 - 2
cloudbridge/cloud/providers/gce/subservices.py

@@ -2,8 +2,8 @@ import logging
 
 from cloudbridge.cloud.base.subservices import BaseBucketObjectSubService
 from cloudbridge.cloud.base.subservices import BaseFloatingIPSubService
-from cloudbridge.cloud.base.subservices import \
-    BaseGatewaySubService
+from cloudbridge.cloud.base.subservices import BaseGatewaySubService
+from cloudbridge.cloud.base.subservices import BaseSubnetSubService
 from cloudbridge.cloud.base.subservices import BaseVMFirewallRuleSubService
 
 
@@ -31,3 +31,9 @@ class GCEFloatingIPSubService(BaseFloatingIPSubService):
 
     def __init__(self, provider, gateway):
         super(GCEFloatingIPSubService, self).__init__(provider, gateway)
+
+
+class GCESubnetSubService(BaseSubnetSubService):
+
+    def __init__(self, provider, network):
+        super(GCESubnetSubService, self).__init__(provider, network)

+ 6 - 6
cloudbridge/cloud/providers/openstack/resources.py

@@ -53,6 +53,7 @@ from cloudbridge.cloud.interfaces.resources import VolumeState
 from .subservices import OpenStackBucketObjectSubService
 from .subservices import OpenStackFloatingIPSubService
 from .subservices import OpenStackGatewaySubService
+from .subservices import OpenStackSubnetSubService
 from .subservices import OpenStackVMFirewallRuleSubService
 
 ONE_GIG = 1048576000  # in bytes
@@ -151,7 +152,7 @@ class OpenStackMachineImage(BaseMachineImage):
         image = self._provider.compute.images.get(self.id)
         if image:
             # pylint:disable=protected-access
-            self._os_image = image._os_image  # pylint:disable=protected-access
+            self._os_image = image._os_image
         else:
             # The image no longer exists and cannot be refreshed.
             # set the status to unknown
@@ -743,7 +744,7 @@ class OpenStackSnapshot(BaseSnapshot):
             self.id)
         if snap:
             # pylint:disable=protected-access
-            self._snapshot = snap._snapshot  # pylint:disable=protected-access
+            self._snapshot = snap._snapshot
         else:
             # The snapshot no longer exists and cannot be refreshed.
             # set the status to unknown
@@ -782,6 +783,7 @@ class OpenStackNetwork(BaseNetwork):
         super(OpenStackNetwork, self).__init__(provider)
         self._network = network
         self._gateway_service = OpenStackGatewaySubService(provider, self)
+        self._subnet_svc = OpenStackSubnetSubService(provider, self)
 
     @property
     def id(self):
@@ -796,7 +798,7 @@ class OpenStackNetwork(BaseNetwork):
         return self._network.get('name', None)
 
     @label.setter
-    def label(self, value):  # pylint:disable=arguments-differ
+    def label(self, value):
         """
         Set the network label.
         """
@@ -823,9 +825,7 @@ class OpenStackNetwork(BaseNetwork):
 
     @property
     def subnets(self):
-        subnets = (self._provider.neutron.list_subnets(network_id=self.id)
-                   .get('subnets', []))
-        return [OpenStackSubnet(self._provider, subnet) for subnet in subnets]
+        return self._subnet_svc
 
     def refresh(self):
         """Refresh the state of this network by re-querying the provider."""

+ 8 - 2
cloudbridge/cloud/providers/openstack/subservices.py

@@ -3,8 +3,8 @@ import logging
 from cloudbridge.cloud.base.subservices import BaseBucketObjectSubService
 from cloudbridge.cloud.base.subservices import BaseFloatingIPSubService
 from cloudbridge.cloud.base.subservices import BaseGatewaySubService
-from cloudbridge.cloud.base.subservices import \
-    BaseVMFirewallRuleSubService
+from cloudbridge.cloud.base.subservices import BaseSubnetSubService
+from cloudbridge.cloud.base.subservices import BaseVMFirewallRuleSubService
 
 
 log = logging.getLogger(__name__)
@@ -33,3 +33,9 @@ class OpenStackVMFirewallRuleSubService(BaseVMFirewallRuleSubService):
     def __init__(self, provider, firewall):
         super(OpenStackVMFirewallRuleSubService, self).__init__(
             provider, firewall)
+
+
+class OpenStackSubnetSubService(BaseSubnetSubService):
+
+    def __init__(self, provider, network):
+        super(OpenStackSubnetSubService, self).__init__(provider, network)