Переглянути джерело

Added find to block_store (vols+snapshots)

Nuwan Goonasekera 10 роки тому
батько
коміт
60a8d744fb

+ 2 - 2
cloudbridge/cloud/interfaces/services.py

@@ -277,7 +277,7 @@ class VolumeService(PageableObjectMixin, ProviderService):
         pass
         pass
 
 
     @abstractmethod
     @abstractmethod
-    def find(self, name):
+    def find(self, name, limit=None, marker=None):
         """
         """
         Searches for a volume by a given list of attributes.
         Searches for a volume by a given list of attributes.
 
 
@@ -340,7 +340,7 @@ class SnapshotService(PageableObjectMixin, ProviderService):
         pass
         pass
 
 
     @abstractmethod
     @abstractmethod
-    def find(self, name):
+    def find(self, name, limit=None, marker=None):
         """
         """
         Searches for a snapshot by a given list of attributes.
         Searches for a snapshot by a given list of attributes.
 
 

+ 15 - 6
cloudbridge/cloud/providers/aws/services.py

@@ -235,12 +235,18 @@ class AWSVolumeService(BaseVolumeService):
         vols = self.provider.ec2_conn.get_all_volumes(volume_ids=[volume_id])
         vols = self.provider.ec2_conn.get_all_volumes(volume_ids=[volume_id])
         return AWSVolume(self.provider, vols[0]) if vols else None
         return AWSVolume(self.provider, vols[0]) if vols else None
 
 
-    def find(self, name):
+    def find(self, name, limit=None, marker=None):
         """
         """
         Searches for a volume by a given list of attributes.
         Searches for a volume by a given list of attributes.
         """
         """
-        raise NotImplementedError(
-            'find_volume not implemented by this provider')
+        filtr = awshelpers.to_filter(self.provider, limit, marker)
+        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)
 
 
     def list(self, limit=None, marker=None):
     def list(self, limit=None, marker=None):
         """
         """
@@ -284,12 +290,15 @@ class AWSSnapshotService(BaseSnapshotService):
             snapshot_ids=[snapshot_id])
             snapshot_ids=[snapshot_id])
         return AWSSnapshot(self.provider, snaps[0]) if snaps else None
         return AWSSnapshot(self.provider, snaps[0]) if snaps else None
 
 
-    def find(self, name):
+    def find(self, name, limit=None, marker=None):
         """
         """
         Searches for a volume by a given list of attributes.
         Searches for a volume by a given list of attributes.
         """
         """
-        raise NotImplementedError(
-            'find_volume not implemented by this provider')
+        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,
+                                     limit=limit, marker=marker)
 
 
     def list(self, limit=None, marker=None):
     def list(self, limit=None, marker=None):
         """
         """

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

@@ -301,12 +301,19 @@ class OpenStackVolumeService(BaseVolumeService):
         except CinderNotFound:
         except CinderNotFound:
             return None
             return None
 
 
-    def find(self, name):
+    def find(self, name, limit=None, marker=None):
         """
         """
         Searches for a volume by a given list of attributes.
         Searches for a volume by a given list of attributes.
         """
         """
-        raise NotImplementedError(
-            'find_volume not implemented by this provider')
+        search_opts = {'name': 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)]
+
+        return oshelpers.to_server_paged_list(self.provider, cb_vols, limit)
 
 
     def list(self, limit=None, marker=None):
     def list(self, limit=None, marker=None):
         """
         """
@@ -350,12 +357,19 @@ class OpenStackSnapshotService(BaseSnapshotService):
         except CinderNotFound:
         except CinderNotFound:
             return None
             return None
 
 
-    def find(self, name):
+    def find(self, name, limit=None, marker=None):
         """
         """
         Searches for a volume by a given list of attributes.
         Searches for a volume by a given list of attributes.
         """
         """
-        raise NotImplementedError(
-            'find_volume not implemented by this provider')
+        search_opts = {'name': name,
+                       'limit': oshelpers.os_result_limit(self.provider,
+                                                          limit),
+                       'marker': marker}
+        cb_snaps = [
+            OpenStackSnapshot(self.provider, snap) for
+            snap in self.provider.cinder.volume_snapshots.list(search_opts)]
+
+        return oshelpers.to_server_paged_list(self.provider, cb_snaps, limit)
 
 
     def list(self, limit=None, marker=None):
     def list(self, limit=None, marker=None):
         """
         """

+ 32 - 18
test/test_block_store_service.py

@@ -37,34 +37,41 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
                 "repr(obj) should contain the object id so that the object"
                 "repr(obj) should contain the object id so that the object"
                 " can be reconstructed, but does not. eval(repr(obj)) == obj")
                 " can be reconstructed, but does not. eval(repr(obj)) == obj")
             volumes = self.provider.block_store.volumes.list()
             volumes = self.provider.block_store.volumes.list()
-            found_volumes = [vol for vol in volumes if vol.name == name]
+            list_volumes = [vol for vol in volumes if vol.name == name]
             self.assertTrue(
             self.assertTrue(
-                len(found_volumes) == 1,
+                len(list_volumes) == 1,
                 "List volumes does not return the expected volume %s" %
                 "List volumes does not return the expected volume %s" %
                 name)
                 name)
 
 
             # check iteration
             # check iteration
