Repository: libcloud Updated Branches: refs/heads/trunk 688ec7550 -> 6869ebc1d
Customize HTTP vendor prefix for Google Storage Google storage uses/expects custom headers like meta data and storage class to be prefixed with "x-goog" instead of "x-amz". This enables use of object tagging in the Google Storage provider. Closes #356 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/d1b6bb74 Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/d1b6bb74 Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/d1b6bb74 Branch: refs/heads/trunk Commit: d1b6bb749af5d5162c7fed4c538adb1fe3f1e9f6 Parents: 688ec75 Author: Stefan Friesel <[email protected]> Authored: Tue Sep 9 18:23:34 2014 +0200 Committer: Tomaz Muraus <[email protected]> Committed: Sat Sep 13 19:46:28 2014 +0200 ---------------------------------------------------------------------- CHANGES.rst | 5 +++++ libcloud/storage/drivers/google_storage.py | 1 + libcloud/storage/drivers/s3.py | 12 +++++++----- libcloud/test/storage/test_google_storage.py | 18 ++++++++++++++++++ 4 files changed, 31 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/d1b6bb74/CHANGES.rst ---------------------------------------------------------------------- diff --git a/CHANGES.rst b/CHANGES.rst index c7e0a1e..1495ea7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -104,6 +104,11 @@ Storage - Fix a bug with CDN requests in the CloudFiles driver. [Tomaz Muraus] +- Fix a bug with not being able to specify meta_data / tags when uploading an + object using Google Storage driver. + (LIBCLOUD-612, GITHUB-356) + [Stefan Friesel] + Loadbalancer ~~~~~~~~~~~~ http://git-wip-us.apache.org/repos/asf/libcloud/blob/d1b6bb74/libcloud/storage/drivers/google_storage.py ---------------------------------------------------------------------- diff --git a/libcloud/storage/drivers/google_storage.py b/libcloud/storage/drivers/google_storage.py index 9caca9b..0bc9583 100644 --- a/libcloud/storage/drivers/google_storage.py +++ b/libcloud/storage/drivers/google_storage.py @@ -134,3 +134,4 @@ class GoogleStorageDriver(BaseS3StorageDriver): namespace = NAMESPACE supports_chunked_encoding = False supports_s3_multipart_upload = False + http_vendor_prefix = 'x-goog' http://git-wip-us.apache.org/repos/asf/libcloud/blob/d1b6bb74/libcloud/storage/drivers/s3.py ---------------------------------------------------------------------- diff --git a/libcloud/storage/drivers/s3.py b/libcloud/storage/drivers/s3.py index 862f076..cd7eb8a 100644 --- a/libcloud/storage/drivers/s3.py +++ b/libcloud/storage/drivers/s3.py @@ -227,6 +227,7 @@ class BaseS3StorageDriver(StorageDriver): supports_s3_multipart_upload = True ex_location_name = '' namespace = NAMESPACE + http_vendor_prefix = 'x-amz' def iterate_containers(self): response = self.connection.request('/') @@ -799,7 +800,8 @@ class BaseS3StorageDriver(StorageDriver): raise ValueError( 'Invalid storage class value: %s' % (storage_class)) - headers['x-amz-storage-class'] = storage_class.upper() + key = self.http_vendor_prefix + '-storage-class' + headers[key] = storage_class.upper() content_type = extra.get('content_type', None) meta_data = extra.get('meta_data', None) @@ -807,11 +809,11 @@ class BaseS3StorageDriver(StorageDriver): if meta_data: for key, value in list(meta_data.items()): - key = 'x-amz-meta-%s' % (key) + key = self.http_vendor_prefix + '-meta-%s' % (key) headers[key] = value if acl: - headers['x-amz-acl'] = acl + headers[self.http_vendor_prefix + '-acl'] = acl request_path = self._get_object_path(container, object_name) @@ -883,10 +885,10 @@ class BaseS3StorageDriver(StorageDriver): extra['last_modified'] = headers['last-modified'] for key, value in headers.items(): - if not key.lower().startswith('x-amz-meta-'): + if not key.lower().startswith(self.http_vendor_prefix + '-meta-'): continue - key = key.replace('x-amz-meta-', '') + key = key.replace(self.http_vendor_prefix + '-meta-', '') meta_data[key] = value obj = Object(name=object_name, size=headers['content-length'], http://git-wip-us.apache.org/repos/asf/libcloud/blob/d1b6bb74/libcloud/test/storage/test_google_storage.py ---------------------------------------------------------------------- diff --git a/libcloud/test/storage/test_google_storage.py b/libcloud/test/storage/test_google_storage.py index ed6dd57..bd33572 100644 --- a/libcloud/test/storage/test_google_storage.py +++ b/libcloud/test/storage/test_google_storage.py @@ -16,6 +16,8 @@ import sys import unittest +from libcloud.utils.py3 import httplib + from libcloud.storage.drivers.google_storage import GoogleStorageDriver from libcloud.test.storage.test_s3 import S3Tests, S3MockHttp @@ -26,6 +28,22 @@ from libcloud.test.secrets import STORAGE_GOOGLE_STORAGE_PARAMS class GoogleStorageMockHttp(S3MockHttp): fixtures = StorageFileFixtures('google_storage') + def _test2_test_get_object(self, method, url, body, headers): + # test_get_object + # Google uses a different HTTP header prefix for meta data + body = self.fixtures.load('list_containers.xml') + headers = {'content-type': 'application/zip', + 'etag': '"e31208wqsdoj329jd"', + 'x-goog-meta-rabbits': 'monkeys', + 'content-length': 12345, + 'last-modified': 'Thu, 13 Sep 2012 07:13:22 GMT' + } + + return (httplib.OK, + body, + headers, + httplib.responses[httplib.OK]) + class GoogleStorageTests(S3Tests): driver_type = GoogleStorageDriver
