almahmoud 7 лет назад
Родитель
Сommit
a87382f607
1 измененных файлов с 51 добавлено и 25 удалено
  1. 51 25
      cloudbridge/cloud/providers/openstack/services.py

+ 51 - 25
cloudbridge/cloud/providers/openstack/services.py

@@ -367,11 +367,19 @@ class OpenStackVolumeService(BaseVolumeService):
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
     def get(self, volume_id):
         try:
-            return OpenStackVolume(
-                self.provider, self.provider.cinder.volumes.get(volume_id))
+            os_vol = self.provider.cinder.volumes.get(volume_id)
         except CinderNotFound:
             log.debug("Volume %s was not found.", volume_id)
             return None
+        if os_vol.availability_zone != self.provider.zone_name:
+            log.debug("Volume %s was found in availability zone '%s' while the"
+                      " OpenStack provider is in zone '%s'",
+                      volume_id,
+                      os_vol.availability_zone,
+                      self.provider.zone_name)
+            return None
+        else:
+            return OpenStackVolume(self.provider, os_vol)
 
     @dispatch(event="provider.storage.volumes.find",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
@@ -385,7 +393,8 @@ class OpenStackVolumeService(BaseVolumeService):
                 "attributes: %s" % (kwargs, 'label'))
 
         log.debug("Searching for an OpenStack Volume with the label %s", label)
-        search_opts = {'name': label}
+        search_opts = {'name': label,
+                       'availability_zone': self.provider.zone_name}
         cb_vols = [
             OpenStackVolume(self.provider, vol)
             for vol in self.provider.cinder.volumes.list(
@@ -398,9 +407,11 @@ class OpenStackVolumeService(BaseVolumeService):
     @dispatch(event="provider.storage.volumes.list",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
     def list(self, limit=None, marker=None):
+        search_opts = {'availability_zone': self.provider.zone_name}
         cb_vols = [
             OpenStackVolume(self.provider, vol)
             for vol in self.provider.cinder.volumes.list(
+                search_opts=search_opts,
                 limit=oshelpers.os_result_limit(self.provider, limit),
                 marker=marker)]
 
@@ -840,7 +851,8 @@ class OpenStackInstanceService(BaseInstanceService):
                 "Unrecognised parameters for search: %s. Supported "
                 "attributes: %s" % (kwargs, 'label'))
 
-        search_opts = {'name': label}
+        search_opts = {'name': label,
+                       'availability_zone': self.provider.zone_name}
         cb_insts = [
             OpenStackInstance(self.provider, inst)
             for inst in self.provider.nova.servers.list(
@@ -855,9 +867,11 @@ class OpenStackInstanceService(BaseInstanceService):
         """
         List all instances.
         """
+        search_opts = {'availability_zone': self.provider.zone_name}
         cb_insts = [
             OpenStackInstance(self.provider, inst)
             for inst in self.provider.nova.servers.list(
+                search_opts=search_opts,
                 limit=oshelpers.os_result_limit(self.provider, limit),
                 marker=marker)]
         return oshelpers.to_server_paged_list(self.provider, cb_insts, limit)
@@ -870,10 +884,19 @@ class OpenStackInstanceService(BaseInstanceService):
         """
         try:
             os_instance = self.provider.nova.servers.get(instance_id)
-            return OpenStackInstance(self.provider, os_instance)
         except NovaNotFound:
             log.debug("Instance %s was not found.", instance_id)
             return None
+        if (getattr(os_instance,
+                    'OS-EXT-AZ:availability_zone', "")
+                != self.provider.zone_name):
+            log.debug("Instance %s was found in availability zone '%s' while "
+                      "the OpenStack provider is in zone '%s'",
+                      instance_id,
+                      getattr(os_instance, 'OS-EXT-AZ:availability_zone', ""),
+                      self.provider.zone_name)
+            return None
+        return OpenStackInstance(self.provider, os_instance)
 
     @dispatch(event="provider.compute.instances.delete",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
@@ -997,27 +1020,22 @@ class OpenStackNetworkService(BaseNetworkService):
     def list(self, limit=None, marker=None):
         networks = [OpenStackNetwork(self.provider, network)
                     for network in self.provider.neutron.list_networks()
-                    .get('networks') if network]
+                    .get('networks') if network
+                    # If there are no availability zones, keep the network
+                    # in the results list
+                    and (not network.get('availability_zones')
+                         or self.provider.zone_name
+                         in network.get('availability_zones'))]
         return ClientPagedResultList(self.provider, networks,
                                      limit=limit, marker=marker)
 
     @dispatch(event="provider.networking.networks.find",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
     def find(self, **kwargs):
-        label = kwargs.pop('label', None)
-
-        # All kwargs should have been popped at this time.
-        if len(kwargs) > 0:
-            raise InvalidParamException(
-                "Unrecognised parameters for search: %s. Supported "
-                "attributes: %s" % (kwargs, 'label'))
-
-        log.debug("Searching for OpenStack Network with label: %s", label)
-        networks = [OpenStackNetwork(self.provider, network)
-                    for network in self.provider.neutron.list_networks(
-                        name=label)
-                    .get('networks') if network]
-        return ClientPagedResultList(self.provider, networks)
+        obj_list = self
+        filters = ['label']
+        matches = cb_helpers.generic_find(filters, kwargs, obj_list)
+        return ClientPagedResultList(self._provider, list(matches))
 
     @dispatch(event="provider.networking.networks.create",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
@@ -1026,8 +1044,6 @@ class OpenStackNetworkService(BaseNetworkService):
         net_info = {'name': label or ""}
         network = self.provider.neutron.create_network({'network': net_info})
         cb_net = OpenStackNetwork(self.provider, network.get('network'))
-        if label:
-            cb_net.label = label
         return cb_net
 
     @dispatch(event="provider.networking.networks.delete",
@@ -1125,15 +1141,25 @@ class OpenStackRouterService(BaseRouterService):
     @dispatch(event="provider.networking.routers.get",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
     def get(self, router_id):
-        log.debug("Getting OpenStack Router with the id: %s", router_id)
         router = self.provider.os_conn.get_router(router_id)
-        return OpenStackRouter(self.provider, router) if router else None
+        if not router:
+            log.debug("Router %s was not found.", router_id)
+            return None
+        elif self.provider.zone_name not in router.availability_zones:
+            log.debug("Router %s was found in availability zone '%s' while the"
+                      " OpenStack provider is in zone '%s'",
+                      router_id,
+                      router.availability_zones,
+                      self.provider.zone_name)
+            return None
+        return OpenStackRouter(self.provider, router)
 
     @dispatch(event="provider.networking.routers.list",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
     def list(self, limit=None, marker=None):
         routers = self.provider.os_conn.list_routers()
-        os_routers = [OpenStackRouter(self.provider, r) for r in routers]
+        os_routers = [OpenStackRouter(self.provider, r) for r in routers
+                      if self.provider.zone_name in r.availability_zones]
         return ClientPagedResultList(self.provider, os_routers, limit=limit,
                                      marker=marker)