-            found_volumes = [vol for vol in self.provider.block_store.volumes
-                             if vol.name == name]
+            iter_volumes = [vol for vol in self.provider.block_store.volumes
+                            if vol.name == name]
             self.assertTrue(
             self.assertTrue(
-                len(found_volumes) == 1,
+                len(iter_volumes) == 1,
                 "Iter volumes does not return the expected volume %s" %
                 "Iter volumes does not return the expected volume %s" %
                 name)
                 name)
 
 
+            # check find
+            find_volumes = self.provider.block_store.volumes.find(name=name)
+            self.assertTrue(
+                len(find_volumes) == 1,
+                "Find volumes does not return the expected volume %s" %
+                name)
+
             get_vol = self.provider.block_store.volumes.get(
             get_vol = self.provider.block_store.volumes.get(
                 test_vol.id)
                 test_vol.id)
             self.assertTrue(
             self.assertTrue(
-                found_volumes[0] ==
+                list_volumes[0] ==
                 get_vol == test_vol,
                 get_vol == test_vol,
                 "Ids returned by list: {0} and get: {1} are not as "
                 "Ids returned by list: {0} and get: {1} are not as "
-                " expected: {2}" .format(found_volumes[0].id,
+                " expected: {2}" .format(list_volumes[0].id,
                                          get_vol.id,
                                          get_vol.id,
                                          test_vol.id))
                                          test_vol.id))
             self.assertTrue(
             self.assertTrue(
-                found_volumes[0].name ==
+                list_volumes[0].name ==
                 get_vol.name == test_vol.name,
                 get_vol.name == test_vol.name,
                 "Names returned by list: {0} and get: {1} are not as "
                 "Names returned by list: {0} and get: {1} are not as "
-                " expected: {2}" .format(found_volumes[0].name,
+                " expected: {2}" .format(list_volumes[0].name,
                                          get_vol.name,
                                          get_vol.name,
                                          test_vol.name))
                                          test_vol.name))
         volumes = self.provider.block_store.volumes.list()
         volumes = self.provider.block_store.volumes.list()
@@ -133,36 +140,43 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
                     " can be reconstructed, but does not.")
                     " can be reconstructed, but does not.")
 
 
                 snaps = self.provider.block_store.snapshots.list()
                 snaps = self.provider.block_store.snapshots.list()
-                found_snaps = [snap for snap in snaps
-                               if snap.name == snap_name]
+                list_snaps = [snap for snap in snaps
+                              if snap.name == snap_name]
                 self.assertTrue(
                 self.assertTrue(
-                    len(found_snaps) == 1,
+                    len(list_snaps) == 1,
                     "List snapshots does not return the expected volume %s" %
                     "List snapshots does not return the expected volume %s" %
                     name)
                     name)
 
 
                 # check iteration
                 # check iteration
-                found_snaps = [
+                iter_snaps = [
                     snap for snap in self.provider.block_store.snapshots
                     snap for snap in self.provider.block_store.snapshots
                     if snap.name == snap_name]
                     if snap.name == snap_name]
                 self.assertTrue(
                 self.assertTrue(
-                    len(found_snaps) == 1,
+                    len(iter_snaps) == 1,
                     "Iter snapshots does not return the expected volume %s" %
                     "Iter snapshots does not return the expected volume %s" %
                     name)
                     name)
 
 
+                # check find
+                find_snap = self.provider.block_store.snapshots.find(name=name)
+                self.assertTrue(
+                    len(find_snap) == 1,
+                    "Find snaps does not return the expected volume %s" %
+                    name)
+
                 get_snap = self.provider.block_store.snapshots.get(
                 get_snap = self.provider.block_store.snapshots.get(
                     test_snap.id)
                     test_snap.id)
                 self.assertTrue(
                 self.assertTrue(
-                    found_snaps[0] ==
+                    list_snaps[0] ==
                     get_snap == test_snap,
                     get_snap == test_snap,
                     "Ids returned by list: {0} and get: {1} are not as "
                     "Ids returned by list: {0} and get: {1} are not as "
-                    " expected: {2}" .format(found_snaps[0].id,
+                    " expected: {2}" .format(list_snaps[0].id,
                                              get_snap.id,
                                              get_snap.id,
                                              test_snap.id))
                                              test_snap.id))
                 self.assertTrue(
                 self.assertTrue(
-                    found_snaps[0].name ==
+                    list_snaps[0].name ==
                     get_snap.name == test_snap.name,
                     get_snap.name == test_snap.name,
                     "Names returned by list: {0} and get: {1} are not as "
                     "Names returned by list: {0} and get: {1} are not as "
-                    " expected: {2}" .format(found_snaps[0].name,
+                    " expected: {2}" .format(list_snaps[0].name,
                                              get_snap.name,
                                              get_snap.name,
                                              test_snap.name))
                                              test_snap.name))
             snaps = self.provider.block_store.snapshots.list()
             snaps = self.provider.block_store.snapshots.list()

+ 1 - 1
test/test_image_service.py

@@ -73,7 +73,7 @@ class CloudImageServiceTestCase(ProviderTestBase):
                 get_img = self.provider.compute.images.get(
                 get_img = self.provider.compute.images.get(
                     test_image.id)
                     test_image.id)
                 self.assertTrue(
                 self.assertTrue(
-                    iter_images[0] == get_img == test_image,
+                    found_images[0] == iter_images[0] == get_img == test_image,
                     "Objects returned by list: {0} and get: {1} are not as "
                     "Objects returned by list: {0} and get: {1} are not as "
                     " expected: {2}" .format(found_images[0].id,
                     " expected: {2}" .format(found_images[0].id,
                                              get_img.id,
                                              get_img.id,