mirror of
https://github.com/fog/fog.git
synced 2022-11-09 13:51:43 -05:00
[rackspace|storage] add large object container and prefix options
Allows the container and name prefix used to store large object segments to be specified when creating the manifest object.
This commit is contained in:
parent
ca945a0432
commit
b1e373520b
2 changed files with 78 additions and 10 deletions
|
@ -3,20 +3,24 @@ module Fog
|
|||
class Rackspace
|
||||
class Real
|
||||
|
||||
# Create a new object
|
||||
# Create a new manifest object
|
||||
#
|
||||
# ==== Parameters
|
||||
# * container<~String> - Name for container, should be < 256 bytes and must not contain '/'
|
||||
# * object<~String> - Name for object
|
||||
# * object<~String> - Name for manifest object
|
||||
# * options<~Hash>:
|
||||
# * 'segments_container'<~String> - Name of container where segments are stored. +container+ will be used if not given.
|
||||
# * 'segments_prefix'<~String> - Name prefix used for segmented objects. +object+ will be used if not given.
|
||||
# @raise [Fog::Storage::Rackspace::NotFound] - HTTP 404
|
||||
# @raise [Fog::Storage::Rackspace::BadRequest] - HTTP 400
|
||||
# @raise [Fog::Storage::Rackspace::InternalServerError] - HTTP 500
|
||||
# @raise [Fog::Storage::Rackspace::ServiceError]
|
||||
def put_object_manifest(container, object)
|
||||
def put_object_manifest(container, object, options = {})
|
||||
path = "#{Fog::Rackspace.escape(container)}/#{Fog::Rackspace.escape(object)}"
|
||||
prefix = "#{Fog::Rackspace.escape(options['segments_container'] || container)}/#{Fog::Rackspace.escape(options['segments_prefix'] || object)}"
|
||||
request(
|
||||
:expects => 201,
|
||||
:headers => {'X-Object-Manifest' => path},
|
||||
:headers => {'X-Object-Manifest' => prefix},
|
||||
:method => 'PUT',
|
||||
:path => path
|
||||
)
|
||||
|
|
|
@ -2,18 +2,19 @@ Shindo.tests('Fog::Storage[:rackspace] | large object requests', ["rackspace"])
|
|||
|
||||
unless Fog.mocking?
|
||||
@directory = Fog::Storage[:rackspace].directories.create(:key => 'foglargeobjecttests')
|
||||
@directory2 = Fog::Storage[:rackspace].directories.create(:key => 'foglargeobjecttests2')
|
||||
end
|
||||
|
||||
tests('success') do
|
||||
|
||||
tests("#put_object('foglargeobjecttests', 'fog_large_object/1', ('x' * 6 * 1024 * 1024))").succeeds do
|
||||
tests("#put_object('foglargeobjecttests', 'fog_large_object/1', ('x' * 4 * 1024 * 1024))").succeeds do
|
||||
pending if Fog.mocking?
|
||||
Fog::Storage[:rackspace].put_object(@directory.identity, 'fog_large_object/1', ('x' * 6 * 1024 * 1024))
|
||||
Fog::Storage[:rackspace].put_object(@directory.identity, 'fog_large_object/1', ('x' * 4 * 1024 * 1024))
|
||||
end
|
||||
|
||||
tests("#put_object('foglargeobjecttests', 'fog_large_object/2', ('x' * 4 * 1024 * 1024))").succeeds do
|
||||
tests("#put_object('foglargeobjecttests', 'fog_large_object/2', ('x' * 2 * 1024 * 1024))").succeeds do
|
||||
pending if Fog.mocking?
|
||||
Fog::Storage[:rackspace].put_object(@directory.identity, 'fog_large_object/2', ('x' * 4 * 1024 * 1024))
|
||||
Fog::Storage[:rackspace].put_object(@directory.identity, 'fog_large_object/2', ('x' * 2 * 1024 * 1024))
|
||||
end
|
||||
|
||||
tests("#put_object_manifest('foglargeobjecttests', 'fog_large_object')").succeeds do
|
||||
|
@ -23,13 +24,75 @@ Shindo.tests('Fog::Storage[:rackspace] | large object requests', ["rackspace"])
|
|||
|
||||
tests("#get_object('foglargeobjecttests', 'fog_large_object').body").succeeds do
|
||||
pending if Fog.mocking?
|
||||
Fog::Storage[:rackspace].get_object(@directory.identity, 'fog_large_object').body == ('x' * 10 * 1024 * 1024)
|
||||
Fog::Storage[:rackspace].get_object(@directory.identity, 'fog_large_object').body == ('x' * 6 * 1024 * 1024)
|
||||
end
|
||||
|
||||
tests("returns manifest Etag, computed including manifest file").succeeds do
|
||||
pending if Fog.mocking?
|
||||
|
||||
etags = []
|
||||
# When the manifest object name is equal to the prefix for the segments,
|
||||
# OpenStack treats it as if it's the first segment.
|
||||
etags << Digest::MD5.hexdigest('') # Etag for manifest object => "d41d8cd98f00b204e9800998ecf8427e"
|
||||
etags << Digest::MD5.hexdigest('x' * 4 * 1024 * 1024) # => "44981362d3ba9b5bacaf017c2f29d355"
|
||||
etags << Digest::MD5.hexdigest('x' * 2 * 1024 * 1024) # => "67b2f816a30e8956149b2d7beb479e51"
|
||||
expected = Digest::MD5.hexdigest(etags.join) # => "2537ea40a5a8cac247a912906cb62fc2"
|
||||
actual = Fog::Storage[:rackspace].head_object(@directory.identity, 'fog_large_object').headers['Etag']
|
||||
actual.gsub('"', '') == expected # actual is returned in quotes "\"2537ea40a5a8cac247a912906cb62fc2"\"
|
||||
end
|
||||
|
||||
tests("#delete_object('foglargeobjecttests', 'fog_large_object')").succeeds do
|
||||
pending if Fog.mocking?
|
||||
Fog::Storage[:rackspace].delete_object('foglargeobjecttests', 'fog_large_object')
|
||||
end
|
||||
|
||||
tests("#put_object_manifest('foglargeobjecttests', 'large_object_manifest', {'segments_prefix' => 'fog_large_object'})").succeeds do
|
||||
pending if Fog.mocking?
|
||||
Fog::Storage[:rackspace].put_object_manifest(@directory.identity, 'large_object_manifest', {'segments_prefix' => 'fog_large_object'})
|
||||
end
|
||||
|
||||
tests("#get_object('foglargeobjecttests', 'large_object_manifest').body").succeeds do
|
||||
pending if Fog.mocking?
|
||||
Fog::Storage[:rackspace].get_object(@directory.identity, 'large_object_manifest').body == ('x' * 6 * 1024 * 1024)
|
||||
end
|
||||
|
||||
tests("returns manifest Etag, computed without manifest file").succeeds do
|
||||
pending if Fog.mocking?
|
||||
|
||||
etags = []
|
||||
etags << Digest::MD5.hexdigest('x' * 4 * 1024 * 1024) # => "44981362d3ba9b5bacaf017c2f29d355"
|
||||
etags << Digest::MD5.hexdigest('x' * 2 * 1024 * 1024) # => "67b2f816a30e8956149b2d7beb479e51"
|
||||
expected = Digest::MD5.hexdigest(etags.join) # => "0b348495a774eaa4d4c4bbf770820f84"
|
||||
actual = Fog::Storage[:rackspace].head_object(@directory.identity, 'large_object_manifest').headers['Etag']
|
||||
actual.gsub('"', '') == expected # actual is returned in quotes "\"0b348495a774eaa4d4c4bbf770820f84"\"
|
||||
end
|
||||
|
||||
tests("#put_object_manifest('foglargeobjecttests2', 'fog_large_object', {'segments_container' => 'foglargeobjecttests', 'segments_prefix' => 'fog_large_object'})").succeeds do
|
||||
pending if Fog.mocking?
|
||||
Fog::Storage[:rackspace].put_object_manifest(@directory2.identity, 'fog_large_object', {'segments_container' => @directory.identity, 'segments_prefix' => 'fog_large_object'})
|
||||
end
|
||||
|
||||
tests("#get_object('foglargeobjecttests2', 'fog_large_object').body").succeeds do
|
||||
pending if Fog.mocking?
|
||||
Fog::Storage[:rackspace].get_object(@directory2.identity, 'fog_large_object').body == ('x' * 6 * 1024 * 1024)
|
||||
end
|
||||
|
||||
tests("returns manifest Etag, computed without manifest file").succeeds do
|
||||
pending if Fog.mocking?
|
||||
|
||||
etags = []
|
||||
etags << Digest::MD5.hexdigest('x' * 4 * 1024 * 1024) # => "44981362d3ba9b5bacaf017c2f29d355"
|
||||
etags << Digest::MD5.hexdigest('x' * 2 * 1024 * 1024) # => "67b2f816a30e8956149b2d7beb479e51"
|
||||
expected = Digest::MD5.hexdigest(etags.join) # => "0b348495a774eaa4d4c4bbf770820f84"
|
||||
actual = Fog::Storage[:rackspace].head_object(@directory2.identity, 'fog_large_object').headers['Etag']
|
||||
actual.gsub('"', '') == expected # actual is returned in quotes "\"0b348495a774eaa4d4c4bbf770820f84"\"
|
||||
end
|
||||
|
||||
unless Fog.mocking?
|
||||
['fog_large_object', 'fog_large_object/1', 'fog_large_object/2'].each do |key|
|
||||
['large_object_manifest', 'fog_large_object/1', 'fog_large_object/2'].each do |key|
|
||||
@directory.files.new(:key => key).destroy
|
||||
end
|
||||
@directory2.files.new(:key => 'fog_large_object').destroy
|
||||
end
|
||||
|
||||
end
|
||||
|
@ -42,6 +105,7 @@ Shindo.tests('Fog::Storage[:rackspace] | large object requests', ["rackspace"])
|
|||
|
||||
unless Fog.mocking?
|
||||
@directory.destroy
|
||||
@directory2.destroy
|
||||
end
|
||||
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue