Преглед на файлове

Added find for buckets and instances.

Nuwan Goonasekera преди 10 години
родител
ревизия
a46ab83767

+ 0 - 14
cloudbridge/cloud/providers/aws/helpers.py

@@ -1,14 +0,0 @@
-"""
-Helper functions
-"""
-
-
-def to_filter(provider, limit, marker):
-    """
-    Creates an aws filter dict for limit and marker
-    """
-    params = {}
-    params['MaxResults'] = limit or provider.config.result_limit
-    if marker:
-        params['NextToken'] = marker
-    return params

+ 1 - 1
cloudbridge/cloud/providers/aws/resources.py

@@ -146,7 +146,7 @@ class AWSInstanceType(BaseInstanceType):
 
     @property
     def id(self):
-        return self._inst_dict['instance_type']
+        return str(self._inst_dict['instance_type'])
 
     @property
     def name(self):

+ 25 - 20
cloudbridge/cloud/providers/aws/services.py

@@ -32,7 +32,6 @@ from cloudbridge.cloud.interfaces.resources import PlacementZone
 from cloudbridge.cloud.interfaces.resources import SecurityGroup
 from cloudbridge.cloud.interfaces.resources import Snapshot
 from cloudbridge.cloud.interfaces.resources import Volume
-from cloudbridge.cloud.providers.aws import helpers as awshelpers
 
 from .resources import AWSBucket
 from .resources import AWSInstance
@@ -239,26 +238,20 @@ class AWSVolumeService(BaseVolumeService):
         """
         Searches for a volume by a given list of attributes.
         """
-        filtr = awshelpers.to_filter(self.provider, limit, marker)
-        filtr['name'] = name
+        filtr = {'Name': name}
         aws_vols = self.provider.ec2_conn.get_all_volumes(filters=filtr)
         cb_vols = [AWSVolume(self.provider, vol) for vol in aws_vols]
-        return ServerPagedResultList(aws_vols.is_truncated,
-                                     aws_vols.next_token,
-                                     False,
-                                     data=cb_vols)
+        return ClientPagedResultList(self.provider, cb_vols,
+                                     limit=limit, marker=marker)
 
     def list(self, limit=None, marker=None):
         """
         List all volumes.
         """
-        filtr = awshelpers.to_filter(self.provider, limit, marker)
-        aws_vols = self.provider.ec2_conn.get_all_volumes(filters=filtr)
+        aws_vols = self.provider.ec2_conn.get_all_volumes()
         cb_vols = [AWSVolume(self.provider, vol) for vol in aws_vols]
-        return ServerPagedResultList(aws_vols.is_truncated,
-                                     aws_vols.next_token,
-                                     False,
-                                     data=cb_vols)
+        return ClientPagedResultList(self.provider, cb_vols,
+                                     limit=limit, marker=marker)
 
     def create(self, name, size, zone, snapshot=None, description=None):
         """
@@ -294,7 +287,7 @@ class AWSSnapshotService(BaseSnapshotService):
         """
         Searches for a volume by a given list of attributes.
         """
-        filtr = {'name': name}
+        filtr = {'Name': name}
         snaps = [AWSSnapshot(self.provider, snap) for snap in
                  self.provider.ec2_conn.get_all_snapshots(filters=filtr)]
         return ClientPagedResultList(self.provider, snaps,
@@ -341,12 +334,15 @@ class AWSObjectStoreService(BaseObjectStoreService):
         else:
             return None
 
-    def find(self, name):
+    def find(self, name, limit=None, marker=None):
         """
         Searches for a bucket by a given list of attributes.
         """
-        raise NotImplementedError(
-            'ObjectStoreService.find not implemented by this provider.')
+        buckets = [AWSBucket(self.provider, bucket)
+                   for bucket in self.provider.s3_conn.get_all_buckets()
+                   if name in bucket.name]
+        return ClientPagedResultList(self.provider, buckets,
+                                     limit=limit, marker=marker)
 
     def list(self, limit=None, marker=None):
         """
@@ -547,15 +543,24 @@ class AWSInstanceService(BaseInstanceService):
         else:
             return None
 
-    def find(self, name):
+    def find(self, name, limit=None, marker=None):
         """
         Searches for an instance by a given list of attributes.
 
         :rtype: ``object`` of :class:`.Instance`
         :return: an Instance object
         """
