Enis Afgan 9 лет назад
Родитель
Сommit
475ec0e12f

+ 12 - 0
cloudbridge/cloud/interfaces/resources.py

@@ -921,6 +921,18 @@ class Subnet(CloudResource):
         """
         """
         pass
         pass
 
 
+    @abstractproperty
+    def zone(self):
+        """
+        Placement zone of the subnet.
+
+        If the provider does not support subnet placement, return ``None``.
+
+        :rtype: :class:`.PlacementZone` object
+        :return: Placement zone of the subnet, or ``None`` if not defined.
+        """
+        pass
+
     @abstractmethod
     @abstractmethod
     def delete(self):
     def delete(self):
         """
         """

+ 5 - 1
cloudbridge/cloud/interfaces/services.py

@@ -676,7 +676,7 @@ class SubnetService(PageableObjectMixin, CloudService):
         pass
         pass
 
 
     @abstractmethod
     @abstractmethod
-    def create(self, network_id, cidr_block, name=None):
+    def create(self, network_id, cidr_block, name=None, zone=None):
         """
         """
         Create a new subnet within the supplied network.
         Create a new subnet within the supplied network.
 
 
@@ -691,6 +691,10 @@ class SubnetService(PageableObjectMixin, CloudService):
         :param name: An optional subnet name. The name will be set if the
         :param name: An optional subnet name. The name will be set if the
                      provider supports it.
                      provider supports it.
 
 
+        :type zone: ``str``
+        :param zone: An optional placement zone for the subnet. Some providers
+                     may not support this, in which case the value is ignored.
+
         :rtype: ``object`` of :class:`.Subnet`
         :rtype: ``object`` of :class:`.Subnet`
         :return:  A Subnet object
         :return:  A Subnet object
         """
         """

+ 7 - 0
cloudbridge/cloud/providers/aws/resources.py

@@ -27,6 +27,7 @@ from cloudbridge.cloud.interfaces.resources import NetworkState
 from cloudbridge.cloud.interfaces.resources import RouterState
 from cloudbridge.cloud.interfaces.resources import RouterState
 from cloudbridge.cloud.interfaces.resources import SnapshotState
 from cloudbridge.cloud.interfaces.resources import SnapshotState
 from cloudbridge.cloud.interfaces.resources import VolumeState
 from cloudbridge.cloud.interfaces.resources import VolumeState
+
 from datetime import datetime
 from datetime import datetime
 import hashlib
 import hashlib
 import inspect
 import inspect
@@ -34,6 +35,7 @@ import json
 
 
 from boto.exception import EC2ResponseError
 from boto.exception import EC2ResponseError
 from boto.s3.key import Key
 from boto.s3.key import Key
+
 from retrying import retry
 from retrying import retry
 
 
 
 
@@ -1009,6 +1011,11 @@ class AWSSubnet(BaseSubnet):
     def network_id(self):
     def network_id(self):
         return self._subnet.vpc_id
         return self._subnet.vpc_id
 
 
+    @property
+    def zone(self):
+        return AWSPlacementZone(self._provider, self._subnet.availability_zone,
+                                self._provider.region_name)
+
     def delete(self):
     def delete(self):
         return self._provider.vpc_conn.delete_subnet(subnet_id=self.id)
         return self._provider.vpc_conn.delete_subnet(subnet_id=self.id)
 
 

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

@@ -946,9 +946,10 @@ class AWSSubnetService(BaseSubnetService):
         subnets = self.provider.vpc_conn.get_all_subnets(filters=fltr)
         subnets = self.provider.vpc_conn.get_all_subnets(filters=fltr)
         return [AWSSubnet(self.provider, subnet) for subnet in subnets]
         return [AWSSubnet(self.provider, subnet) for subnet in subnets]
 
 
-    def create(self, network, cidr_block, name=None):
+    def create(self, network, cidr_block, name=None, zone=None):
         network_id = network.id if isinstance(network, AWSNetwork) else network
         network_id = network.id if isinstance(network, AWSNetwork) else network
-        subnet = self.provider.vpc_conn.create_subnet(network_id, cidr_block)
+        subnet = self.provider.vpc_conn.create_subnet(network_id, cidr_block,
+                                                      availability_zone=zone)
         cb_subnet = AWSSubnet(self.provider, subnet)
         cb_subnet = AWSSubnet(self.provider, subnet)
         if name:
         if name:
             time.sleep(2)  # The subnet does not always get created in time
             time.sleep(2)  # The subnet does not always get created in time

+ 9 - 0
cloudbridge/cloud/providers/openstack/resources.py

@@ -728,6 +728,15 @@ class OpenStackSubnet(BaseSubnet):
     def network_id(self):
     def network_id(self):
         return self._subnet.get('network_id', None)
         return self._subnet.get('network_id', None)
 
 
+    @property
+    def zone(self):
+        """
+        OpenStack does not have a notion of placement zone for subnets.
+
+        Default to None.
+        """
+        return None
+
     def delete(self):
     def delete(self):
         if self.id in str(self._provider.neutron.list_subnets()):
         if self.id in str(self._provider.neutron.list_subnets()):
             self._provider.neutron.delete_subnet(self.id)
             self._provider.neutron.delete_subnet(self.id)

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

@@ -811,7 +811,8 @@ class OpenStackSubnetService(BaseSubnetService):
         subnets = self.provider.neutron.list_subnets().get('subnets', [])
         subnets = self.provider.neutron.list_subnets().get('subnets', [])
         return [OpenStackSubnet(self.provider, subnet) for subnet in subnets]
         return [OpenStackSubnet(self.provider, subnet) for subnet in subnets]
 
 
-    def create(self, network, cidr_block, name=''):
+    def create(self, network, cidr_block, name='', zone=None):
+        """zone param is ignored."""
         network_id = (network.id if isinstance(network, OpenStackNetwork)
         network_id = (network.id if isinstance(network, OpenStackNetwork)
                       else network)
                       else network)
         subnet_info = {'name': name, 'network_id': network_id,
         subnet_info = {'name': name, 'network_id': network_id,