From 04fb3298ae71cf291542f369f8f2cc3a466951d3 Mon Sep 17 00:00:00 2001 From: Frederick Cheung Date: Sun, 2 Sep 2012 01:06:44 +0100 Subject: [PATCH] [AWS|Glacier] jobs model --- lib/fog/aws/models/glacier/job.rb | 65 +++++++++++++++++++++++++ lib/fog/aws/models/glacier/jobs.rb | 35 +++++++++++++ lib/fog/aws/models/glacier/vault.rb | 5 ++ tests/aws/models/glacier/model_tests.rb | 7 ++- 4 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 lib/fog/aws/models/glacier/job.rb create mode 100644 lib/fog/aws/models/glacier/jobs.rb diff --git a/lib/fog/aws/models/glacier/job.rb b/lib/fog/aws/models/glacier/job.rb new file mode 100644 index 000000000..76755383e --- /dev/null +++ b/lib/fog/aws/models/glacier/job.rb @@ -0,0 +1,65 @@ +require 'fog/core/model' + +module Fog + module AWS + class Glacier + + class Job < Fog::Model + + ARCHIVE = 'archive-retrieval' + INVENTORY = 'inventory_retrieval' + + identity :id, :aliases => "JobId" + attribute :action, :aliases => "Action" + attribute :archive_id, :aliases => "ArchiveId" + attribute :archive_size, :aliases => "ArchiveSizeInBytes", :type => :integer + attribute :completed, :aliases => "Completed", :type => :boolean + attribute :completed_at, :aliases => "CompletionDate", :type => :time + attribute :created_at, :aliases => "CreationDate", :type => :time + attribute :inventory_size, :aliases => "InventorySizeInBytes", :type => :integer + attribute :description, :aliases=> "JobDescription" + attribute :tree_hash, :aliases=> "SHA256TreeHash" + attribute :sns_topic, :aliases => "SNSTopic" + attribute :status_code, :aliases=> "StatusCode" + attribute :status_message, :aliases=> "StatusMessage" + attribute :vault_arn, :aliases=> "VaultARN" + attribute :format + attribute :type + + + def ready? + completed + end + + def save + requires :vault, :type + specification = {'Type' => type, 'ArchiveId' => archive_id, 'Format' => format, 'Description' => description, 'SNSTopic' => sns_topic}.reject{|k,v| v.nil?} + + data = connection.initiate_job(vault.id, specification) + self.id = data.headers['x-amz-job-id'] + reload + end + + def vault + @vault + end + + #pass :range => 1..1234 to only retrieve those bytes + #pass :io => f to stream the response to that tio + def get_output(options={}) + if io = options.delete(:io) + options = options.merge :response_block => lambda {|chunk, remaining_bytes, total_bytes| io.write chunk} + end + options['Range'] = options.delete :range + connection.get_job_output(vault.id, id, options) + end + + private + def vault=(new_vault) + @vault = new_vault + end + + end + end + end +end diff --git a/lib/fog/aws/models/glacier/jobs.rb b/lib/fog/aws/models/glacier/jobs.rb new file mode 100644 index 000000000..0081ab548 --- /dev/null +++ b/lib/fog/aws/models/glacier/jobs.rb @@ -0,0 +1,35 @@ +require 'fog/core/collection' +require 'fog/aws/models/glacier/job' + +module Fog + module AWS + class Glacier + + class Jobs < Fog::Collection + + model Fog::AWS::Glacier::Job + attribute :vault + + def all + data = connection.list_jobs(vault.id).body['JobList'] + load(data) + end + + def get(key) + data = connection.describe_job(vault.id, key).body + new(data) + rescue Excon::Errors::NotFound + nil + end + + def new(attributes = {}) + requires :vault + super({ :vault => vault }.merge!(attributes)) + end + + + end + + end + end +end diff --git a/lib/fog/aws/models/glacier/vault.rb b/lib/fog/aws/models/glacier/vault.rb index 47c5b4fc3..25a9162df 100644 --- a/lib/fog/aws/models/glacier/vault.rb +++ b/lib/fog/aws/models/glacier/vault.rb @@ -1,5 +1,6 @@ require 'fog/core/model' require 'fog/aws/models/glacier/archives' +require 'fog/aws/models/glacier/jobs' module Fog module AWS @@ -23,6 +24,10 @@ module Fog @archives ||= Fog::AWS::Glacier::Archives.new(:vault => self, :connection => connection) end + def jobs + @jobs ||= Fog::AWS::Glacier::Jobs.new(:vault => self, :connection => connection) + end + def save requires :id data = connection.create_vault(id) diff --git a/tests/aws/models/glacier/model_tests.rb b/tests/aws/models/glacier/model_tests.rb index 01ef11ab2..95bae89f7 100644 --- a/tests/aws/models/glacier/model_tests.rb +++ b/tests/aws/models/glacier/model_tests.rb @@ -36,7 +36,12 @@ Shindo.tests('AWS::Glacier | models', ['aws', 'glacier']) do tests('sets id').returns(true) {!archive.id.nil?} archive.destroy end - end + + vault = Fog::AWS[:glacier].vaults.create :id => 'Fog-Test-Vault' + tests("jobs") do + tests('all').returns([]) {vault.jobs} + end + vault.destroy end end \ No newline at end of file