Updated Branches: refs/heads/trunk 9e6863c0c -> 4f5e2ef14
[LIBCLOUD-369] Add extension method for listing container objects with prefix Swift and S3 support a prefix parameter when listing a container to narrow down the result. Signed-off-by: Tomaz Muraus <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/8929aab4 Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/8929aab4 Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/8929aab4 Branch: refs/heads/trunk Commit: 8929aab4512bbe05e79a6d632bdd69e4fc28f736 Parents: 9e6863c Author: Stefan Friesel <[email protected]> Authored: Tue Aug 13 14:57:46 2013 +0200 Committer: Tomaz Muraus <[email protected]> Committed: Tue Aug 13 18:57:40 2013 +0200 ---------------------------------------------------------------------- libcloud/storage/drivers/cloudfiles.py | 32 +++++++++++++++++++++++++- libcloud/storage/drivers/s3.py | 33 ++++++++++++++++++++++++++- libcloud/test/storage/test_cloudfiles.py | 18 +++++++++++++++ libcloud/test/storage/test_s3.py | 14 ++++++++++++ 4 files changed, 95 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/8929aab4/libcloud/storage/drivers/cloudfiles.py ---------------------------------------------------------------------- diff --git a/libcloud/storage/drivers/cloudfiles.py b/libcloud/storage/drivers/cloudfiles.py index db38669..3ca6adb 100644 --- a/libcloud/storage/drivers/cloudfiles.py +++ b/libcloud/storage/drivers/cloudfiles.py @@ -644,8 +644,38 @@ class CloudFilesStorageDriver(StorageDriver, OpenStackDriverMixin): return obj - def iterate_container_objects(self, container): + def list_container_objects(self, container, ex_prefix=None): + """ + Return a list of objects for the given container. + + :param container: Container instance. + :type container: :class:`Container` + + :param ex_prefix: Only get objects with names starting with ex_prefix + :type ex_prefix: ``str`` + + :return: A list of Object instances. + :rtype: ``list`` of :class:`Object` + """ + return list(self.iterate_container_objects(container, + ex_prefix=ex_prefix)) + + def iterate_container_objects(self, container, ex_prefix=None): + """ + Return a generator of objects for the given container. + + :param container: Container instance + :type container: :class:`Container` + + :param ex_prefix: Only get objects with names starting with ex_prefix + :type ex_prefix: ``str`` + + :return: A generator of Object instances. + :rtype: ``generator`` of :class:`Object` + """ params = {} + if ex_prefix: + params['prefix'] = ex_prefix while True: response = self.connection.request('/%s' % (container.name), http://git-wip-us.apache.org/repos/asf/libcloud/blob/8929aab4/libcloud/storage/drivers/s3.py ---------------------------------------------------------------------- diff --git a/libcloud/storage/drivers/s3.py b/libcloud/storage/drivers/s3.py index 38bd723..db22c7f 100644 --- a/libcloud/storage/drivers/s3.py +++ b/libcloud/storage/drivers/s3.py @@ -227,8 +227,39 @@ class S3StorageDriver(StorageDriver): raise LibcloudError('Unexpected status code: %s' % (response.status), driver=self) - def iterate_container_objects(self, container): + def list_container_objects(self, container, ex_prefix=None): + """ + Return a list of objects for the given container. + + :param container: Container instance. + :type container: :class:`Container` + + :param ex_prefix: Only return objects starting with ex_prefix + :type ex_prefix: ``str`` + + :return: A list of Object instances. + :rtype: ``list`` of :class:`Object` + """ + return list(self.iterate_container_objects(container, + ex_prefix=ex_prefix)) + + def iterate_container_objects(self, container, ex_prefix=None): + """ + Return a generator of objects for the given container. + + :param container: Container instance + :type container: :class:`Container` + + :param ex_prefix: Only return objects starting with ex_prefix + :type ex_prefix: ``str`` + + :return: A generator of Object instances. + :rtype: ``generator`` of :class:`Object` + """ params = {} + if ex_prefix: + params['prefix'] = ex_prefix + last_key = None exhausted = False container_path = self._get_container_path(container) http://git-wip-us.apache.org/repos/asf/libcloud/blob/8929aab4/libcloud/test/storage/test_cloudfiles.py ---------------------------------------------------------------------- diff --git a/libcloud/test/storage/test_cloudfiles.py b/libcloud/test/storage/test_cloudfiles.py index 524d549..e5e0330 100644 --- a/libcloud/test/storage/test_cloudfiles.py +++ b/libcloud/test/storage/test_cloudfiles.py @@ -188,6 +188,24 @@ class CloudFilesTests(unittest.TestCase): self.assertEqual(obj.size, 1160520) self.assertEqual(obj.container.name, 'test_container') + def test_list_container_objects_with_prefix(self): + CloudFilesMockHttp.type = 'EMPTY' + container = Container( + name='test_container', extra={}, driver=self.driver) + objects = self.driver.list_container_objects(container=container, + ex_prefix='test_prefix1') + self.assertEqual(len(objects), 0) + + CloudFilesMockHttp.type = None + objects = self.driver.list_container_objects(container=container, + ex_prefix='test_prefix2') + self.assertEqual(len(objects), 4) + + obj = [o for o in objects if o.name == 'foo test 1'][0] + self.assertEqual(obj.hash, '16265549b5bda64ecdaa5156de4c97cc') + self.assertEqual(obj.size, 1160520) + self.assertEqual(obj.container.name, 'test_container') + def test_list_container_objects_iterator(self): CloudFilesMockHttp.type = 'ITERATOR' container = Container( http://git-wip-us.apache.org/repos/asf/libcloud/blob/8929aab4/libcloud/test/storage/test_s3.py ---------------------------------------------------------------------- diff --git a/libcloud/test/storage/test_s3.py b/libcloud/test/storage/test_s3.py index 2287d5c..9de324e 100644 --- a/libcloud/test/storage/test_s3.py +++ b/libcloud/test/storage/test_s3.py @@ -476,6 +476,20 @@ class S3Tests(unittest.TestCase): self.assertTrue(obj in objects) self.assertEqual(len(objects), 5) + def test_list_container_objects_with_prefix(self): + self.mock_response_klass.type = None + container = Container(name='test_container', extra={}, + driver=self.driver) + objects = self.driver.list_container_objects(container=container, + ex_prefix='test_prefix') + self.assertEqual(len(objects), 1) + + obj = [o for o in objects if o.name == '1.zip'][0] + self.assertEqual(obj.hash, '4397da7a7649e8085de9916c240e8166') + self.assertEqual(obj.size, 1234567) + self.assertEqual(obj.container.name, 'test_container') + self.assertTrue('owner' in obj.meta_data) + def test_get_container_doesnt_exist(self): self.mock_response_klass.type = 'list_containers' try:
