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/02/18 22:06:34 UTC

svn commit: r1072149 - in /incubator/deltacloud/trunk/server: ./ lib/deltacloud/drivers/mock/ lib/deltacloud/drivers/mock/data/buckets/blobs/ lib/deltacloud/drivers/rackspace/ lib/deltacloud/helpers/

Author: marios
Date: Fri Feb 18 21:06:34 2011
New Revision: 1072149

URL: http://svn.apache.org/viewvc?rev=1072149&view=rev
Log:
Brings mock driver and yml up-to-date with the blobstore (incl. metadata)

Modified:
    incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob1.yml
    incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob2.yml
    incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob3.yml
    incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob4.yml
    incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob5.yml
    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/mock/data/buckets/blobs/blob1.yml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob1.yml?rev=1072149&r1=1072148&r2=1072149&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob1.yml (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob1.yml Fri Feb 18 21:06:34 2011
@@ -1,5 +1,8 @@
-:bucket: bucket1
-:content_length: 12627
+---
 :content_type: text/plain
+:content_length: 17
+:bucket: bucket1
+:user_metadata:
+  SOMENEWKEY: NEWVALUE
 :last_modified: 2010-09-23 16:44:54 +0100
-:content: "content of blob 1"
\ No newline at end of file
+:content: content of blob 1

Modified: incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob2.yml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob2.yml?rev=1072149&r1=1072148&r2=1072149&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob2.yml (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob2.yml Fri Feb 18 21:06:34 2011
@@ -1,5 +1,8 @@
-:bucket: bucket1
-:content_length: 4420
+--- 
+:user_metadata: 
+  VERSION: "1.2"
 :content_type: text/html
+:content_length: 56
+:bucket: bucket1
 :last_modified: 2010-09-23 16:55:05 +0100
-:content: "content of blob 2"
\ No newline at end of file
+:content: <html><head></head><body>content of blob 2</body></html>

Modified: incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob3.yml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob3.yml?rev=1072149&r1=1072148&r2=1072149&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob3.yml (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob3.yml Fri Feb 18 21:06:34 2011
@@ -1,5 +1,7 @@
 :bucket: bucket1
-:content_length: 98732
+:content_length: 17
 :content_type: text/plain
 :last_modified: 2010-08-14 02:14:31 +0100
-:content: "content of blob 3"
\ No newline at end of file
+:content:
+    content of blob 3
+:user_metadata: ''
\ No newline at end of file

Modified: incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob4.yml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob4.yml?rev=1072149&r1=1072148&r2=1072149&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob4.yml (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob4.yml Fri Feb 18 21:06:34 2011
@@ -1,5 +1,8 @@
 :bucket: bucket2
-:content_length: 983232
+:content_length: 17
 :content_type: application/octet-stream
 :last_modified: 2010-09-21 06:17:24 +0100
-:content: "content of blob 4"
\ No newline at end of file
+:content:
+    content of blob 4
+:user_metadata:
+    some: "value"
\ No newline at end of file

Modified: incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob5.yml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob5.yml?rev=1072149&r1=1072148&r2=1072149&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob5.yml (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/drivers/mock/data/buckets/blobs/blob5.yml Fri Feb 18 21:06:34 2011
@@ -1,5 +1,7 @@
 :bucket: bucket2
-:content_length: 651922
+:content_length: 17
 :content_type: application/pdf
 :last_modified: 2009-07-21 11:12:13 +0100
-:content: "content of blob 5"
\ No newline at end of file
+:content:
+    content of blob 5
+:user_metadata: ''
\ No newline at end of file

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=1072149&r1=1072148&r2=1072149&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 Feb 18 21:06:34 2011
@@ -321,14 +321,21 @@ class MockDriver < Deltacloud::BaseDrive
   def buckets(credentials, opts={})
     check_credentials(credentials)
     buckets=[]
-     Dir[ "#{@storage_root}/buckets/*.yml" ].each do |bucket_file|
-      bucket = YAML.load( File.read( bucket_file ) )
-      bucket[:id] = File.basename( bucket_file, ".yml" )
-      bucket[:name] = bucket[:id]
-      buckets << Bucket.new( bucket )
+    safely do
+      unless (opts[:id].nil?)
+        bucket_file = File::join(@storage_root, 'buckets', "#{opts[:id]}.yml") 
+        bucket = YAML.load_file(bucket_file)
+        bucket[:id] = opts[:id]
+        bucket[:name] = bucket[:id]
+        buckets << Bucket.new( bucket )
+      else
+         Dir[ File::join(@storage_root, 'buckets', '*.yml')].each do |bucket_file|
+          bucket_id = File.basename( bucket_file, ".yml" )
+          buckets << Bucket.new( {:id => bucket_id, :name => bucket_id } )
+        end
+      end
     end
     buckets = filter_on( buckets, :id, opts )
-    buckets
   end
 
 #--
@@ -342,7 +349,7 @@ class MockDriver < Deltacloud::BaseDrive
       :size=>'0',
       :blob_list=>[]
     }
-    File.open( "#{@storage_root}/buckets/#{name}.yml", 'w' ) {|b| YAML.dump( bucket, b )}
+    File.open( File::join(@storage_root, 'buckets', "#{name}.yml"), 'w') {|b| YAML.dump( bucket, b )}
     Bucket.new(bucket)
   end
 
@@ -350,12 +357,13 @@ class MockDriver < Deltacloud::BaseDrive
 # Delete bucket
 #--
   def delete_bucket(credentials, name, opts={})
+    check_credentials(credentials)
     bucket = bucket(credentials, {:id => name})
     unless (bucket.size == "0")
      raise Deltacloud::BackendError.new(403, self.class.to_s, "bucket-not-empty", "delete operation not valid for non-empty bucket")
     end
     safely do
-      File.delete("#{@storage_root}/buckets/#{name}.yml")
+      File.delete(File::join(@storage_root, 'buckets', "#{name}.yml"))
     end
   end
 
@@ -365,14 +373,15 @@ class MockDriver < Deltacloud::BaseDrive
   def blobs(credentials, opts = {})
     check_credentials(credentials)
     blobs=[]
-    Dir[ "#{@storage_root}/buckets/blobs/*.yml" ].each do |blob_file|
-      blob = YAML.load( File.read( blob_file ) )
-      blob[:id] = File.basename( blob_file, ".yml" )
+    blobfile = File::join("#{@storage_root}", "buckets", "blobs", "#{opts[:id]}.yml")
+    safely do
+      blob = YAML.load_file(blobfile)
+      return [] unless blob[:bucket] == opts['bucket'] #can't return nil since base_driver invokes .first on return
+      blob[:id] = File.basename( blobfile, ".yml" )
       blob[:name] = blob[:id]
       blobs << Blob.new( blob )
+      blobs = filter_on( blobs, :id, opts )
     end
-    blobs = filter_on( blobs, :id, opts )
-    blobs
   end
 
 #--
@@ -381,11 +390,73 @@ class MockDriver < Deltacloud::BaseDrive
   def blob_data(credentials, bucket_id, blob_id, opts = {})
     check_credentials(credentials)
     blob=nil
-    Dir[ "#{@storage_root}/buckets/blobs/*.yml" ].each do |blob_file|
-      if File.basename(blob_file, ".yml") == blob_id
-        blob = YAML.load(File.read(blob_file))
-        blob[:content].each {|part| yield part}
+    safely do
+      blobfile = File::join("#{@storage_root}", "buckets", "blobs", "#{opts['blob']}.yml")
+      blob = YAML.load_file(blobfile)
+    end
+    blob[:content].each {|part| yield part}
+  end
+
+#--
+# 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 = {
+      :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_', ''),
+      :content => blob_data[:tempfile].read
+    }
+    File.open( File::join("#{@storage_root}", "buckets", "blobs", "#{blob_id}.yml"), 'w' ) {|b| YAML.dump( blob, b )}
+    Blob.new(blob)
+  end
+
+#--
+# Delete blob
+#--
+  def delete_blob(credentials, bucket_id, blob_id, opts={})
+    check_credentials(credentials)
+    blobfile = File::join("#{@storage_root}", "buckets", "blobs", "#{blob_id}.yml")
+    safely do
+      unless File.exists?(blobfile)
+        raise Deltacloud::BackendError.new(500, self.class.to_s, "blob #{blob_id} doesn't exist", "cannot delete non existant blob")
       end
+      File.delete(blobfile)
+    end
+  end
+
+#--
+# Get metadata
+#--
+  def blob_metadata(credentials, opts={})
+    check_credentials(credentials)
+    blobfile = File::join("#{@storage_root}", "buckets", "blobs", "#{opts[:id]}.yml")
+    #safely do - mechanism not suitable here since head requests don't return a body response
+    begin
+      blob = YAML.load_file(blobfile)
+    rescue Errno::ENOENT
+      return nil #server.rb picks this up and gives 404
+    end
+    blob[:user_metadata]
+  end
+
+#--
+# Update metadata
+#--
+  def update_blob_metadata(credentials, opts={})
+    check_credentials(credentials)
+    blobfile = File::join("#{@storage_root}", "buckets", "blobs", "#{opts[:id]}.yml")
+    safely do
+      blob = YAML.load_file(blobfile)
+      return false unless blob
+      blob[:user_metadata] = opts['meta_hash'].gsub_keys('HTTP[-_]X[-_]Deltacloud[-_]Blobmeta[-_]', '')
+      File.open(File::join("#{@storage_root}", "buckets", "blobs", "#{opts[:id]}.yml"), 'w' ) {|b| YAML.dump( blob, b )}
     end
   end
 
@@ -401,15 +472,18 @@ class MockDriver < Deltacloud::BaseDrive
   private
 
   def check_credentials(credentials)
-    if ( credentials.user != 'mockuser' )
-      raise Deltacloud::AuthException.new
-    end
-
-    if ( credentials.password != 'mockpassword' )
+    if ( credentials.user != 'mockuser' ) or ( credentials.password != 'mockpassword' )
       raise Deltacloud::AuthException.new
     end
   end
 
+  def catched_exceptions_list
+    {
+      :auth => [],
+      :error => [ ::Deltacloud::BackendError, Errno::ENOENT ],
+      :glob => []
+    }
+  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=1072149&r1=1072148&r2=1072149&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 Feb 18 21:06:34 2011
@@ -284,7 +284,9 @@ class RackspaceDriver < Deltacloud::Base
 #--
   def delete_blob(credentials, bucket_id, blob_id, opts={})
     cf = cloudfiles_client(credentials)
-    cf.container(bucket_id).delete_object(blob_id)
+    safely do
+      cf.container(bucket_id).delete_object(blob_id)
+    end
   end
 
 #-

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=1072149&r1=1072148&r2=1072149&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/helpers/blob_stream.rb (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/helpers/blob_stream.rb Fri Feb 18 21:06:34 2011
@@ -15,6 +15,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+include Deltacloud
 begin
   require 'eventmachine'
   #--

Modified: incubator/deltacloud/trunk/server/server.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/server.rb?rev=1072149&r1=1072148&r2=1072149&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/server.rb (original)
+++ incubator/deltacloud/trunk/server/server.rb Fri Feb 18 21:06:34 2011
@@ -699,10 +699,14 @@ end
 #get the content of a particular blob
 get '/api/buckets/:bucket/:blob/content' do
   @blob = driver.blob(credentials, { :id => params[:blob], 'bucket' => params[:bucket]})
-  params['content_length'] = @blob.content_length
-  params['content_type'] = @blob.content_type
-  params['content_disposition'] = "attachment; filename=#{@blob.id}"
-  BlobStream.call(env, credentials, params)
+  if @blob
+    params['content_length'] = @blob.content_length
+    params['content_type'] = @blob.content_type
+    params['content_disposition'] = "attachment; filename=#{@blob.id}"
+    BlobStream.call(env, credentials, params)
+  else
+    report_error(404, 'not_found')
+  end
 end
 
 #Get html form for creating a new bucket