فهرست منبع

Merge branch 'master' into dnssupport

Nuwan Goonasekera 6 سال پیش
والد
کامیت
837e291718

+ 2 - 4
.travis.yml

@@ -77,15 +77,13 @@ after_script:
            DOCS_REGEX='(\.rst$)|(^(docs))/'
            FILES_IN_CHANGESET="`git diff --name-only $TRAVIS_COMMIT_RANGE`"
            echo "$FILES_IN_CHANGESET" | grep -qvE "$DOCS_REGEX|(^(cloudbridge/cloud/providers))" && {
-              coveralls &
-              codecov &
-              wait
+              coveralls; codecov;
            } || {
               echo "Only docs and providers were updated. Not running coverage."
            }
            ;;
         *)
            echo "Build triggered through API or CRON job. Running regardless of changes"
-           coveralls & codecov & wait
+           coveralls; codecov;
            ;;
       esac

+ 2 - 3
cloudbridge/base/provider.py

@@ -99,9 +99,8 @@ class BaseCloudProvider(CloudProvider):
     @property
     def zone_name(self):
         if not self._zone_name:
-            region = self.compute.regions.get(self.region_name)
-            # TODO: Default zone
-            zone = next(iter(region.zones))
+            region = self.compute.regions.current
+            zone = region.default_zone
             self._zone_name = zone.name if zone else None
         return self._zone_name
 

+ 4 - 0
cloudbridge/base/resources.py

@@ -676,6 +676,10 @@ class BaseRegion(BaseCloudResource, Region):
         js['zones'] = [z.id for z in self.zones]
         return js
 
+    @property
+    def default_zone(self):
+        return next(iter(self.zones))
+
 
 class BaseBucketObject(BaseCloudResource, BucketObject):
 

+ 1 - 1
cloudbridge/base/subservices.py

@@ -143,7 +143,7 @@ class BaseSubnetSubService(SubnetSubService, BasePageableObjectMixin):
         return self.__provider
 
     def get(self, subnet_id):
-        sn = self._provider.networking.subnets.get(self.network, subnet_id)
+        sn = self._provider.networking.subnets.get(subnet_id)
         if sn.network_id != self.network.id:
             log.warning("The SubnetSubService nested in the network '{}' "
                         "returned subnet '{}' which is attached to another "

+ 1 - 1
cloudbridge/providers/azure/provider.py

@@ -1,7 +1,7 @@
 import logging
 import uuid
 
-from deprecation import deprecated
+from deprecated import deprecated
 
 from msrestazure.azure_exceptions import CloudError
 

+ 10 - 30
cloudbridge/providers/openstack/provider.py

@@ -49,18 +49,6 @@ class OpenStackCloudProvider(BaseCloudProvider):
             'os_region_name', get_env('OS_REGION_NAME'))
         self._zone_name = self._get_config_value(
             'os_zone_name', get_env('OS_ZONE_NAME'))
-        self._compute_zone_name = self._get_config_value(
-            'os_compute_zone_name', get_env('OS_COMPUTE_ZONE_NAME',
-                                            self.zone_name))
-        self._networking_zone_name = self._get_config_value(
-            'os_networking_zone_name', get_env('OS_NETWORKING_ZONE_NAME',
-                                               self.zone_name))
-        self._security_zone_name = self._get_config_value(
-            'os_security_zone_name', get_env('OS_SECURITY_ZONE_NAME',
-                                             self.zone_name))
-        self._storage_zone_name = self._get_config_value(
-            'os_storage_zone_name', get_env('OS_STORAGE_ZONE_NAME',
-                                            self.zone_name))
         self.project_domain_name = self._get_config_value(
             'os_project_domain_name',
             get_env('OS_PROJECT_DOMAIN_NAME'))
