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

Handle edge case when an OS region doesn't have a compute service.

Nuwan Goonasekera 10 лет назад
Родитель
Сommit
87a677a9eb
2 измененных файлов с 13 добавлено и 6 удалено
  1. 10 5
      cloudbridge/cloud/providers/openstack/resources.py
  2. 3 1
      test/test_region_service.py

+ 10 - 5
cloudbridge/cloud/providers/openstack/resources.py

@@ -6,8 +6,6 @@ import json
 import shutil
 
 import ipaddress
-from swiftclient.exceptions import ClientException
-
 from cloudbridge.cloud.base.resources import BaseBucket
 from cloudbridge.cloud.base.resources import BaseBucketObject
 from cloudbridge.cloud.base.resources import BaseInstance
@@ -28,6 +26,8 @@ from cloudbridge.cloud.interfaces.resources import NetworkState
 from cloudbridge.cloud.interfaces.resources import SnapshotState
 from cloudbridge.cloud.interfaces.resources import VolumeState
 from cloudbridge.cloud.providers.openstack import helpers as oshelpers
+import novaclient.exceptions as novaex
+import swiftclient.exceptions as swiftex
 
 
 class OpenStackMachineImage(BaseMachineImage):
@@ -385,8 +385,13 @@ class OpenStackRegion(BaseRegion):
         if self.name == self._provider.region_name:  # optimisation
             zones = self._provider.nova.availability_zones.list(detailed=False)
         else:
-            region_nova = self._provider._connect_nova_region(self.name)
-            zones = region_nova.availability_zones.list(detailed=False)
+            try:
+                region_nova = self._provider._connect_nova_region(self.name)
+                zones = region_nova.availability_zones.list(detailed=False)
+            except novaex.EndpointNotFound:
+                # This region may not have a compute endpoint. If so just
+                # return an empty list
+                zones = []
 
         return [OpenStackPlacementZone(self._provider, z.zoneName,
                                        self._provider.region_name)
@@ -818,7 +823,7 @@ class OpenStackBucketObject(BaseBucketObject):
         try:
             self._provider.swift.delete_object(self.cbcontainer.name,
                                                self.name)
-        except ClientException as err:
+        except swiftex.ClientException as err:
             if err.http_status == 404:
                 return True
         return False

+ 3 - 1
test/test_region_service.py

@@ -67,7 +67,9 @@ class CloudRegionServiceTestCase(ProviderTestBase):
             for zone in region.zones:
                 self.assertTrue(zone.id)
                 self.assertTrue(zone.name)
-                self.assertIsInstance(zone.region_name, six.string_types)
+                self.assertTrue(zone.region_name is None or
+                                isinstance(zone.region_name,
+                                           six.string_types))
                 if test_zone == zone.name:
                     zone_find_count += 1
         # TODO: Can't do a check for zone_find_count == 1 because Moto