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

Reply via email to