瀏覽代碼

Added basic find support for images.

nuwan_ag 10 年之前
父節點
當前提交
12d7b2fc1e

+ 8 - 3
cloudbridge/cloud/providers/aws/services.py

@@ -376,12 +376,17 @@ class AWSImageService(BaseImageService):
 
         return None
 
-    def find(self, name):
+    def find(self, name, limit=None, marker=None):
         """
         Searches for an image by a given list of attributes
         """
-        raise NotImplementedError(
-            'find_image not implemented by this provider')
+        filters = {
+            'name': name
+        }
+        images = [AWSMachineImage(self.provider, image) for image in
+                  self.provider.ec2_conn.get_all_images(filters=filters)]
+        return ClientPagedResultList(self.provider, images,
+                                     limit=limit, marker=marker)
 
     def list(self, limit=None, marker=None):
         """

+ 10 - 3
cloudbridge/cloud/providers/openstack/services.py

@@ -1,6 +1,8 @@
 """
 Services implemented by the OpenStack provider.
 """
+import fnmatch
+import re
 from cinderclient.exceptions import NotFound as CinderNotFound
 from novaclient.exceptions import NotFound as NovaNotFound
 
@@ -219,12 +221,17 @@ class OpenStackImageService(BaseImageService):
         except NovaNotFound:
             return None
 
-    def find(self, name):
+    def find(self, name, limit=None, marker=None):
         """
         Searches for an image by a given list of attributes
         """
-        raise NotImplementedError(
-            'find_image not implemented by this provider')
+        regex = fnmatch.translate(name)
+        cb_images = [
+            OpenStackMachineImage(self.provider, img)
+            for img in self
+            if img.name and re.search(regex, img.name)]
+
+        return oshelpers.to_server_paged_list(self.provider, cb_images, limit)
 
     def list(self, limit=None, marker=None):
         """

+ 19 - 11
test/test_image_service.py

@@ -48,16 +48,23 @@ class CloudImageServiceTestCase(ProviderTestBase):
                     "Image description must be None or a string")
 
                 images = self.provider.compute.images.list()
-                found_images = [image for image in images
-                                if image.name == name]
+                list_images = [image for image in images
+                               if image.name == name]
                 self.assertTrue(
-                    len(found_images) == 1,
+                    len(list_images) == 1,
                     "List images does not return the expected image %s" %
                     name)
 
                 # check iteration
-                found_images = [image for image in self.provider.compute.images
-                                if image.name == name]
+                iter_images = [image for image in self.provider.compute.images
+                               if image.name == name]
+                self.assertTrue(
+                    len(iter_images) == 1,
+                    "Iter images does not return the expected image %s" %
+                    name)
+
+                # find image
+                found_images = self.provider.compute.images.find(name=name)
                 self.assertTrue(
                     len(found_images) == 1,
                     "Iter images does not return the expected image %s" %
@@ -66,18 +73,19 @@ class CloudImageServiceTestCase(ProviderTestBase):
                 get_img = self.provider.compute.images.get(
                     test_image.id)
                 self.assertTrue(
-                    found_images[0] == get_img == test_image,
+                    iter_images[0] == get_img == test_image,
                     "Objects returned by list: {0} and get: {1} are not as "
                     " expected: {2}" .format(found_images[0].id,
                                              get_img.id,
                                              test_image.id))
                 self.assertTrue(
-                    found_images[0].name ==
+                    list_images[0].name == found_images[0].name ==
                     get_img.name == test_image.name,
-                    "Names returned by list: {0} and get: {1} are not as "
-                    " expected: {2}" .format(found_images[0].name,
-                                             get_img.name,
-                                             test_image.name))
+                    "Names returned by list: {0}, find: {1} and get: {2} are"
+                    " not as expected: {3}" .format(list_images[0].name,
+                                                    found_images[0].name,
+                                                    get_img.name,
+                                                    test_image.name))
             # TODO: Images take a long time to deregister on EC2. Needs
             # investigation
             images = self.provider.compute.images.list()