mirror of
https://github.com/fog/fog.git
synced 2022-11-09 13:51:43 -05:00
[AWS|Glacier] models for archives
This commit is contained in:
parent
50504903d5
commit
9295f3321d
4 changed files with 123 additions and 0 deletions
70
lib/fog/aws/models/glacier/archive.rb
Normal file
70
lib/fog/aws/models/glacier/archive.rb
Normal file
|
@ -0,0 +1,70 @@
|
|||
require 'fog/core/model'
|
||||
|
||||
module Fog
|
||||
module AWS
|
||||
class Glacier
|
||||
|
||||
class Archive < Fog::Model
|
||||
|
||||
identity :id
|
||||
attribute :description
|
||||
attribute :body
|
||||
|
||||
attr_accessor :multipart_chunk_size #must be a power of 2 multiple of 1MB
|
||||
|
||||
def vault
|
||||
@vault
|
||||
end
|
||||
|
||||
def save
|
||||
requires :body, :vault
|
||||
|
||||
if multipart_chunk_size && body.respond_to?(:read)
|
||||
self.id = multipart_save
|
||||
else
|
||||
data = connection.create_archive(vault.id, body, 'description' => description)
|
||||
self.id = data.headers['x-amz-archive-id']
|
||||
end
|
||||
true
|
||||
end
|
||||
|
||||
def destroy
|
||||
requires :id
|
||||
connection.delete_archive(vault.id,id)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def vault=(new_vault)
|
||||
@vault = new_vault
|
||||
end
|
||||
|
||||
def multipart_save
|
||||
# Initiate the upload
|
||||
res = connection.initiate_multipart_upload vault.id, multipart_chunk_size
|
||||
upload_id = res.headers["x-amz-multipart-upload-id"]
|
||||
|
||||
hash = Fog::AWS::Glacier::TreeHash.new
|
||||
|
||||
body.rewind if body.respond_to?(:rewind)
|
||||
offset = 0
|
||||
while (chunk = body.read(multipart_chunk_size)) do
|
||||
part_hash = hash.add_part(chunk)
|
||||
part_upload = connection.upload_part(vault.id, upload_id, chunk, offset, part_hash )
|
||||
offset += chunk.bytesize
|
||||
end
|
||||
|
||||
rescue
|
||||
# Abort the upload & reraise
|
||||
connection.abort_multipart_upload(vault.id, upload_id) if upload_id
|
||||
raise
|
||||
else
|
||||
# Complete the upload
|
||||
connection.complete_multipart_upload(vault.id, upload_id, offset, hash.hexdigest).headers['x-amz-archive-id']
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
30
lib/fog/aws/models/glacier/archives.rb
Normal file
30
lib/fog/aws/models/glacier/archives.rb
Normal file
|
@ -0,0 +1,30 @@
|
|||
require 'fog/core/collection'
|
||||
require 'fog/aws/models/glacier/archive'
|
||||
|
||||
module Fog
|
||||
module AWS
|
||||
class Glacier
|
||||
|
||||
class Archives < Fog::Collection
|
||||
|
||||
model Fog::AWS::Glacier::Archive
|
||||
attribute :vault
|
||||
#you can't list a vault's archives
|
||||
def all
|
||||
nil
|
||||
end
|
||||
|
||||
def get(key)
|
||||
new(:id => key)
|
||||
end
|
||||
|
||||
def new(attributes = {})
|
||||
requires :vault
|
||||
super({ :vault => vault }.merge!(attributes))
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,4 +1,6 @@
|
|||
require 'fog/core/model'
|
||||
require 'fog/aws/models/glacier/archives'
|
||||
|
||||
module Fog
|
||||
module AWS
|
||||
class Glacier
|
||||
|
@ -17,6 +19,10 @@ module Fog
|
|||
true
|
||||
end
|
||||
|
||||
def archives
|
||||
@archives ||= Fog::AWS::Glacier::Archives.new(:vault => self, :connection => connection)
|
||||
end
|
||||
|
||||
def save
|
||||
requires :id
|
||||
data = connection.create_vault(id)
|
||||
|
|
|
@ -21,5 +21,22 @@ Shindo.tests('AWS::Glacier | models', ['aws', 'glacier']) do
|
|||
tests('removes vault').returns(nil) {Fog::AWS[:glacier].vaults.get(vault.id)}
|
||||
end
|
||||
end
|
||||
|
||||
tests("archives") do
|
||||
vault = Fog::AWS[:glacier].vaults.create :id => 'Fog-Test-Vault-upload'
|
||||
tests('create') do
|
||||
archive = vault.archives.create(:body => 'data')
|
||||
tests('sets id').returns(true) {!archive.id.nil?}
|
||||
archive.destroy
|
||||
end
|
||||
tests('create multipart') do
|
||||
body = StringIO.new('x'*1024*1024*2)
|
||||
body.rewind
|
||||
archive = vault.archives.create(:body => body, :multipart_chunk_size => 1024*1024)
|
||||
tests('sets id').returns(true) {!archive.id.nil?}
|
||||
archive.destroy
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Add table
Reference in a new issue