-        raise NotImplementedError(
-            'find_instance not implemented by this provider')
+        filtr = {'tag:Name': name}
+        reservations = self.provider.ec2_conn.get_all_reservations(
+            filters=filtr,
+            max_results=limit,
+            next_token=marker)
+        instances = [AWSInstance(self.provider, inst)
+                     for res in reservations
+                     for inst in res.instances]
+        return ServerPagedResultList(reservations.is_truncated,
+                                     reservations.next_token,
+                                     False, data=instances)
 
     def list(self, limit=None, marker=None):
         """

+ 17 - 6
cloudbridge/cloud/providers/openstack/services.py

@@ -413,12 +413,17 @@ class OpenStackObjectStoreService(BaseObjectStoreService):
         else:
             return None
 
-    def find(self, name):
+    def find(self, name, limit=None, marker=None):
         """
         Searches for a bucket by a given list of attributes.
         """
-        raise NotImplementedError(
-            'ObjectStoreService.find not implemented by this provider')
+        _, container_list = self.provider.swift.get_account(
+            limit=oshelpers.os_result_limit(self.provider, limit),
+            marker=marker)
+        cb_buckets = [OpenStackBucket(self.provider, c)
+                      for c in container_list
+                      if name in c.get("name")]
+        return oshelpers.to_server_paged_list(self.provider, cb_buckets, limit)
 
     def list(self, limit=None, marker=None):
         """
@@ -594,12 +599,18 @@ class OpenStackInstanceService(BaseInstanceService):
     def create_launch_config(self):
         return BaseLaunchConfig(self.provider)
 
-    def find(self, name):
+    def find(self, name, limit=None, marker=None):
         """
         Searches for an instance by a given list of attributes.
         """
-        raise NotImplementedError(
-            'find_instance not implemented by this provider')
+        search_opts = {'name': 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)
 
     def list(self, limit=None, marker=None):
         """

+ 16 - 9
test/test_compute_service.py

@@ -35,34 +35,41 @@ class CloudComputeServiceTestCase(ProviderTestBase):
 
             all_instances = self.provider.compute.instances.list()
 
-            found_instances = [i for i in all_instances if i.name == name]
+            list_instances = [i for i in all_instances if i.name == name]
             self.assertTrue(
-                len(found_instances) == 1,
+                len(list_instances) == 1,
                 "List instances does not return the expected instance %s" %
                 name)
 
             # check iteration
-            found_instances = [i for i in self.provider.compute.instances
-                               if i.name == name]
+            iter_instances = [i for i in self.provider.compute.instances
+                              if i.name == name]
             self.assertTrue(
-                len(found_instances) == 1,
+                len(iter_instances) == 1,
                 "Iter instances does not return the expected instance %s" %
                 name)
 
+            # check find
+            find_instances = self.provider.compute.instances.find(name=name)
+            self.assertTrue(
+                len(find_instances) == 1,
+                "Find instances does not return the expected instance %s" %
+                name)
+
             get_inst = self.provider.compute.instances.get(
                 inst.id)
             self.assertTrue(
-                found_instances[0] ==
+                list_instances[0] ==
                 get_inst == inst,
                 "Objects returned by list: {0} and get: {1} are not as "
-                " expected: {2}" .format(found_instances[0].id,
+                " expected: {2}" .format(list_instances[0].id,
                                          get_inst.id,
                                          inst.id))
             self.assertTrue(
-                found_instances[0].name ==
+                list_instances[0].name ==
                 get_inst.name == inst.name,
                 "Names returned by list: {0} and get: {1} are not as "
-                " expected: {2}" .format(found_instances[0].name,
+                " expected: {2}" .format(list_instances[0].name,
                                          get_inst.name,
                                          inst.name))
         deleted_inst = self.provider.compute.instances.get(

+ 14 - 7
test/test_object_store_service.py

@@ -26,27 +26,34 @@ class CloudObjectStoreServiceTestCase(ProviderTestBase):
 
             buckets = self.provider.object_store.list()
 
-            found_buckets = [c for c in buckets if c.name == name]
+            list_buckets = [c for c in buckets if c.name == name]
             self.assertTrue(
-                len(found_buckets) == 1,
+                len(list_buckets) == 1,
                 "List buckets does not return the expected bucket %s" %
                 name)
 
             # check iteration
-            found_buckets = [c for c in self.provider.object_store
-                             if c.name == name]
+            iter_buckets = [c for c in self.provider.object_store
+                            if c.name == name]
             self.assertTrue(
-                len(found_buckets) == 1,
+                len(iter_buckets) == 1,
                 "Iter buckets does not return the expected bucket %s" %
                 name)
 
+            # check find
+            find_buckets = self.provider.object_store.find(name=name)
+            self.assertTrue(
+                len(find_buckets) == 1,
+                "Find buckets does not return the expected bucket %s" %
+                name)
+
             get_bucket = self.provider.object_store.get(
                 test_bucket.id)
             self.assertTrue(
-                found_buckets[0] ==
+                list_buckets[0] ==
                 get_bucket == test_bucket,
                 "Objects returned by list: {0} and get: {1} are not as "
-                " expected: {2}" .format(found_buckets[0].id,
+                " expected: {2}" .format(list_buckets[0].id,
                                          get_bucket.id,
                                          test_bucket.name))