@@ -319,8 +307,8 @@ class OpenStackCloudProvider(BaseCloudProvider):
         :return: A Swift client connection using the auth credentials held by
             the OpenStackCloudProvider instance
         """
-        clean_options = self._clean_options(options,
-                                            swift_client.Connection.__init__)
+        clean_options = self._clean_options(
+            options, swift_client.Connection.__init__)
         storage_url = self._get_config_value(
             'os_storage_url', get_env('OS_STORAGE_URL', None))
         auth_token = self._get_config_value(
@@ -339,23 +327,15 @@ class OpenStackCloudProvider(BaseCloudProvider):
                                      session=self._keystone_session,
                                      region_name=self.region_name)
 
-    @property
-    def zone_name(self):
-        if not self._zone_name:
-            region = self.compute.regions.get(self.region_name)
-            zone = next(iter(region.zones))
-            self._zone_name = zone.name if zone else None
-        return self._zone_name
-
     def service_zone_name(self, service):
         service_name = service._service_event_pattern
-        if "networking" in service_name and self._networking_zone_name:
-            return self._networking_zone_name
-        elif "security" in service_name and self._security_zone_name:
-            return self._security_zone_name
-        elif "compute" in service_name and self._compute_zone_name:
-            return self._compute_zone_name
-        elif "storage" in service_name and self._storage_zone_name:
-            return self._storage_zone_name
+        if "networking" in service_name and self.networking.service_zone_name:
+            return self.networking.service_zone_name
+        elif "security" in service_name and self.security.service_zone_name:
+            return self.security.service_zone_name
+        elif "compute" in service_name and self.compute.service_zone_name:
+            return self.compute.service_zone_name
+        elif "storage" in service_name and self.storage.service_zone_name:
+            return self.storage.service_zone_name
         else:
             return self.zone_name

+ 20 - 0
cloudbridge/providers/openstack/services.py

@@ -88,6 +88,10 @@ class OpenStackSecurityService(BaseSecurityService):
     def __init__(self, provider):
         super(OpenStackSecurityService, self).__init__(provider)
 
+        # pylint:disable=protected-access
+        self.service_zone_name = self.provider._get_config_value(
+            'os_security_zone_name', cb_helpers.get_env(
+                'OS_SECURITY_ZONE_NAME', self.provider.zone_name))
         # Initialize provider services
         self._key_pairs = OpenStackKeyPairService(provider)
         self._vm_firewalls = OpenStackVMFirewallService(provider)
@@ -343,6 +347,10 @@ class OpenStackStorageService(BaseStorageService):
     def __init__(self, provider):
         super(OpenStackStorageService, self).__init__(provider)
 
+        # pylint:disable=protected-access
+        self.service_zone_name = self.provider._get_config_value(
+            'os_storage_zone_name', cb_helpers.get_env(
+                'OS_STORAGE_ZONE_NAME', self.provider.zone_name))
         # Initialize provider services
         self._volume_svc = OpenStackVolumeService(self.provider)
         self._snapshot_svc = OpenStackSnapshotService(self.provider)
@@ -651,6 +659,14 @@ class OpenStackComputeService(BaseComputeService):
         self._instance_svc = OpenStackInstanceService(self.provider)
         self._region_svc = OpenStackRegionService(self.provider)
         self._images_svc = OpenStackImageService(self.provider)
+        # Region service must be defined before invoking the following
+        # pylint:disable=protected-access
+        self.service_zone_name = self.provider._get_config_value(
+            'os_compute_zone_name',
+            cb_helpers.get_env(
+                'OS_COMPUTE_ZONE_NAME',
+                self.provider._zone_name or
+                self.regions.current.default_zone.name))
 
     @property
     def images(self):
@@ -993,6 +1009,10 @@ class OpenStackNetworkingService(BaseNetworkingService):
 
     def __init__(self, provider):
         super(OpenStackNetworkingService, self).__init__(provider)
+        # pylint:disable=protected-access
+        self.service_zone_name = self.provider._get_config_value(
+            'os_networking_zone_name', cb_helpers.get_env(
+                'OS_NETWORKING_ZONE_NAME', self.provider.zone_name))
         self._network_service = OpenStackNetworkService(self.provider)
         self._subnet_service = OpenStackSubnetService(self.provider)
         self._router_service = OpenStackRouterService(self.provider)

+ 14 - 0
tests/helpers/standard_interface_tests.py

@@ -7,6 +7,8 @@ This includes:
 """
 import uuid
 
+from six.moves.urllib.parse import quote_plus
+
 import tenacity
 
 from cloudbridge.base import helpers as cb_helpers
@@ -40,6 +42,7 @@ def check_json(test, obj):
 def check_obj_properties(test, obj):
     test.assertEqual(obj, obj, "Object should be equal to itself")
     test.assertFalse(obj != obj, "Object inequality should be false")
+    check_obj_id(test, obj)
     check_obj_name(test, obj)
     check_obj_label(test, obj)
 
@@ -142,6 +145,17 @@ def check_delete(test, service, obj, perform_delete=False):
         % (found_objs, type(service).__name__))
 
 
+def check_obj_id(test, obj):
+    id_property = getattr(type(obj), 'id', None)
+    test.assertIsInstance(id_property, property)
+    test.assertIsNone(id_property.fset, "Id should not have a setter")
+    # Non-url safe characters trip up djcloudbridge or anything that needs to
+    # use the ID in a url so make sure ids do not contain them
+    test.assertEqual(quote_plus(obj.id), obj.id,
+                     "IDs should only contain URL friendly chars that do not "
+                     "require encoding but contains: %s" % (obj.id,))
+
+
 def check_obj_name(test, obj):
     name_property = getattr(type(obj), 'name', None)
     test.assertIsInstance(name_property, property)