aws-sdk-glacier 1.0.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/aws-sdk-glacier.rb +54 -0
- data/lib/aws-sdk-glacier/account.rb +143 -0
- data/lib/aws-sdk-glacier/archive.rb +178 -0
- data/lib/aws-sdk-glacier/client.rb +2506 -0
- data/lib/aws-sdk-glacier/client_api.rb +908 -0
- data/lib/aws-sdk-glacier/customizations.rb +7 -0
- data/lib/aws-sdk-glacier/errors.rb +23 -0
- data/lib/aws-sdk-glacier/job.rb +345 -0
- data/lib/aws-sdk-glacier/multipart_upload.rb +269 -0
- data/lib/aws-sdk-glacier/notification.rb +179 -0
- data/lib/aws-sdk-glacier/plugins/account_id.rb +22 -0
- data/lib/aws-sdk-glacier/plugins/api_version.rb +22 -0
- data/lib/aws-sdk-glacier/plugins/checksums.rb +91 -0
- data/lib/aws-sdk-glacier/resource.rb +82 -0
- data/lib/aws-sdk-glacier/tree_hash.rb +76 -0
- data/lib/aws-sdk-glacier/types.rb +2055 -0
- data/lib/aws-sdk-glacier/vault.rb +524 -0
- data/lib/aws-sdk-glacier/waiters.rb +98 -0
- metadata +91 -0
@@ -0,0 +1,179 @@
|
|
1
|
+
# WARNING ABOUT GENERATED CODE
|
2
|
+
#
|
3
|
+
# This file is generated. See the contributing for info on making contributions:
|
4
|
+
# https://github.com/aws/aws-sdk-ruby/blob/master/CONTRIBUTING.md
|
5
|
+
#
|
6
|
+
# WARNING ABOUT GENERATED CODE
|
7
|
+
|
8
|
+
module Aws
|
9
|
+
module Glacier
|
10
|
+
class Notification
|
11
|
+
|
12
|
+
extend Aws::Deprecations
|
13
|
+
|
14
|
+
# @overload def initialize(account_id, vault_name, options = {})
|
15
|
+
# @param [String] account_id
|
16
|
+
# @param [String] vault_name
|
17
|
+
# @option options [Client] :client
|
18
|
+
# @overload def initialize(options = {})
|
19
|
+
# @option options [required, String] :account_id
|
20
|
+
# @option options [required, String] :vault_name
|
21
|
+
# @option options [Client] :client
|
22
|
+
def initialize(*args)
|
23
|
+
options = Hash === args.last ? args.pop.dup : {}
|
24
|
+
@account_id = extract_account_id(args, options)
|
25
|
+
@vault_name = extract_vault_name(args, options)
|
26
|
+
@data = options.delete(:data)
|
27
|
+
@client = options.delete(:client) || Client.new(options)
|
28
|
+
end
|
29
|
+
|
30
|
+
# @!group Read-Only Attributes
|
31
|
+
|
32
|
+
# @return [String]
|
33
|
+
def account_id
|
34
|
+
@account_id
|
35
|
+
end
|
36
|
+
|
37
|
+
# @return [String]
|
38
|
+
def vault_name
|
39
|
+
@vault_name
|
40
|
+
end
|
41
|
+
|
42
|
+
# The Amazon Simple Notification Service (Amazon SNS) topic Amazon
|
43
|
+
# Resource Name (ARN).
|
44
|
+
# @return [String]
|
45
|
+
def sns_topic
|
46
|
+
data.sns_topic
|
47
|
+
end
|
48
|
+
|
49
|
+
# A list of one or more events for which Amazon Glacier will send a
|
50
|
+
# notification to the specified Amazon SNS topic.
|
51
|
+
# @return [Array<String>]
|
52
|
+
def events
|
53
|
+
data.events
|
54
|
+
end
|
55
|
+
|
56
|
+
# @!endgroup
|
57
|
+
|
58
|
+
# @return [Client]
|
59
|
+
def client
|
60
|
+
@client
|
61
|
+
end
|
62
|
+
|
63
|
+
# Loads, or reloads {#data} for the current {Notification}.
|
64
|
+
# Returns `self` making it possible to chain methods.
|
65
|
+
#
|
66
|
+
# notification.reload.data
|
67
|
+
#
|
68
|
+
# @return [self]
|
69
|
+
def load
|
70
|
+
resp = @client.get_vault_notifications(
|
71
|
+
account_id: @account_id,
|
72
|
+
vault_name: @vault_name
|
73
|
+
)
|
74
|
+
@data = resp.vaultnotificationconfig
|
75
|
+
self
|
76
|
+
end
|
77
|
+
alias :reload :load
|
78
|
+
|
79
|
+
# @return [Types::VaultNotificationConfig]
|
80
|
+
# Returns the data for this {Notification}. Calls
|
81
|
+
# {Client#get_vault_notifications} if {#data_loaded?} is `false`.
|
82
|
+
def data
|
83
|
+
load unless @data
|
84
|
+
@data
|
85
|
+
end
|
86
|
+
|
87
|
+
# @return [Boolean]
|
88
|
+
# Returns `true` if this resource is loaded. Accessing attributes or
|
89
|
+
# {#data} on an unloaded resource will trigger a call to {#load}.
|
90
|
+
def data_loaded?
|
91
|
+
!!@data
|
92
|
+
end
|
93
|
+
|
94
|
+
# @!group Actions
|
95
|
+
|
96
|
+
# @example Request syntax with placeholder values
|
97
|
+
#
|
98
|
+
# notification.delete()
|
99
|
+
# @param [Hash] options ({})
|
100
|
+
# @return [EmptyStructure]
|
101
|
+
def delete(options = {})
|
102
|
+
options = options.merge(
|
103
|
+
account_id: @account_id,
|
104
|
+
vault_name: @vault_name
|
105
|
+
)
|
106
|
+
resp = @client.delete_vault_notifications(options)
|
107
|
+
resp.data
|
108
|
+
end
|
109
|
+
|
110
|
+
# @example Request syntax with placeholder values
|
111
|
+
#
|
112
|
+
# notification.set({
|
113
|
+
# vault_notification_config: {
|
114
|
+
# sns_topic: "string",
|
115
|
+
# events: ["string"],
|
116
|
+
# },
|
117
|
+
# })
|
118
|
+
# @param [Hash] options ({})
|
119
|
+
# @option options [Types::VaultNotificationConfig] :vault_notification_config
|
120
|
+
# Provides options for specifying notification configuration.
|
121
|
+
# @return [EmptyStructure]
|
122
|
+
def set(options = {})
|
123
|
+
options = options.merge(
|
124
|
+
account_id: @account_id,
|
125
|
+
vault_name: @vault_name
|
126
|
+
)
|
127
|
+
resp = @client.set_vault_notifications(options)
|
128
|
+
resp.data
|
129
|
+
end
|
130
|
+
|
131
|
+
# @!group Associations
|
132
|
+
|
133
|
+
# @return [Vault]
|
134
|
+
def vault
|
135
|
+
Vault.new(
|
136
|
+
account_id: @account_id,
|
137
|
+
name: @vault_name,
|
138
|
+
client: @client
|
139
|
+
)
|
140
|
+
end
|
141
|
+
|
142
|
+
# @deprecated
|
143
|
+
# @api private
|
144
|
+
def identifiers
|
145
|
+
{
|
146
|
+
account_id: @account_id,
|
147
|
+
vault_name: @vault_name
|
148
|
+
}
|
149
|
+
end
|
150
|
+
deprecated(:identifiers)
|
151
|
+
|
152
|
+
private
|
153
|
+
|
154
|
+
def extract_account_id(args, options)
|
155
|
+
value = args[0] || options.delete(:account_id)
|
156
|
+
case value
|
157
|
+
when String then value
|
158
|
+
when nil then raise ArgumentError, "missing required option :account_id"
|
159
|
+
else
|
160
|
+
msg = "expected :account_id to be a String, got #{value.class}"
|
161
|
+
raise ArgumentError, msg
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def extract_vault_name(args, options)
|
166
|
+
value = args[1] || options.delete(:vault_name)
|
167
|
+
case value
|
168
|
+
when String then value
|
169
|
+
when nil then raise ArgumentError, "missing required option :vault_name"
|
170
|
+
else
|
171
|
+
msg = "expected :vault_name to be a String, got #{value.class}"
|
172
|
+
raise ArgumentError, msg
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
class Collection < Aws::Resources::Collection; end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Aws
|
2
|
+
module Glacier
|
3
|
+
module Plugins
|
4
|
+
class AccountId < Seahorse::Client::Plugin
|
5
|
+
|
6
|
+
option(:account_id,
|
7
|
+
default: '-',
|
8
|
+
doc_type: String,
|
9
|
+
docstring: <<-DOCS)
|
10
|
+
The default Glacier AWS account ID to use for all glacier
|
11
|
+
operations. The default value of `-` uses the account
|
12
|
+
your `:credentials` belong to.
|
13
|
+
DOCS
|
14
|
+
|
15
|
+
handle_request(step: :initialize) do |context|
|
16
|
+
context.params[:account_id] ||= context.config.account_id
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Aws
|
2
|
+
module Glacier
|
3
|
+
module Plugins
|
4
|
+
# @api private
|
5
|
+
class ApiVersion < Seahorse::Client::Plugin
|
6
|
+
|
7
|
+
class Handler < Seahorse::Client::Handler
|
8
|
+
|
9
|
+
def call(context)
|
10
|
+
version = context.config.api.version
|
11
|
+
context.http_request.headers['x-amz-glacier-version'] = version
|
12
|
+
@handler.call(context)
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
handler(Handler)
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require_relative '../tree_hash'
|
2
|
+
require 'openssl'
|
3
|
+
|
4
|
+
module Aws
|
5
|
+
module Glacier
|
6
|
+
module Plugins
|
7
|
+
# Computes the `:checksum` of the HTTP request body for operations
|
8
|
+
# that require the `X-Amz-Sha256-Tree-Hash` header. This includes:
|
9
|
+
#
|
10
|
+
# * `:complete_multipart_upload`
|
11
|
+
# * `:upload_archive`
|
12
|
+
# * `:upload_multipart_part`
|
13
|
+
#
|
14
|
+
# The `:upload_archive` and `:upload_multipart_part` operations
|
15
|
+
# accept a `:checksum` request parameter. If this param
|
16
|
+
# is present, then the checksum is assumed to be the proper
|
17
|
+
# tree hash of the file to be uploaded. If this param is
|
18
|
+
# not present, then the required tree hash checksum will
|
19
|
+
# be generated.
|
20
|
+
#
|
21
|
+
# The `:complete_multipart_upload` operation does not accept
|
22
|
+
# a checksum and this plugin will always compute this of the
|
23
|
+
# HTTP request body on your behalf.
|
24
|
+
#
|
25
|
+
# @api private
|
26
|
+
class Checksums < Seahorse::Client::Plugin
|
27
|
+
|
28
|
+
CHECKSUM_OPERATIONS = [
|
29
|
+
:upload_archive,
|
30
|
+
:upload_multipart_part,
|
31
|
+
]
|
32
|
+
|
33
|
+
class Handler < Seahorse::Client::Handler
|
34
|
+
|
35
|
+
HASH = 'X-Amz-Content-Sha256'
|
36
|
+
|
37
|
+
TREE_HASH = 'X-Amz-Sha256-Tree-Hash'
|
38
|
+
|
39
|
+
def call(context)
|
40
|
+
unless context.http_request.headers[TREE_HASH]
|
41
|
+
populate_checksum_headers(context)
|
42
|
+
end
|
43
|
+
@handler.call(context)
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def populate_checksum_headers(context)
|
49
|
+
compute_checksums(context.http_request.body) do |hash, tree_hash|
|
50
|
+
context.http_request.headers[HASH] = hash
|
51
|
+
context.http_request.headers[TREE_HASH] = tree_hash.digest
|
52
|
+
context[:tree_hash] = tree_hash
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Computes two checksums of the body. The tree hash is required
|
57
|
+
# by Glacier for operations where you upload a file. The other
|
58
|
+
# checksum is required by signature version 4. We compute both
|
59
|
+
# here so the sigv4 signer does not need to re-read the body.
|
60
|
+
def compute_checksums(body, &block)
|
61
|
+
|
62
|
+
tree_hash = TreeHash.new
|
63
|
+
digest = OpenSSL::Digest.new('sha256')
|
64
|
+
|
65
|
+
# if the body is empty/EOF, then we should compute the
|
66
|
+
# digests of the empty string
|
67
|
+
if body.size == 0
|
68
|
+
tree_hash.update('')
|
69
|
+
digest.update('')
|
70
|
+
end
|
71
|
+
|
72
|
+
# Rewind body before performing checksum computation.
|
73
|
+
body.rewind
|
74
|
+
|
75
|
+
while chunk = body.read(1024 * 1024) # read 1MB
|
76
|
+
tree_hash.update(chunk)
|
77
|
+
digest.update(chunk)
|
78
|
+
end
|
79
|
+
body.rewind
|
80
|
+
|
81
|
+
yield(digest.to_s, tree_hash)
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
handler(Handler, operations: CHECKSUM_OPERATIONS)
|
87
|
+
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# WARNING ABOUT GENERATED CODE
|
2
|
+
#
|
3
|
+
# This file is generated. See the contributing for info on making contributions:
|
4
|
+
# https://github.com/aws/aws-sdk-ruby/blob/master/CONTRIBUTING.md
|
5
|
+
#
|
6
|
+
# WARNING ABOUT GENERATED CODE
|
7
|
+
|
8
|
+
module Aws
|
9
|
+
module Glacier
|
10
|
+
class Resource
|
11
|
+
|
12
|
+
# @param options ({})
|
13
|
+
# @option options [Client] :client
|
14
|
+
def initialize(options = {})
|
15
|
+
@client = options[:client] || Client.new(options)
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [Client]
|
19
|
+
def client
|
20
|
+
@client
|
21
|
+
end
|
22
|
+
|
23
|
+
# @!group Actions
|
24
|
+
|
25
|
+
# @example Request syntax with placeholder values
|
26
|
+
#
|
27
|
+
# vault = glacier.create_vault({
|
28
|
+
# vault_name: "string", # required
|
29
|
+
# })
|
30
|
+
# @param [Hash] options ({})
|
31
|
+
# @option options [required, String] :vault_name
|
32
|
+
# The name of the vault.
|
33
|
+
# @return [Vault]
|
34
|
+
def create_vault(options = {})
|
35
|
+
options = options.merge(account_id: "-")
|
36
|
+
resp = @client.create_vault(options)
|
37
|
+
Vault.new(
|
38
|
+
account_id: options[:account_id],
|
39
|
+
name: options[:vault_name],
|
40
|
+
client: @client
|
41
|
+
)
|
42
|
+
end
|
43
|
+
|
44
|
+
# @!group Associations
|
45
|
+
|
46
|
+
# @param [String] id
|
47
|
+
# @return [Account]
|
48
|
+
def account(id)
|
49
|
+
Account.new(
|
50
|
+
id: id,
|
51
|
+
client: @client
|
52
|
+
)
|
53
|
+
end
|
54
|
+
|
55
|
+
# @example Request syntax with placeholder values
|
56
|
+
#
|
57
|
+
# vaults = glacier.vaults()
|
58
|
+
# @param [Hash] options ({})
|
59
|
+
# @return [Vault::Collection]
|
60
|
+
def vaults(options = {})
|
61
|
+
batches = Enumerator.new do |y|
|
62
|
+
options = options.merge(account_id: "-")
|
63
|
+
resp = @client.list_vaults(options)
|
64
|
+
resp.each_page do |page|
|
65
|
+
batch = []
|
66
|
+
page.data.vault_list.each do |v|
|
67
|
+
batch << Vault.new(
|
68
|
+
account_id: options[:account_id],
|
69
|
+
name: v.vault_name,
|
70
|
+
data: v,
|
71
|
+
client: @client
|
72
|
+
)
|
73
|
+
end
|
74
|
+
y.yield(batch)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
Vault::Collection.new(batches)
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
|
3
|
+
module Aws
|
4
|
+
module Glacier
|
5
|
+
# Used for computing a tree hash SHA256 checksum of an object.
|
6
|
+
#
|
7
|
+
# tree_hash = TreeHash.new
|
8
|
+
# tree_hash.update(file.read(1024 * 1024)) until file.eof?
|
9
|
+
# tree_hash.digest
|
10
|
+
#
|
11
|
+
# == Limitations and Notes
|
12
|
+
#
|
13
|
+
# There are two main limitations to be aware of when using TreeHash:
|
14
|
+
#
|
15
|
+
# * TreeHash is not thread safe. Use multiple TreeHash objects to concurrently
|
16
|
+
# compute a tree hash of a large object. Join their hashes at the end into
|
17
|
+
# a single TreeHash and then call {#digest}
|
18
|
+
#
|
19
|
+
# TreeHash.new(tree_hashes.map(&:hashes).flatten)
|
20
|
+
#
|
21
|
+
# * You must call {#update} with 1MB chunks of data. Only the final
|
22
|
+
# chunk may be smaller than 1MB.
|
23
|
+
#
|
24
|
+
# If you have a large object/file, and you would like to compute the
|
25
|
+
# chunks concurrently, you must break the original file/data into sections
|
26
|
+
# that are evenly divisible by 1MB. Each section of data requires
|
27
|
+
# a seperate TreeHash object to compute hashes. Once all sections of
|
28
|
+
# data are complete, you can rejoin their {#hashes} in sequential order
|
29
|
+
# into a single TreeHash, then call {#digest} on the final tree hash.
|
30
|
+
#
|
31
|
+
class TreeHash
|
32
|
+
|
33
|
+
def initialize(hashes = [])
|
34
|
+
@digest = OpenSSL::Digest.new('sha256')
|
35
|
+
@hashes = hashes
|
36
|
+
end
|
37
|
+
|
38
|
+
# @return [Array<String>] The built up list of hashes. Each hash is
|
39
|
+
# a sha255 digest of a 1MB chunk.
|
40
|
+
attr_accessor :hashes
|
41
|
+
|
42
|
+
# @param [String] chunk
|
43
|
+
# @return [String] Returns the computed SHA256 digest of the chunk.
|
44
|
+
def update(chunk)
|
45
|
+
@hashes << @digest.update(chunk).digest
|
46
|
+
@digest.reset
|
47
|
+
@hashes.last
|
48
|
+
end
|
49
|
+
|
50
|
+
def digest
|
51
|
+
hashes = @hashes
|
52
|
+
digest = OpenSSL::Digest.new('sha256')
|
53
|
+
until hashes.count == 1
|
54
|
+
hashes = hashes.each_slice(2).map do |h1,h2|
|
55
|
+
digest.reset
|
56
|
+
if h2
|
57
|
+
digest.update(h1)
|
58
|
+
digest.update(h2)
|
59
|
+
digest.digest
|
60
|
+
else
|
61
|
+
h1
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
hashes.first.bytes.map{|x| x.to_i.to_s(16).rjust(2, '0')}.join('')
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# For backwards compatability, we are aliasing Aws::Glacier::TreeHash to
|
72
|
+
# Aws::TreeHash. It is no longer vendors in the aws-sdk-core gem, but
|
73
|
+
# users should still be able to use the old constant.
|
74
|
+
# @api private
|
75
|
+
TreeHash = Glacier::TreeHash
|
76
|
+
end
|