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

Updated interfaces and aws to use provider zone

Nuwan Goonasekera 7 лет назад
Родитель
Сommit
eb2a45ed83

+ 14 - 1
cloudbridge/cloud/base/provider.py

@@ -89,6 +89,19 @@ class BaseCloudProvider(CloudProvider):
         self._config_parser.read(CloudBridgeConfigLocations)
         self._middleware = SimpleMiddlewareManager()
         self.add_required_middleware()
+        self._region_name = None
+        self._zone_name = None
+
+    @property
+    def region_name(self):
+        return self._region_name
+
+    @property
+    def zone_name(self):
+        if not self._zone_name:
+            region = self.compute.regions.get(self.region_name)
+            self._zone_name = next(region.zones)
+        return self._zone_name
 
     @property
     def config(self):
@@ -152,7 +165,7 @@ class BaseCloudProvider(CloudProvider):
                  service_type)
         return False
 
-    def _get_config_value(self, key, default_value):
+    def _get_config_value(self, key, default_value=None):
         """
         A convenience method to extract a configuration value.
 

+ 2 - 2
cloudbridge/cloud/base/services.py

@@ -307,7 +307,7 @@ class BaseSubnetService(
         matches = cb_helpers.generic_find(filters, kwargs, obj_list)
         return ClientPagedResultList(self._provider, list(matches))
 
-    def get_or_create_default(self, zone):
+    def get_or_create_default(self):
         # Look for a CB-default subnet
         matches = self.find(label=BaseSubnet.CB_DEFAULT_SUBNET_LABEL)
         if matches:
@@ -316,7 +316,7 @@ class BaseSubnetService(
         # No provider-default Subnet exists, try to create it (net + subnets)
         network = self.provider.networking.networks.get_or_create_default()
         subnet = self.create(BaseSubnet.CB_DEFAULT_SUBNET_LABEL, network,
-                             BaseSubnet.CB_DEFAULT_SUBNET_IPV4RANGE, zone)
+                             BaseSubnet.CB_DEFAULT_SUBNET_IPV4RANGE)
         return subnet
 
 

+ 2 - 2
cloudbridge/cloud/base/subservices.py

@@ -159,10 +159,10 @@ class BaseSubnetSubService(SubnetSubService, BasePageableObjectMixin):
         return self._provider.networking.subnets.find(network=self.network,
                                                       **kwargs)
 
-    def create(self, label, cidr_block, zone):
+    def create(self, label, cidr_block):
         return self._provider.networking.subnets.create(label,
                                                         self.network,
-                                                        cidr_block, zone)
+                                                        cidr_block)
 
     def delete(self, subnet):
         return self._provider.networking.subnets.delete(subnet)

+ 23 - 0
cloudbridge/cloud/interfaces/provider.py

@@ -119,6 +119,29 @@ class CloudProvider(object):
         """
         pass
 
+    @abstractproperty
+    def region_name(self):
+        """
+        Returns the region that this provider is connected to.
+        All provider operations will take place within this region.
+
+        :rtype: ``str``
+        :return:  a zone id
+        """
+        pass
+
+    @abstractproperty
+    def zone_name(self):
+        """
+        Returns the placement zone that this provider is connected to.
+        All provider operations will take place within this zone. Placement
+        zone must be within the provider default region.
+
+        :rtype: ``str``
+        :return:  a zone id
+        """
+        pass
+
 #     @abstractproperty
 #     def account(self):
 #         """

+ 2 - 5
cloudbridge/cloud/interfaces/resources.py

@@ -740,7 +740,7 @@ class LaunchConfig(object):
         lc.add_block_device(...)
 
         inst = provider.compute.instances.create(
-            'MyVM', image, vm_type, subnet, zone, launch_config=lc)
+            'MyVM', image, vm_type, subnet, launch_config=lc)
     """
 
     @abstractmethod
@@ -1623,13 +1623,10 @@ class Snapshot(ObjectLifeCycleMixin, LabeledCloudResource):
         pass
 
     @abstractmethod
-    def create_volume(self, placement, size=None, volume_type=None, iops=None):
+    def create_volume(self, size=None, volume_type=None, iops=None):
         """
         Create a new Volume from this Snapshot.
 
