2
0
Эх сурвалжийг харах

GCP Instances & Volumes DifferentZoneException for get & delete

almahmoud 7 жил өмнө
parent
commit
2a3bca42be

+ 36 - 5
cloudbridge/providers/gcp/services.py

@@ -31,6 +31,7 @@ from cloudbridge.base.services import BaseVMFirewallRuleService
 from cloudbridge.base.services import BaseVMFirewallService
 from cloudbridge.base.services import BaseVMTypeService
 from cloudbridge.base.services import BaseVolumeService
+from cloudbridge.interfaces.exceptions import DifferentZoneException
 from cloudbridge.interfaces.exceptions import DuplicateResourceException
 from cloudbridge.interfaces.exceptions import InvalidParamException
 from cloudbridge.interfaces.resources import TrafficDirection
@@ -621,7 +622,20 @@ class GCPInstanceService(BaseInstanceService):
         as its id.
         """
         instance = self.provider.get_resource('instances', instance_id)
-        return GCPInstance(self.provider, instance) if instance else None
+        if not instance:
+            return None
+        else:
+            ins_zone = (self.provider
+                            .parse_url(instance.get('zone'))
+                            .parameters['zone'])
+            if ins_zone != self.provider.zone_name:
+                msg = ("Instance with id '{}' was found in availability zone "
+                       "'{}' while the GCP provider is in zone '{}'"
+                       .format(instance_id, ins_zone,
+                               self.provider.zone_name))
+                raise DifferentZoneException(msg)
+            else:
+                return GCPInstance(self.provider, instance)
 
     @dispatch(event="provider.compute.instances.find",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
@@ -672,8 +686,11 @@ class GCPInstanceService(BaseInstanceService):
     @dispatch(event="provider.compute.instances.delete",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
     def delete(self, instance):
-        instance = (instance if isinstance(instance, GCPInstance) else
-                    self.get(instance))
+        if isinstance(instance, GCPInstance):
+            if instance.zone_name != self.provider.zone_name:
+                instance = self.get(instance.id)
+        else:
+            instance = self.get(instance)
         if instance:
             (self._provider
              .gcp_compute
@@ -1117,7 +1134,17 @@ class GCPVolumeService(BaseVolumeService):
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
     def get(self, volume_id):
         vol = self.provider.get_resource('disks', volume_id)
-        return GCPVolume(self.provider, vol) if vol else None
+        if not vol:
+            return None
+        vol_zone = self.provider.parse_url(vol.get('zone')).parameters['zone']
+        if vol_zone == self.provider.zone_name:
+            return GCPVolume(self.provider, vol)
+        else:
+            msg = ("Volume with id '{}' was found in availability zone "
+                   "'{}' while the GCP provider is in zone '{}'"
+                   .format(volume_id, vol_zone,
+                           self.provider.zone_name))
+            raise DifferentZoneException(msg)
 
     @dispatch(event="provider.storage.volumes.find",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
@@ -1216,7 +1243,11 @@ class GCPVolumeService(BaseVolumeService):
     @dispatch(event="provider.storage.volumes.delete",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
     def delete(self, volume):
-        volume = volume if isinstance(volume, GCPVolume) else self.get(volume)
+        if isinstance(volume, GCPVolume):
+            if volume.zone_name != self.provider.zone_name:
+                volume = self.get(volume.id)
+        else:
+            volume = self.get(volume)
         if volume:
             (self._provider.gcp_compute
                            .disks()