Forráskód Böngészése

AWS Volumes Instances Subnets list/find filtered by zone

almahmoud 7 éve
szülő
commit
81e949ff87

+ 2 - 1
cloudbridge/cloud/base/provider.py

@@ -100,7 +100,8 @@ class BaseCloudProvider(CloudProvider):
     def zone_name(self):
         if not self._zone_name:
             region = self.compute.regions.get(self.region_name)
-            self._zone_name = next(region.zones)
+            # TODO: Default zone
+            self._zone_name = next(iter(region.zones))
         return self._zone_name
 
     @property

+ 22 - 9
cloudbridge/cloud/providers/aws/helpers.py

@@ -9,6 +9,7 @@ from botocore.utils import merge_dicts
 
 from cloudbridge.cloud.base.resources import ClientPagedResultList
 from cloudbridge.cloud.base.resources import ServerPagedResultList
+from cloudbridge.cloud.interfaces.exceptions import ProviderInternalException
 
 
 def trim_empty_params(params_dict):
@@ -241,22 +242,34 @@ class BotoGenericService(object):
             return ClientPagedResultList(self.provider, results,
                                          limit=limit, marker=marker)
 
-    def find(self, filter_name, filter_value, limit=None, marker=None,
+    def find(self, filter_names, filter_values, limit=None, marker=None,
              **kwargs):
         """
         Return a list of resources by filter.
 
-        :type filter_name: ``str``
-        :param filter_name: Name of the filter to use
+        :type filter_names: ``list`` of ``str``
+        :param filter_names: Names of the filters to use
 
-        :type filter_value: ``str``
-        :param filter_value: Value to filter with
+        :type filter_values: ``list`` of ``str``
+        :param filter_values: Values to filter with
         """
+        if isinstance(filter_names, list) and isinstance(filter_values, list):
+            n = len(filter_names)
+            filters = []
+            if len(filter_values) == n:
+                for i in range(n):
+                    filters.append({'Name': filter_names[i],
+                                    'Values': [filter_values[i]]})
+            else:
+                message = "When using multiple filters, the number of filter" \
+                          " names and values must match"
+                raise ProviderInternalException(message)
+
+        else:
+            filters = [{'Name': filter_names,
+                        'Values': [filter_values]}]
         collection = self.boto_collection
-        collection = collection.filter(Filters=[{
-            'Name': filter_name,
-            'Values': [filter_value]
-            }])
+        collection = collection.filter(Filters=filters)
         if kwargs:
             collection = collection.filter(**kwargs)
         return self.list(limit=limit, marker=marker, collection=collection)

+ 22 - 9
cloudbridge/cloud/providers/aws/services.py

@@ -341,12 +341,16 @@ class AWSVolumeService(BaseVolumeService):
                 "attributes: %s" % (kwargs, 'label'))
 
         log.debug("Searching for AWS Volume Service %s", label)
-        return self.svc.find(filter_name='tag:Name', filter_value=label)
+        return self.svc.find(filter_names=['tag:Name', 'availability-zone'],
+                             filter_values=[label,
+                                            self.provider.zone_name.name])
 
     @dispatch(event="provider.storage.volumes.list",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
     def list(self, limit=None, marker=None):
-        return self.svc.list(limit=limit, marker=marker)
+        return self.svc.find(filter_names='availability-zone',
+                             filter_values=self.provider.zone_name.name,
+                             limit=limit, marker=marker)
 
     @dispatch(event="provider.storage.volumes.create",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
@@ -791,12 +795,16 @@ class AWSInstanceService(BaseInstanceService):
                 "Unrecognised parameters for search: %s. Supported "
                 "attributes: %s" % (kwargs, 'label'))
 
-        return self.svc.find(filter_name='tag:Name', filter_value=label)
+        return self.svc.find(filter_names=['tag:Name', 'availability-zone'],
+                             filter_values=[label,
+                                            self.provider.zone_name.name])
 
     @dispatch(event="provider.compute.instances.list",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
     def list(self, limit=None, marker=None):
-        return self.svc.list(limit=limit, marker=marker)
+        return self.svc.find(filter_names='availability-zone',
+                             filter_values=self.provider.zone_name.name,
+                             limit=limit, marker=marker)
 
     @dispatch(event="provider.compute.instances.delete",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
@@ -999,11 +1007,14 @@ class AWSSubnetService(BaseSubnetService):
     def list(self, network=None, limit=None, marker=None):
         network_id = network.id if isinstance(network, AWSNetwork) else network
         if network_id:
-            return self.svc.find(
-                filter_name='vpc-id', filter_value=network_id,
-                limit=limit, marker=marker)
+            return self.svc.find(filter_names=['vpc-id', 'availability-zone'],
+                                 filter_values=[network_id,
+                                                self.provider.zone_name.name],
+                                 limit=limit, marker=marker)
         else:
-            return self.svc.list(limit=limit, marker=marker)
+            return self.svc.find(filter_names='availability-zone',
+                                 filter_values=self.provider.zone_name.name,
+                                 limit=limit, marker=marker)
 
     @dispatch(event="provider.networking.subnets.find",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
@@ -1017,7 +1028,9 @@ class AWSSubnetService(BaseSubnetService):
                 "attributes: %s" % (kwargs, 'label'))
 
         log.debug("Searching for AWS Subnet Service %s", label)
-        return self.svc.find(filter_name='tag:Name', filter_value=label)
+        return self.svc.find(filter_names=['tag:Name', 'availability-zone'],
+                             filter_values=[label,
+                                            self.provider.zone_name.name])
 
     @dispatch(event="provider.networking.subnets.create",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)