-        :type placement: ``str``
-        :param placement: The availability zone where to create the Volume.
-
         :type size: ``int``
         :param size: The size of the new volume, in GiB (optional). Defaults to
                      the size of the snapshot.

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

@@ -215,9 +215,8 @@ class InstanceService(PageableObjectMixin, CloudService):
         pass
 
     @abstractmethod
-    def create(self, label, image, vm_type, subnet, zone=None,
-               key_pair=None, vm_firewalls=None, user_data=None,
-               launch_config=None,
+    def create(self, label, image, vm_type, subnet, key_pair=None,
+               vm_firewalls=None, user_data=None, launch_config=None,
                **kwargs):
         """
         Creates a new virtual machine instance.
@@ -245,14 +244,6 @@ class InstanceService(PageableObjectMixin, CloudService):
                        work. Some providers (e.g. OpenStack) support a null
                        value but the behaviour is implementation specific.
 
-        :type  zone: ``Zone`` or ``str``
-        :param zone: The Zone or its id, where the instance should be placed.
-                     This parameter is provided for legacy compatibility (with
-                     classic networks).
-
-                     The subnet's placement zone will take precedence over this
-                     parameter, but in its absence, this value will be used.
-
         :type  key_pair: ``KeyPair`` or ``str``
         :param key_pair: The KeyPair object or its id, to set for the
                          instance.
@@ -335,7 +326,7 @@ class VolumeService(PageableObjectMixin, CloudService):
         pass
 
     @abstractmethod
-    def create(self, label, size, zone, snapshot=None, description=None):
+    def create(self, label, size, snapshot=None, description=None):
         """
         Creates a new volume.
 
@@ -345,9 +336,6 @@ class VolumeService(PageableObjectMixin, CloudService):
         :type  size: ``int``
         :param size: The size of the volume (in GB).
 
-        :type  zone: ``str`` or :class:`.PlacementZone` object
-        :param zone: The availability zone in which the Volume will be created.
-
         :type  snapshot: ``str`` or :class:`.Snapshot` object
         :param snapshot: An optional reference to a snapshot from which this
                          volume should be created.
@@ -772,7 +760,7 @@ class SubnetService(PageableObjectMixin, CloudService):
         pass
 
     @abstractmethod
-    def create(self, label, network, cidr_block, zone):
+    def create(self, label, network, cidr_block):
         """
         Create a new subnet within the supplied network.
 
@@ -786,17 +774,13 @@ class SubnetService(PageableObjectMixin, CloudService):
         :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 get_or_create_default(self, zone):
+    def get_or_create_default(self):
         """
         Return a default subnet for the account or create one if not found.
         This provides a convenience method for obtaining a network if you
@@ -805,9 +789,6 @@ class SubnetService(PageableObjectMixin, CloudService):
         A default network is one marked as such by the provider or matches the
         default label used by this library (e.g., cloudbridge-net).
 
-        :type zone: :class:`.PlacementZone` object ``str``
-        :param zone: Placement zone where to look for the subnet.
-
         :rtype: ``object`` of :class:`.Subnet`
         :return: A Subnet object
         """

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

@@ -370,7 +370,7 @@ class SubnetSubService(PageableObjectMixin):
         pass
 
     @abstractmethod
-    def create(self, label, cidr_block, zone):
+    def create(self, label, cidr_block):
         """
         Create a new subnet within the network holding this subservice.
 
@@ -381,10 +381,6 @@ class SubnetSubService(PageableObjectMixin):
         :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
         """

+ 7 - 6
cloudbridge/cloud/providers/aws/provider.py

@@ -22,25 +22,26 @@ class AWSCloudProvider(BaseCloudProvider):
 
         # Initialize cloud connection fields
         # These are passed as-is to Boto
-        self.region_name = self._get_config_value('aws_region_name',
-                                                  'us-east-1')
+        self._region_name = self._get_config_value('aws_region_name',
+                                                   'us-east-1')
+        self._zone_name = self._get_config_value('aws_zone_name')
         self.session_cfg = {
             'aws_access_key_id': self._get_config_value(
-                'aws_access_key', get_env('AWS_ACCESS_KEY', None)),
+                'aws_access_key', get_env('AWS_ACCESS_KEY')),
             'aws_secret_access_key': self._get_config_value(
-                'aws_secret_key', get_env('AWS_SECRET_KEY', None)),
+                'aws_secret_key', get_env('AWS_SECRET_KEY')),
             'aws_session_token': self._get_config_value(
                 'aws_session_token', None)
         }
         self.ec2_cfg = {
             'use_ssl': self._get_config_value('ec2_is_secure', True),
             'verify': self._get_config_value('ec2_validate_certs', True),
-            'endpoint_url': self._get_config_value('ec2_endpoint_url', None)
+            'endpoint_url': self._get_config_value('ec2_endpoint_url')
         }
         self.s3_cfg = {
             'use_ssl': self._get_config_value('s3_is_secure', True),
             'verify': self._get_config_value('s3_validate_certs', True),
-            'endpoint_url': self._get_config_value('s3_endpoint_url', None)
+            'endpoint_url': self._get_config_value('s3_endpoint_url')
         }
 
         # service connections, lazily initialized

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

@@ -590,12 +590,11 @@ class AWSSnapshot(BaseSnapshot):
             # set the status to unknown
             self._unknown_state = True
 
-    def create_volume(self, placement, size=None, volume_type=None, iops=None):
+    def create_volume(self, size=None, volume_type=None, iops=None):
         label = "from-snap-{0}".format(self.label or self.id)
         cb_vol = self._provider.storage.volumes.create(
             label=label,
             size=size,
-            zone=placement,
             snapshot=self.id)
         cb_vol.wait_till_ready()
         return cb_vol

+ 19 - 24
cloudbridge/cloud/providers/aws/services.py

@@ -40,7 +40,6 @@ from cloudbridge.cloud.interfaces.exceptions import InvalidValueException
 from cloudbridge.cloud.interfaces.resources import KeyPair
 from cloudbridge.cloud.interfaces.resources import MachineImage
 from cloudbridge.cloud.interfaces.resources import Network
-from cloudbridge.cloud.interfaces.resources import PlacementZone
 from cloudbridge.cloud.interfaces.resources import Snapshot
 from cloudbridge.cloud.interfaces.resources import TrafficDirection
 from cloudbridge.cloud.interfaces.resources import VMFirewall
@@ -59,7 +58,6 @@ from .resources import AWSKeyPair
 from .resources import AWSLaunchConfig
 from .resources import AWSMachineImage
 from .resources import AWSNetwork
-from .resources import AWSPlacementZone
 from .resources import AWSRegion
 from .resources import AWSRouter
 from .resources import AWSSnapshot
@@ -352,14 +350,14 @@ class AWSVolumeService(BaseVolumeService):
 
     @dispatch(event="provider.storage.volumes.create",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
-    def create(self, label, size, zone, snapshot=None, description=None):
+    def create(self, label, size, snapshot=None, description=None):
         AWSVolume.assert_valid_resource_label(label)
-        zone_id = zone.id if isinstance(zone, PlacementZone) else zone
+        zone_name = self.provider.zone_name
         snapshot_id = snapshot.id if isinstance(
             snapshot, AWSSnapshot) and snapshot else snapshot
 
         cb_vol = self.svc.create('create_volume', Size=size,
-                                 AvailabilityZone=zone_id,
+                                 AvailabilityZone=zone_name,
                                  SnapshotId=snapshot_id)
         # Wait until ready to tag instance
         cb_vol.wait_till_ready()
@@ -733,7 +731,7 @@ class AWSInstanceService(BaseInstanceService):
 
     @dispatch(event="provider.compute.instances.create",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
-    def create(self, label, image, vm_type, subnet, zone,
+    def create(self, label, image, vm_type, subnet,
                key_pair=None, vm_firewalls=None, user_data=None,
                launch_config=None, **kwargs):
         AWSInstance.assert_valid_resource_label(label)
@@ -742,7 +740,7 @@ class AWSInstanceService(BaseInstanceService):
             isinstance(vm_type, VMType) else vm_type
         subnet = (self.provider.networking.subnets.get(subnet)
                   if isinstance(subnet, str) else subnet)
-        zone_id = zone.id if isinstance(zone, PlacementZone) else zone
+        zone_name = self.provider.zone_name
         key_pair_name = key_pair.name if isinstance(
             key_pair,
             KeyPair) else key_pair
@@ -752,7 +750,7 @@ class AWSInstanceService(BaseInstanceService):
             bdm = None
 
         subnet_id, zone_id, vm_firewall_ids = \
-            self._resolve_launch_options(subnet, zone_id, vm_firewalls)
+            self._resolve_launch_options(subnet, zone_name, vm_firewalls)
 
         placement = {'AvailabilityZone': zone_id} if zone_id else None
         inst = self.svc.create('create_instances',
@@ -1023,10 +1021,9 @@ class AWSSubnetService(BaseSubnetService):
 
     @dispatch(event="provider.networking.subnets.create",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
-    def create(self, label, network, cidr_block, zone):
+    def create(self, label, network, cidr_block):
         AWSSubnet.assert_valid_resource_label(label)
-        zone_name = zone.name if isinstance(
-            zone, AWSPlacementZone) else zone
+        zone_name = self.provider.zone_name
 
         network_id = network.id if isinstance(network, AWSNetwork) else network
 
@@ -1046,8 +1043,8 @@ class AWSSubnetService(BaseSubnetService):
             # pylint:disable=protected-access
             sn._subnet.delete()
 
-    def get_or_create_default(self, zone):
-        zone_name = zone.name if isinstance(zone, AWSPlacementZone) else zone
+    def get_or_create_default(self):
+        zone_name = self.provider.zone_name
 
         # # Look for provider default subnet in current zone
         # if zone_name:
@@ -1077,8 +1074,6 @@ class AWSSubnetService(BaseSubnetService):
         if snl:
             # pylint:disable=protected-access
             snl.sort(key=lambda sn: sn._subnet.availability_zone)
-            if not zone_name:
-                return snl[0]
             for subnet in snl:
                 if subnet.zone.name == zone_name:
                     return subnet
@@ -1133,15 +1128,15 @@ class AWSSubnetService(BaseSubnetService):
         subnets = list(ip_net.subnets(prefixlen_diff=prefixlen_diff))
 
         for i, z in reversed(list(enumerate(region.zones))):
-            sn_label = "{0}-{1}".format(AWSSubnet.CB_DEFAULT_SUBNET_LABEL,
-                                        z.id[-1])
-            log.info("Creating a default CloudBridge subnet %s: %s" %
-                     (sn_label, str(subnets[i])))
-            sn = self.create(sn_label, default_net, str(subnets[i]), z)
-            # Create a route table entry between the SN and the inet gateway
-            # See note above about why this is commented
-            # default_router.attach_subnet(sn)
-            if zone and zone_name == z.name:
+            if zone_name == z.name:
+                sn_label = "{0}-{1}".format(AWSSubnet.CB_DEFAULT_SUBNET_LABEL,
+                                            z.id[-1])
+                log.info("Creating a default CloudBridge subnet %s: %s" %
+                         (sn_label, str(subnets[i])))
+                sn = self.create(sn_label, default_net, str(subnets[i]))
+                # Create a route table entry between the SN and the inet
+                # gateway. See note above about why this is commented
+                # default_router.attach_subnet(sn)
                 default_sn = sn
         # No specific zone was supplied; return the last created subnet
         # The list was originally reversed to have the last subnet be in zone a

+ 25 - 15
test/helpers/__init__.py

@@ -7,6 +7,7 @@ import uuid
 
 from cloudbridge.cloud.base import helpers as cb_helpers
 from cloudbridge.cloud.factory import CloudProviderFactory
+from cloudbridge.cloud.interfaces import CloudProvider
 from cloudbridge.cloud.interfaces import InstanceState
 from cloudbridge.cloud.interfaces import TestMockHelperMixin
 from cloudbridge.cloud.interfaces.resources import FloatingIpState
@@ -82,12 +83,14 @@ TEST_DATA_CONFIG = {
         "image": cb_helpers.get_env('CB_IMAGE_AWS', 'ami-aa2ea6d0'),
         "vm_type": cb_helpers.get_env('CB_VM_TYPE_AWS', 't2.nano'),
         "placement": cb_helpers.get_env('CB_PLACEMENT_AWS', 'us-east-1a'),
+        "placement_cfg_key": "aws_zone_name"
     },
     'OpenStackCloudProvider': {
         'image': cb_helpers.get_env('CB_IMAGE_OS',
                                     'c66bdfa1-62b1-43be-8964-e9ce208ac6a5'),
         "vm_type": cb_helpers.get_env('CB_VM_TYPE_OS', 'm1.tiny'),
         "placement": cb_helpers.get_env('CB_PLACEMENT_OS', 'nova'),
+        "placement_cfg_key": "os_zone_name"
     },
     'GCPCloudProvider': {
         'image': cb_helpers.get_env(
@@ -95,28 +98,32 @@ TEST_DATA_CONFIG = {
             'https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/'
             'global/images/ubuntu-1710-artful-v20180126'),
         'vm_type': cb_helpers.get_env('CB_VM_TYPE_GCP', 'f1-micro'),
-        'placement': cb_helpers.get_env('GCP_DEFAULT_ZONE', 'us-central1-a'),
+        'placement': cb_helpers.get_env('GCP_ZONE_NAME', 'us-central1-a'),
+        "placement_cfg_key": "gcp_zone_name"
     },
     "AzureCloudProvider": {
-        "placement":
-            cb_helpers.get_env('CB_PLACEMENT_AZURE', 'eastus'),
         "image":
             cb_helpers.get_env('CB_IMAGE_AZURE',
                                'Canonical:UbuntuServer:16.04.0-LTS:latest'),
-        "vm_type":
-            cb_helpers.get_env('CB_VM_TYPE_AZURE', 'Basic_A2'),
+        "vm_type": cb_helpers.get_env('CB_VM_TYPE_AZURE', 'Basic_A2'),
+        "placement": cb_helpers.get_env('CB_PLACEMENT_AZURE', 'eastus'),
+        "placement_cfg_key": "azure_zone_name"
     }
 }
 
 
 def get_provider_test_data(provider, key):
-    if "AWSCloudProvider" in provider.name:
+    provider_id = (provider.PROVIDER_ID if isinstance(provider, CloudProvider)
+                   else provider)
+    if "aws" == provider_id:
         return TEST_DATA_CONFIG.get("AWSCloudProvider").get(key)
-    elif "OpenStackCloudProvider" in provider.name:
+    if "mock" == provider_id:
+        return TEST_DATA_CONFIG.get("AWSCloudProvider").get(key)
+    elif "openstack" == provider_id:
         return TEST_DATA_CONFIG.get("OpenStackCloudProvider").get(key)
-    elif "GCPCloudProvider" in provider.name:
+    elif "gcp" == provider_id:
         return TEST_DATA_CONFIG.get("GCPCloudProvider").get(key)
-    elif "AzureCloudProvider" in provider.name:
+    elif "azure" == provider_id:
         return TEST_DATA_CONFIG.get("AzureCloudProvider").get(key)
     return None
 
@@ -125,8 +132,7 @@ def get_or_create_default_subnet(provider):
     """
     Return the default subnet to be used for tests
     """
-    return provider.networking.subnets.get_or_create_default(
-        zone=get_provider_test_data(provider, 'placement'))
+    return provider.networking.subnets.get_or_create_default()
 
 
 def cleanup_subnet(subnet):
@@ -185,7 +191,6 @@ def create_test_instance(
         instance_label, get_provider_test_data(provider, 'image'),
         get_provider_test_data(provider, 'vm_type'),
         subnet=subnet,
-        zone=get_provider_test_data(provider, 'placement'),
         key_pair=key_pair,
         vm_firewalls=vm_firewalls,
         launch_config=launch_config,
@@ -257,11 +262,16 @@ class ProviderTestBase(unittest.TestCase):
 
     def create_provider_instance(self):
         provider_name = cb_helpers.get_env("CB_TEST_PROVIDER", "aws")
+        zone_cfg_key = get_provider_test_data(provider_name,
+                                              'placement_cfg_key')
         factory = CloudProviderFactory()
         provider_class = factory.get_provider_class(provider_name)
-        config = {'default_wait_interval':
-                  self.get_provider_wait_interval(provider_class),
-                  'default_result_limit': 5}
+        config = {
+            'default_wait_interval': self.get_provider_wait_interval(
+                provider_class),
+            'default_result_limit': 5,
+            zone_cfg_key: get_provider_test_data(provider_name, 'placement')
+        }
         return provider_class(config)
 
     @property

+ 7 - 13
test/test_block_store_service.py

@@ -45,8 +45,7 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
     def test_crud_volume(self):
         def create_vol(label):
             return self.provider.storage.volumes.create(
-                label, 1,
-                helpers.get_provider_test_data(self.provider, "placement"))
+                label, 1)
 
         def cleanup_vol(vol):
             if vol:
@@ -77,7 +76,7 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
                 self.provider, label, subnet=subnet)
 
             test_vol = self.provider.storage.volumes.create(
-                label, 1, test_instance.zone_id)
+                label, 1)
             with cb_helpers.cleanup_action(lambda: test_vol.delete()):
                 test_vol.wait_till_ready()
                 test_vol.attach(test_instance, '/dev/sda2')
@@ -104,7 +103,7 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
                 self.provider, label, subnet=subnet)
 
             test_vol = self.provider.storage.volumes.create(
-                label, 1, test_instance.zone_id, description=vol_desc)
+                label, 1, description=vol_desc)
             with cb_helpers.cleanup_action(lambda: test_vol.delete()):
                 test_vol.wait_till_ready()
                 self.assertTrue(
@@ -154,8 +153,7 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
         # Delete everything afterwards.
         label = "cb-crudsnap-{0}".format(helpers.get_uuid())
         test_vol = self.provider.storage.volumes.create(
-            label, 1,
-            helpers.get_provider_test_data(self.provider, "placement"))
+            label, 1)
         with cb_helpers.cleanup_action(lambda: test_vol.delete()):
             test_vol.wait_till_ready()
 
@@ -193,8 +191,7 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
     def test_snapshot_properties(self):
         label = "cb-snapprop-{0}".format(helpers.get_uuid())
         test_vol = self.provider.storage.volumes.create(
-            label, 1,
-            helpers.get_provider_test_data(self.provider, "placement"))
+            label, 1)
         with cb_helpers.cleanup_action(lambda: test_vol.delete()):
             test_vol.wait_till_ready()
             snap_label = "cb-snap-{0}".format(label)
@@ -230,14 +227,11 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
                 # Test volume creation from a snapshot (via VolumeService)
                 sv_label = "cb-snapvol-{0}".format(test_snap.name)
                 snap_vol = self.provider.storage.volumes.create(
-                    sv_label, 1,
-                    helpers.get_provider_test_data(self.provider, "placement"),
-                    snapshot=test_snap)
+                    sv_label, 1, snapshot=test_snap)
                 with cb_helpers.cleanup_action(lambda: snap_vol.delete()):
                     snap_vol.wait_till_ready()
 
                 # Test volume creation from a snapshot (via Snapshot)
-                snap_vol2 = test_snap.create_volume(
-                    helpers.get_provider_test_data(self.provider, "placement"))
+                snap_vol2 = test_snap.create_volume()
                 with cb_helpers.cleanup_action(lambda: snap_vol2.delete()):
                     snap_vol2.wait_till_ready()

+ 2 - 7
test/test_compute_service.py

@@ -241,9 +241,7 @@ class CloudComputeServiceTestCase(ProviderTestBase):
                                 " not stable enough yet")
 
         test_vol = self.provider.storage.volumes.create(
-           label, 1,
-           helpers.get_provider_test_data(self.provider,
-                                          "placement"))
+           label, 1)
         with cb_helpers.cleanup_action(lambda: test_vol.delete()):
             test_vol.wait_till_ready()
             test_snap = test_vol.create_snapshot(label=label,
@@ -332,10 +330,7 @@ class CloudComputeServiceTestCase(ProviderTestBase):
             net = self.provider.networking.networks.create(
                 label=label, cidr_block=BaseNetwork.CB_DEFAULT_IPV4RANGE)
             cidr = '10.0.1.0/24'
-            subnet = net.subnets.create(label=label, cidr_block=cidr,
-                                        zone=helpers.get_provider_test_data(
-                                                     self.provider,
-                                                     'placement'))
+            subnet = net.subnets.create(label=label, cidr_block=cidr)
             test_inst = helpers.get_test_instance(self.provider, label,
                                                   subnet=subnet)
             fw = self.provider.security.vm_firewalls.create(

+ 1 - 3
test/test_image_service.py

@@ -62,9 +62,7 @@ class CloudImageServiceTestCase(ProviderTestBase):
                 img_instance = self.provider.compute.instances.create(
                     img_inst_label, img,
                     helpers.get_provider_test_data(self.provider, 'vm_type'),
-                    subnet=subnet,
-                    zone=helpers.get_provider_test_data(
-                        self.provider, 'placement'))
+                    subnet=subnet)
                 img_instance.wait_till_ready()
                 self.assertIsInstance(img_instance, Instance)
                 self.assertEqual(

+ 18 - 0
test/test_interface.py

@@ -61,3 +61,21 @@ class CloudInterfaceTestCase(ProviderTestBase):
             cloned_provider = CloudProviderFactory().create_provider(
                 self.provider.PROVIDER_ID, cloned_config)
             cloned_provider.authenticate()
+
+    def test_provider_zone_in_region(self):
+        cloned_config = self.provider.config.copy()
+        cloned_config['zone_name'] = None
+        cloned_provider = CloudProviderFactory().create_provider(
+                self.provider.PROVIDER_ID, cloned_config)
+        region = cloned_provider.compute.regions.get(
+            cloned_provider.region_name)
+        matches = [zone.name for zone in region.zones
+                   if zone.name == cloned_provider.zone_name]
+        self.assertListEqual([cloned_provider.zone_name], matches)
+
+    def test_provider_always_has_zone(self):
+        cloned_config = self.provider.config.copy()
+        cloned_config['zone_name'] = None
+        cloned_provider = CloudProviderFactory().create_provider(
+                self.provider.PROVIDER_ID, cloned_config)
+        self.assertIsNotNone(cloned_provider.zone_name)

+ 4 - 12
test/test_network_service.py

@@ -9,7 +9,6 @@ from cloudbridge.cloud.interfaces.resources import SubnetState
 
 import test.helpers as helpers
 from test.helpers import ProviderTestBase
-from test.helpers import get_provider_test_data
 from test.helpers import standard_interface_tests as sit
 
 
@@ -91,9 +90,7 @@ class CloudNetworkServiceTestCase(ProviderTestBase):
 
             cidr = '10.0.20.0/24'
             sn = net.subnets.create(
-                label=subnet_label, cidr_block=cidr,
-                zone=helpers.get_provider_test_data(self.provider,
-                                                    'placement'))
+                label=subnet_label, cidr_block=cidr)
             with cb_helpers.cleanup_action(lambda: helpers.cleanup_subnet(sn)):
                 self.assertTrue(
                     sn in net.subnets,
@@ -138,9 +135,7 @@ class CloudNetworkServiceTestCase(ProviderTestBase):
 
         def create_subnet(label):
             return self.provider.networking.subnets.create(
-                label=label, network=net, cidr_block="10.0.10.0/24",
-                zone=helpers.get_provider_test_data(
-                    self.provider, 'placement'))
+                label=label, network=net, cidr_block="10.0.10.0/24")
 
         def cleanup_subnet(subnet):
             if subnet:
@@ -236,9 +231,7 @@ class CloudNetworkServiceTestCase(ProviderTestBase):
             router = self.provider.networking.routers.create(label=label,
                                                              network=net)
             cidr = '10.0.15.0/24'
-            sn = net.subnets.create(label=label, cidr_block=cidr,
-                                    zone=helpers.get_provider_test_data(
-                                        self.provider, 'placement'))
+            sn = net.subnets.create(label=label, cidr_block=cidr)
 
             # Check basic router properties
             sit.check_standard_behaviour(
@@ -275,6 +268,5 @@ class CloudNetworkServiceTestCase(ProviderTestBase):
 
     @helpers.skipIfNoService(['networking.networks'])
     def test_default_network(self):
-        subnet = self.provider.networking.subnets.get_or_create_default(
-            zone=get_provider_test_data(self.provider, 'placement'))
+        subnet = self.provider.networking.subnets.get_or_create_default()
         self.assertIsInstance(subnet, Subnet)

+ 1 - 2
test/test_object_life_cycle.py

@@ -17,8 +17,7 @@ class CloudObjectLifeCycleTestCase(ProviderTestBase):
         test_vol = None
         with cb_helpers.cleanup_action(lambda: test_vol.delete()):
             test_vol = self.provider.storage.volumes.create(
-                label, 1,
-                helpers.get_provider_test_data(self.provider, "placement"))
+                label, 1)
 
             # Waiting for an invalid timeout should raise an exception
             with self.assertRaises(AssertionError):