You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltacloud.apache.org by ma...@apache.org on 2011/06/10 18:15:07 UTC

svn commit: r1134368 - in /incubator/deltacloud/trunk/server: ./ lib/deltacloud/drivers/azure/ lib/deltacloud/drivers/ec2/ lib/deltacloud/drivers/mock/ lib/deltacloud/drivers/rackspace/ lib/deltacloud/helpers/

Author: marios
Date: Fri Jun 10 16:15:06 2011
New Revision: 1134368

URL: http://svn.apache.org/viewvc?rev=1134368&view=rev
Log:
Tidying up of repetitive code into helper: extraction of blob
metadata headers and renaming of the metadata header prefix
('X-Deltacloud-Blobmeta-KEY:VAL' ==> 'x-amz-meta-KEY:VAL')
are now in a BlobHelper module (in /helpers/blob_stream.rb

Modified:
    incubator/deltacloud/trunk/server/lib/deltacloud/drivers/azure/azure_driver.rb
    incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
    incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/mock_driver.rb
    incubator/deltacloud/trunk/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
    incubator/deltacloud/trunk/server/lib/deltacloud/helpers/blob_stream.rb
    incubator/deltacloud/trunk/server/server.rb

Modified: incubator/deltacloud/trunk/server/lib/deltacloud/drivers/azure/azure_driver.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/drivers/azure/azure_driver.rb?rev=1134368&r1=1134367&r2=1134368&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/drivers/azure/azure_driver.rb (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/drivers/azure/azure_driver.rb Fri Jun 10 16:15:06 2011
@@ -105,7 +105,7 @@ class AzureDriver < Deltacloud::BaseDriv
   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)
@@ -116,7 +116,7 @@ class AzureDriver < Deltacloud::BaseDriv
                 :content_lengh => blob_data[:tempfile].length,
                 :content_type => blob_data[:type],
                 :last_modified => '',
-                :user_metadata => opts.gsub_keys('x-ms-meta-','')
+                :user_metadata => opts.gsub_keys(/x-ms-meta-/,'')
             } )
   end
 
@@ -144,7 +144,7 @@ class AzureDriver < Deltacloud::BaseDriv
     end
     user_meta = {}
     all_meta.inject({}){|result_hash, (k,v)| user_meta[k]=v if k.to_s.match(/x_ms_meta/i)}
-    user_meta.gsub_keys('x_ms_meta_','')
+    user_meta.gsub_keys(/x_ms_meta_/,'')
   end
 
 #-
@@ -153,7 +153,7 @@ class AzureDriver < Deltacloud::BaseDriv
   def update_blob_metadata(credentials, opts={})
     azure_connect(credentials)
     meta_hash = opts['meta_hash']
-    meta_hash.gsub_keys("HTTP_X_Deltacloud_Blobmeta_", "x-ms-meta-")
+    BlobHelper::rename_metadata_headers(meta_hash, "x-ms-meta-")
     safely do
       the_blob = WAZ::Blobs::Container.find(opts['bucket'])[opts[:id]]
       the_blob.put_metadata!(meta_hash)
@@ -189,7 +189,7 @@ class AzureDriver < Deltacloud::BaseDriv
     blob_metadata = {}
     waz_blob.metadata.inject({}) { |result_hash, (k,v)| blob_metadata[k]=v if k.to_s.match(/x_ms_meta/i)}
     #strip off the x_ms_meta_ from each key
-    blob_metadata.gsub_keys('x_ms_meta_', '')
+    blob_metadata.gsub_keys(/x_ms_meta_/, '')
     Blob.new({   :id => waz_blob.name,
                  :bucket => bucket,
                  :content_length => waz_blob.metadata[:content_length],

Modified: incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb?rev=1134368&r1=1134367&r2=1134368&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb Fri Jun 10 16:15:06 2011
@@ -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,
@@ -453,13 +453,11 @@ module Deltacloud
         def blob_stream_connection(params)
           #canonicalise metadata:
           #http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?RESTAuthentication.html
-          metadata = params[:metadata]
+          metadata = params[:metadata] || {}
           signature_meta_string = ""
-          unless metadata.nil?
-            metadata.gsub_keys('HTTP[-_]X[-_]Deltacloud[-_]Blobmeta[-_]', 'x-amz-meta-')
-            keys_array = metadata.keys.sort!
-            keys_array.each {|k| signature_meta_string << "#{k}:#{metadata[k]}\n"}
-          end
+          BlobHelper::rename_metadata_headers(metadata, 'x-amz-meta-')
+          keys_array = metadata.keys.sort!
+          keys_array.each {|k| signature_meta_string << "#{k}:#{metadata[k]}\n"}
           provider = "https://#{endpoint_for_service(:s3)}"
           uri = URI.parse(provider)
           http = Net::HTTP.new("#{params[:bucket]}.#{uri.host}", uri.port )
@@ -476,9 +474,7 @@ module Deltacloud
           request['Content-Length'] = params[:content_length]
           request['Authorization'] = "AWS #{params[:user]}:#{auth_string}"
           request['Expect'] = "100-continue"
-          unless metadata.nil?
-            metadata.each{|k,v| request[k] = v}
-          end
+          metadata.each{|k,v| request[k] = v}
           return http, request
         end
 

Modified: incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/mock_driver.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/mock_driver.rb?rev=1134368&r1=1134367&r2=1134368&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/mock_driver.rb (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/mock_driver.rb Fri Jun 10 16:15:06 2011
@@ -428,16 +428,15 @@ class MockDriver < Deltacloud::BaseDrive
 # 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::BaseDrive
     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

Modified: incubator/deltacloud/trunk/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb?rev=1134368&r1=1134367&r2=1134368&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb Fri Jun 10 16:15:06 2011
@@ -262,7 +262,7 @@ class RackspaceDriver < Deltacloud::Base
   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::Base
     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)

Modified: incubator/deltacloud/trunk/server/lib/deltacloud/helpers/blob_stream.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/helpers/blob_stream.rb?rev=1134368&r1=1134367&r2=1134368&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/helpers/blob_stream.rb (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/helpers/blob_stream.rb Fri Jun 10 16:15:06 2011
@@ -65,8 +65,7 @@ end
 
 class Hash
 
-  def gsub_keys(pattern, replacement)
-    rgx_pattern = Regexp.compile(pattern, true)
+  def gsub_keys(rgx_pattern, replacement)
     remove = []
     self.each_key do |key|
       if key.to_s.match(rgx_pattern)
@@ -81,6 +80,23 @@ 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
+
+DELTACLOUD_BLOBMETA_HEADER = /HTTP[-_]X[-_]Deltacloud[-_]Blobmeta[-_]/i
+
+  #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(DELTACLOUD_BLOBMETA_HEADER, 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 +172,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,

Modified: incubator/deltacloud/trunk/server/server.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/server.rb?rev=1134368&r1=1134367&r2=1134368&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/server.rb (original)
+++ incubator/deltacloud/trunk/server/server.rb Fri Jun 10 16:15:06 2011
@@ -727,8 +727,7 @@ put "#{Sinatra::UrlForHelper::DEFAULT_UR
     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|
@@ -788,8 +787,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|