From: marios <[email protected]>
Signed-off-by: marios <[email protected]> --- .../lib/deltacloud/drivers/azure/azure_driver.rb | 2 +- server/lib/deltacloud/drivers/ec2/ec2_driver.rb | 4 ++-- server/lib/deltacloud/drivers/mock/mock_driver.rb | 11 +++++------ .../drivers/rackspace/rackspace_driver.rb | 4 ++-- server/lib/deltacloud/helpers/blob_stream.rb | 18 ++++++++++++++++-- server/server.rb | 6 ++---- 6 files changed, 28 insertions(+), 17 deletions(-) diff --git a/server/lib/deltacloud/drivers/azure/azure_driver.rb b/server/lib/deltacloud/drivers/azure/azure_driver.rb index 3dcb768..09372e0 100644 --- a/server/lib/deltacloud/drivers/azure/azure_driver.rb +++ b/server/lib/deltacloud/drivers/azure/azure_driver.rb @@ -105,7 +105,7 @@ class AzureDriver < Deltacloud::BaseDriver def create_blob(credentials, bucket_id, blob_id, blob_data, opts={}) azure_connect(credentials) #insert azure-specific header for user metadata ... x-ms-meta-kEY = VALUE - opts.gsub_keys("HTTP_X_Deltacloud_Blobmeta_", "x-ms-meta-") + BlobHelper::rename_metadata_headers(opts, "x-ms-meta-") safely do #get a handle to the bucket in order to put there the_bucket = WAZ::Blobs::Container.find(bucket_id) diff --git a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb index 4fff243..0b7e846 100644 --- a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb +++ b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb @@ -410,7 +410,7 @@ module Deltacloud # File stream needs to be reopened in binary mode for whatever reason file = File::open(data[:tempfile].path, 'rb') #insert ec2-specific header for user metadata ... x-amz-meta-KEY = VALUE - opts.gsub_keys('HTTP_X_Deltacloud_Blobmeta_', 'x-amz-meta-') + BlobHelper::rename_metadata_headers(opts, 'x-amz-meta-') opts["Content-Type"] = data[:type] safely do res = s3_client.interface.put(bucket_id, @@ -456,7 +456,7 @@ module Deltacloud metadata = params[:metadata] signature_meta_string = "" unless metadata.nil? - metadata.gsub_keys('HTTP[-_]X[-_]Deltacloud[-_]Blobmeta[-_]', 'x-amz-meta-') + BlobHelper::rename_metadata_headers(metadata, 'x-amz-meta-') keys_array = metadata.keys.sort! keys_array.each {|k| signature_meta_string << "#{k}:#{metadata[k]}\n"} end diff --git a/server/lib/deltacloud/drivers/mock/mock_driver.rb b/server/lib/deltacloud/drivers/mock/mock_driver.rb index 9697e5b..dd237a1 100644 --- a/server/lib/deltacloud/drivers/mock/mock_driver.rb +++ b/server/lib/deltacloud/drivers/mock/mock_driver.rb @@ -428,16 +428,15 @@ class MockDriver < Deltacloud::BaseDriver # Create blob #-- def create_blob(credentials, bucket_id, blob_id, blob_data, opts={}) - check_credentials(credentials) - blob_meta = {} - opts.inject({}){|result, (k,v)| blob_meta[k] = v if k.match(/X[_-]Deltacloud[_-]Blobmeta[_-]/i)} #select{|k,v| k.match(/X[_-]Deltacloud[_-]Blobmeta[_-]/i)} - blob = { + check_credentials(credentials) + blob_meta = BlobHelper::extract_blob_metadata_hash(opts) + blob = { :id => blob_id, :bucket => bucket_id, :content_length => blob_data[:tempfile].length, :content_type => blob_data[:type], :last_modified => Time.now, - :user_metadata => blob_meta.gsub_keys('X_Deltacloud_Blobmeta_', ''), + :user_metadata => BlobHelper::rename_metadata_headers(blob_meta, ''), :content => blob_data[:tempfile].read } File.open( File::join("#{@storage_root}", "buckets", "blobs", "#{blob_id}.yml"), 'w' ) {|b| YAML.dump( blob, b )} @@ -482,7 +481,7 @@ class MockDriver < Deltacloud::BaseDriver safely do blob = YAML.load_file(blobfile) return false unless blob - blob[:user_metadata] = opts['meta_hash'].gsub_keys('HTTP[-_]X[-_]Deltacloud[-_]Blobmeta[-_]', '') + blob[:user_metadata] = BlobHelper::rename_metadata_headers(opts['meta_hash'], '') File.open(File::join("#{@storage_root}", "buckets", "blobs", "#{opts[:id]}.yml"), 'w' ) {|b| YAML.dump( blob, b )} end end diff --git a/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb b/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb index 0cebb83..d09e0de 100644 --- a/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb +++ b/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb @@ -262,7 +262,7 @@ class RackspaceDriver < Deltacloud::BaseDriver def create_blob(credentials, bucket_id, blob_id, blob_data, opts={}) cf = cloudfiles_client(credentials) #insert ec2-specific header for user metadata ... X-Object-Meta-KEY = VALUE - opts.gsub_keys("HTTP_X_Deltacloud_Blobmeta_", "X-Object-Meta-") + BlobHelper::rename_metadata_headers(opts, "X-Object-Meta-)" opts['Content-Type'] = blob_data[:type] object = nil safely do @@ -311,7 +311,7 @@ class RackspaceDriver < Deltacloud::BaseDriver cf = cloudfiles_client(credentials) meta_hash = opts['meta_hash'] #the set_metadata method actually places the 'X-Object-Meta-' prefix for us: - meta_hash.gsub_keys('HTTP_X_Deltacloud_Blobmeta_', '') + BlobHelper::rename_metadata_headers(meta_hash, '') safely do blob = cf.container(opts['bucket']).object(opts[:id]) blob.set_metadata(meta_hash) diff --git a/server/lib/deltacloud/helpers/blob_stream.rb b/server/lib/deltacloud/helpers/blob_stream.rb index 440529b..c2f714c 100644 --- a/server/lib/deltacloud/helpers/blob_stream.rb +++ b/server/lib/deltacloud/helpers/blob_stream.rb @@ -81,6 +81,21 @@ class Hash end +module BlobHelper + + def self.extract_blob_metadata_hash(env_hash) + meta_array = env_hash.select{|k,v| k.match(/^HTTP[-_]X[-_]Deltacloud[-_]Blobmeta[-_]/i)} + metadata = meta_array.inject({}){ |result, array| result[array.first.upcase] = array.last; result} + metadata + end + + #e.g. from HTTP-X-Deltacloud-Blobmeta-FOO:BAR to amz-meta-FOO:BAR + def self.rename_metadata_headers(metadata, rename_to) + metadata.gsub_keys('HTTP[-_]X[-_]Deltacloud[-_]Blobmeta[-_]', rename_to) + end + +end + #Monkey patch for streaming blobs: # Normally a client will upload a blob to deltacloud and thin will put # this into a tempfile. Then deltacloud would stream up to the provider: @@ -156,8 +171,7 @@ class BlobStreamIO user, password = parse_credentials(request.env['HTTP_AUTHORIZATION']) content_type = request.env['CONTENT_TYPE'] || "" #deal with blob_metadata: (X-Deltacloud-Blobmeta-name: value) - meta_array = request.env.select{|k,v| k.match(/^HTTP[-_]X[-_]Deltacloud[-_]Blobmeta[-_]/i)} - user_meta = meta_array.inject({}){ |result, array| result[array.first.upcase] = array.last; result} + user_meta = BlobHelper::extract_blob_metadata_hash(request.env) @content_length = request.env['CONTENT_LENGTH'] @http, provider_request = driver.blob_stream_connection({:user=>user, :password=>password, :bucket=>bucket, :blob=>blob, :metadata=> user_meta, diff --git a/server/server.rb b/server/server.rb index 32d0e33..e6ccd7c 100644 --- a/server/server.rb +++ b/server/server.rb @@ -719,8 +719,7 @@ put "#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/buckets/:bucket/:blob" do temp_file.flush content_type = env['CONTENT_TYPE'] || "" blob_data = {:tempfile => temp_file, :type => content_type} - meta_array = request.env.select{|k,v| k.match(/^HTTP[-_]X[-_]Deltacloud[-_]Blobmeta[-_]/i)} - user_meta = meta_array.inject({}){ |result, array| result[array.first.upcase] = array.last; result} + user_meta = BlobHelper::extract_blob_metadata_hash(request.env) @blob = driver.create_blob(credentials, bucket_id, blob_id, blob_data, user_meta) temp_file.delete respond_to do |format| @@ -780,8 +779,7 @@ end #update blob metadata post "#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/buckets/:bucket/:blob" do - meta_hash = {} - request.env.inject({}){|current, (k,v)| meta_hash[k] = v if k.match(/^HTTP[-_]X[-_]Deltacloud[-_]Blobmeta[-_]/i)} + meta_hash = BlobHelper::extract_blob_metadata_hash(request.env) success = driver.update_blob_metadata(credentials, {'bucket'=>params[:bucket], :id =>params[:blob], 'meta_hash' => meta_hash}) if(success) meta_hash.each do |k,v| -- 1.7.3.4
