소스 검색

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

Nuwan Goonasekera 10 년 전
부모
커밋
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