diff --git a/examples/storage_tests.rb b/examples/storage_tests.rb index f6d18d861..e967a6588 100755 --- a/examples/storage_tests.rb +++ b/examples/storage_tests.rb @@ -84,6 +84,22 @@ Shindo.tests('storage examples', 'storage') do end end + tests('@file.copy').succeeds do + @file.copy(@directory.key, 'fogstorageobject2') + end + + tests('@copy = @directory.files.get(fogstorageobject2)').succeeds do + @copy = @directory.files.get('fogstorageobject2') + end + + tests('@copy.body == @file.body').succeeds do + @copy.body == @file.body + end + + tests('@copy.destroy').succeeds do + @copy.destroy + end + # destroy the file tests('@file.destroy').succeeds do @file.destroy diff --git a/lib/fog/local/models/storage/file.rb b/lib/fog/local/models/storage/file.rb index a57026762..312328cb5 100644 --- a/lib/fog/local/models/storage/file.rb +++ b/lib/fog/local/models/storage/file.rb @@ -36,6 +36,13 @@ module Fog @directory end + def copy(target_directory_key, target_file_key, options={}) + requires :directory, :key + connection.copy_object(directory.key, key, target_directory_key, target_file_key) + target_directory = connection.directories.new(:key => target_directory_key) + target_directory.files.get(target_file_key) + end + def destroy requires :directory, :key ::File.delete(path) if ::File.exists?(path) diff --git a/lib/fog/local/storage.rb b/lib/fog/local/storage.rb index bed81c935..7c7cc9bf2 100644 --- a/lib/fog/local/storage.rb +++ b/lib/fog/local/storage.rb @@ -64,6 +64,14 @@ module Fog def path_to(partial) ::File.join(@local_root, partial) end + + def copy_object(source_directory_name, source_object_name, target_directory_name, target_object_name, options={}) + require 'fileutils' + source_path = path_to(::File.join(source_directory_name, source_object_name)) + target_path = path_to(::File.join(target_directory_name, target_object_name)) + ::FileUtils.mkdir_p(::File.dirname(source_path)) + ::FileUtils.copy_file(source_path, target_path) + end end end diff --git a/lib/fog/ninefold/models/storage/file.rb b/lib/fog/ninefold/models/storage/file.rb index 79aa2a89a..050a3c40c 100644 --- a/lib/fog/ninefold/models/storage/file.rb +++ b/lib/fog/ninefold/models/storage/file.rb @@ -28,6 +28,14 @@ module Fog @directory end + def copy(target_directory_key, target_file_key, options={}) + target_directory = connection.directories.new(:key => target_directory_key) + target_directory.files.create( + :key => target_file_key, + :body => body + ) + end + def destroy requires :directory, :key connection.delete_namespace([directory.key, key].join('/')) diff --git a/lib/fog/rackspace/models/storage/file.rb b/lib/fog/rackspace/models/storage/file.rb index f160ae210..4ecf53fe3 100644 --- a/lib/fog/rackspace/models/storage/file.rb +++ b/lib/fog/rackspace/models/storage/file.rb @@ -29,6 +29,13 @@ module Fog @directory end + def copy(target_directory_key, target_file_key, options={}) + requires :directory, :key + connection.copy_object(directory.key, key, target_directory_key, target_file_key) + target_directory = connection.directories.new(:key => target_directory_key) + target_directory.files.get(target_file_key) + end + def destroy requires :directory, :key connection.delete_object(directory.key, key) diff --git a/lib/fog/rackspace/requests/storage/copy_object.rb b/lib/fog/rackspace/requests/storage/copy_object.rb new file mode 100644 index 000000000..b3325b68e --- /dev/null +++ b/lib/fog/rackspace/requests/storage/copy_object.rb @@ -0,0 +1,27 @@ +module Fog + module Storage + class Rackspace + class Real + + # Copy object + # + # ==== Parameters + # * source_container_name<~String> - Name of source bucket + # * source_object_name<~String> - Name of source object + # * target_container_name<~String> - Name of bucket to create copy in + # * target_object_name<~String> - Name for new copy of object + # * options<~Hash> - Additional headers + def copy_object(source_container_name, source_object_name, target_container_name, target_object_name, options={}) + headers = { 'X-Copy-From' => "/#{source_container_name}/#{source_object_name}" }.merge(options) + request({ + :expects => 201, + :headers => headers, + :method => 'PUT', + :path => "#{Fog::Rackspace.escape(target_container_name)}/#{Fog::Rackspace.escape(target_object_name)}" + }) + end + + end + end + end +end diff --git a/lib/fog/rackspace/storage.rb b/lib/fog/rackspace/storage.rb index f55986890..0142351b8 100644 --- a/lib/fog/rackspace/storage.rb +++ b/lib/fog/rackspace/storage.rb @@ -15,6 +15,7 @@ module Fog collection :files request_path 'fog/rackspace/requests/storage' + request :copy_object request :delete_container request :delete_object request :get_container