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

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 shutil
 
 
 import ipaddress
 import ipaddress
-from swiftclient.exceptions import ClientException
-
 from cloudbridge.cloud.base.resources import BaseBucket
 from cloudbridge.cloud.base.resources import BaseBucket
 from cloudbridge.cloud.base.resources import BaseBucketObject
 from cloudbridge.cloud.base.resources import BaseBucketObject
 from cloudbridge.cloud.base.resources import BaseInstance
 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 SnapshotState
 from cloudbridge.cloud.interfaces.resources import VolumeState
 from cloudbridge.cloud.interfaces.resources import VolumeState
 from cloudbridge.cloud.providers.openstack import helpers as oshelpers
 from cloudbridge.cloud.providers.openstack import helpers as oshelpers
+import novaclient.exceptions as novaex
+import swiftclient.exceptions as swiftex
 
 
 
 
 class OpenStackMachineImage(BaseMachineImage):
 class OpenStackMachineImage(BaseMachineImage):
@@ -385,8 +385,13 @@ class OpenStackRegion(BaseRegion):
         if self.name == self._provider.region_name:  # optimisation
         if self.name == self._provider.region_name:  # optimisation
             zones = self._provider.nova.availability_zones.list(detailed=False)
             zones = self._provider.nova.availability_zones.list(detailed=False)
         else:
         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,
         return [OpenStackPlacementZone(self._provider, z.zoneName,
                                        self._provider.region_name)
                                        self._provider.region_name)
@@ -818,7 +823,7 @@ class OpenStackBucketObject(BaseBucketObject):
         try:
         try:
             self._provider.swift.delete_object(self.cbcontainer.name,
             self._provider.swift.delete_object(self.cbcontainer.name,
                                                self.name)
                                                self.name)
-        except ClientException as err:
+        except swiftex.ClientException as err:
             if err.http_status == 404:
             if err.http_status == 404:
                 return True
                 return True
         return False
         return False

+ 3 - 1
test/test_region_service.py

@@ -67,7 +67,9 @@ class CloudRegionServiceTestCase(ProviderTestBase):
             for zone in region.zones:
             for zone in region.zones:
                 self.assertTrue(zone.id)
                 self.assertTrue(zone.id)
                 self.assertTrue(zone.name)
                 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:
                 if test_zone == zone.name:
                     zone_find_count += 1
                     zone_find_count += 1
         # TODO: Can't do a check for zone_find_count == 1 because Moto
         # TODO: Can't do a check for zone_find_count == 1 because Moto