aws-sdk-core 2.0.0.rc15 → 2.0.0.rc16
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 +4 -4
- data/apis/DynamoDB.paginators.json +0 -1
- data/apis/EC2.resources.json +16 -0
- data/apis/ElasticBeanstalk.api.json +4 -1
- data/apis/Glacier.resources.json +5 -9
- data/apis/IAM.resources.json +1 -1
- data/apis/Kinesis.api.json +158 -0
- data/apis/Kinesis.paginators.json +0 -6
- data/apis/OpsWorks.api.json +36 -5
- data/apis/OpsWorks.resources.json +181 -0
- data/apis/S3.resources.json +13 -2
- data/apis/SQS.resources.json +0 -10
- data/bin/aws.rb +9 -0
- data/lib/aws.rb +30 -1
- data/lib/aws/api/docstrings.rb +35 -0
- data/lib/aws/api/documenter.rb +31 -28
- data/lib/aws/client.rb +83 -0
- data/lib/aws/credential_provider_chain.rb +3 -1
- data/lib/aws/errors.rb +16 -7
- data/lib/aws/pageable_response.rb +1 -1
- data/lib/aws/plugins/csd_conditional_signing.rb +5 -0
- data/lib/aws/plugins/response_paging.rb +9 -3
- data/lib/aws/plugins/s3_url_encoded_keys.rb +7 -7
- data/lib/aws/query/handler.rb +4 -5
- data/lib/aws/version.rb +1 -1
- data/lib/aws/waiters/errors.rb +30 -0
- data/lib/aws/waiters/null_provider.rb +12 -0
- data/lib/aws/waiters/provider.rb +54 -0
- data/lib/aws/waiters/waiter.rb +194 -0
- data/lib/aws/xml/default_list.rb +10 -0
- data/lib/aws/xml/parser.rb +6 -1
- data/lib/seahorse.rb +0 -2
- data/lib/seahorse/client/base.rb +45 -20
- data/lib/seahorse/client/handler_list.rb +7 -0
- data/lib/seahorse/client/param_converter.rb +2 -2
- data/lib/seahorse/client/plugins/restful_bindings.rb +1 -1
- data/lib/seahorse/client/request.rb +1 -1
- data/lib/seahorse/client/response.rb +0 -2
- data/lib/seahorse/model/shapes.rb +6 -2
- metadata +15 -11
- data/LICENSE.txt +0 -12
- data/README.md +0 -301
- data/lib/seahorse/client/plugins/api.rb +0 -11
@@ -0,0 +1,181 @@
|
|
1
|
+
{
|
2
|
+
"service": {
|
3
|
+
"actions": {
|
4
|
+
"CreateStack": {
|
5
|
+
"request": {
|
6
|
+
"operation": "CreateStack"
|
7
|
+
},
|
8
|
+
"resource": {
|
9
|
+
"type": "Stack",
|
10
|
+
"identifiers": [
|
11
|
+
{
|
12
|
+
"target": "Id",
|
13
|
+
"sourceType": "responsePath",
|
14
|
+
"source": "StackId"
|
15
|
+
}
|
16
|
+
]
|
17
|
+
}
|
18
|
+
}
|
19
|
+
},
|
20
|
+
"hasMany": {
|
21
|
+
"Stacks": {
|
22
|
+
"request": {
|
23
|
+
"operation": "DescribeStacks"
|
24
|
+
},
|
25
|
+
"resource": {
|
26
|
+
"type": "Stack",
|
27
|
+
"identifiers": [
|
28
|
+
{
|
29
|
+
"target": "Id",
|
30
|
+
"sourceType": "responsePath",
|
31
|
+
"source": "Stacks[].StackId"
|
32
|
+
}
|
33
|
+
]
|
34
|
+
},
|
35
|
+
"path": "Stacks[]"
|
36
|
+
}
|
37
|
+
}
|
38
|
+
},
|
39
|
+
"resources": {
|
40
|
+
"Layer": {
|
41
|
+
"identifiers": [
|
42
|
+
{ "name": "Id" }
|
43
|
+
],
|
44
|
+
"shape": "Layer",
|
45
|
+
"load": {
|
46
|
+
"request": {
|
47
|
+
"operation": "DescribeLayers",
|
48
|
+
"params": [
|
49
|
+
{
|
50
|
+
"target": "LayerIds[]",
|
51
|
+
"sourceType": "identifier",
|
52
|
+
"source": "Id"
|
53
|
+
}
|
54
|
+
]
|
55
|
+
},
|
56
|
+
"path": "Layers[0]"
|
57
|
+
},
|
58
|
+
"actions": {
|
59
|
+
"Delete": {
|
60
|
+
"request": {
|
61
|
+
"operation": "DeleteLayer",
|
62
|
+
"params": [
|
63
|
+
{
|
64
|
+
"target": "LayerId",
|
65
|
+
"sourceType": "identifier",
|
66
|
+
"source": "Id"
|
67
|
+
}
|
68
|
+
]
|
69
|
+
}
|
70
|
+
}
|
71
|
+
},
|
72
|
+
"hasOne": {
|
73
|
+
"Stack": {
|
74
|
+
"resource": {
|
75
|
+
"type": "Stack",
|
76
|
+
"identifiers": [
|
77
|
+
{
|
78
|
+
"target": "Id",
|
79
|
+
"sourceType": "dataMember",
|
80
|
+
"source": "StackId"
|
81
|
+
}
|
82
|
+
]
|
83
|
+
}
|
84
|
+
}
|
85
|
+
}
|
86
|
+
},
|
87
|
+
"Stack": {
|
88
|
+
"identifiers": [
|
89
|
+
{ "name": "Id" }
|
90
|
+
],
|
91
|
+
"shape": "Stack",
|
92
|
+
"load": {
|
93
|
+
"request": {
|
94
|
+
"operation": "DescribeStacks",
|
95
|
+
"params": [
|
96
|
+
{
|
97
|
+
"target": "StackIds[]",
|
98
|
+
"sourceType": "identifier",
|
99
|
+
"source": "Id"
|
100
|
+
}
|
101
|
+
]
|
102
|
+
},
|
103
|
+
"path": "Stacks[0]"
|
104
|
+
},
|
105
|
+
"actions": {
|
106
|
+
"CreateLayer": {
|
107
|
+
"request": {
|
108
|
+
"operation": "CreateLayer",
|
109
|
+
"params": [
|
110
|
+
{
|
111
|
+
"target": "StackId",
|
112
|
+
"sourceType": "identifier",
|
113
|
+
"source": "Id"
|
114
|
+
}
|
115
|
+
]
|
116
|
+
},
|
117
|
+
"resource": {
|
118
|
+
"type": "Layer",
|
119
|
+
"identifiers": [
|
120
|
+
{
|
121
|
+
"target": "Id",
|
122
|
+
"sourceType": "responsePath",
|
123
|
+
"source": "LayerId"
|
124
|
+
}
|
125
|
+
]
|
126
|
+
}
|
127
|
+
},
|
128
|
+
"GetSummary": {
|
129
|
+
"request": {
|
130
|
+
"operation": "DescribeStackSummary",
|
131
|
+
"params": [
|
132
|
+
{
|
133
|
+
"target": "StackId",
|
134
|
+
"sourceType": "identifier",
|
135
|
+
"source": "Id"
|
136
|
+
}
|
137
|
+
]
|
138
|
+
},
|
139
|
+
"path": "StackSummary"
|
140
|
+
},
|
141
|
+
"Delete": {
|
142
|
+
"request": {
|
143
|
+
"operation": "DeleteStack",
|
144
|
+
"params": [
|
145
|
+
{
|
146
|
+
"target": "StackId",
|
147
|
+
"sourceType": "identifier",
|
148
|
+
"source": "Id"
|
149
|
+
}
|
150
|
+
]
|
151
|
+
}
|
152
|
+
}
|
153
|
+
},
|
154
|
+
"hasMany": {
|
155
|
+
"Layers": {
|
156
|
+
"request": {
|
157
|
+
"operation": "DescribeLayers",
|
158
|
+
"params": [
|
159
|
+
{
|
160
|
+
"target": "StackId",
|
161
|
+
"sourceType": "identifier",
|
162
|
+
"source": "Id"
|
163
|
+
}
|
164
|
+
]
|
165
|
+
},
|
166
|
+
"resource": {
|
167
|
+
"type": "Layer",
|
168
|
+
"identifiers": [
|
169
|
+
{
|
170
|
+
"target": "Id",
|
171
|
+
"sourceType": "responsePath",
|
172
|
+
"source": "Layers[].LayerId"
|
173
|
+
}
|
174
|
+
]
|
175
|
+
},
|
176
|
+
"path": "Layers[]"
|
177
|
+
}
|
178
|
+
}
|
179
|
+
}
|
180
|
+
}
|
181
|
+
}
|
data/apis/S3.resources.json
CHANGED
@@ -521,7 +521,7 @@
|
|
521
521
|
},
|
522
522
|
"InitiateMultipartUpload": {
|
523
523
|
"request": {
|
524
|
-
"operation": "
|
524
|
+
"operation": "CreateMultipartUpload",
|
525
525
|
"params": [
|
526
526
|
{ "target":"Bucket", "sourceType":"identifier", "source":"BucketName" },
|
527
527
|
{ "target":"Key", "sourceType":"identifier", "source":"Key" }
|
@@ -547,7 +547,7 @@
|
|
547
547
|
},
|
548
548
|
"CopyFrom": {
|
549
549
|
"request": {
|
550
|
-
"operation": "
|
550
|
+
"operation": "CopyObject",
|
551
551
|
"params": [
|
552
552
|
{ "target":"Bucket", "sourceType":"identifier", "source":"BucketName" },
|
553
553
|
{ "target":"Key", "sourceType":"identifier", "source":"Key" }
|
@@ -564,6 +564,17 @@
|
|
564
564
|
}
|
565
565
|
}
|
566
566
|
},
|
567
|
+
"batchActions": {
|
568
|
+
"Delete": {
|
569
|
+
"request": {
|
570
|
+
"operation": "DeleteObjects",
|
571
|
+
"params": [
|
572
|
+
{ "target":"Bucket", "sourceType":"identifier", "source":"BucketName" },
|
573
|
+
{ "target":"Delete.Objects[].Key", "sourceType":"identifier", "source":"Key" }
|
574
|
+
]
|
575
|
+
}
|
576
|
+
}
|
577
|
+
},
|
567
578
|
"subResources": {
|
568
579
|
"resources": [
|
569
580
|
"ObjectAcl",
|
data/apis/SQS.resources.json
CHANGED
data/bin/aws.rb
CHANGED
@@ -94,6 +94,15 @@ end
|
|
94
94
|
|
95
95
|
require 'aws-sdk-core'
|
96
96
|
|
97
|
+
begin
|
98
|
+
# attempt to load aws-sdk-resources, checking first for source from
|
99
|
+
# a relative path in the repo, otherwise will check for the installed gem
|
100
|
+
lib = File.join(File.dirname(__FILE__), '..', '..', 'aws-sdk-resources', 'lib')
|
101
|
+
$LOAD_PATH.unshift(lib) if File.directory?(lib)
|
102
|
+
require 'aws-sdk-resources'
|
103
|
+
rescue LoadError
|
104
|
+
end
|
105
|
+
|
97
106
|
# configure the aws-sdk gem
|
98
107
|
|
99
108
|
cfg = {}
|
data/lib/aws.rb
CHANGED
@@ -33,6 +33,7 @@ module Aws
|
|
33
33
|
module Api
|
34
34
|
autoload :Customizer, "#{SRC}/api/customizer"
|
35
35
|
autoload :Documenter, "#{SRC}/api/documenter"
|
36
|
+
autoload :Docstrings, "#{SRC}/api/docstrings"
|
36
37
|
autoload :Manifest, "#{SRC}/api/manifest"
|
37
38
|
autoload :ManifestBuilder, "#{SRC}/api/manifest_builder"
|
38
39
|
autoload :OperationDocumenter, "#{SRC}/api/operation_documenter"
|
@@ -115,9 +116,17 @@ module Aws
|
|
115
116
|
autoload :V4, "#{SRC}/signers/v4"
|
116
117
|
end
|
117
118
|
|
119
|
+
module Waiters
|
120
|
+
autoload :Errors, "#{SRC}/waiters/errors"
|
121
|
+
autoload :NullProvider, "#{SRC}/waiters/null_provider"
|
122
|
+
autoload :Provider, "#{SRC}/waiters/provider"
|
123
|
+
autoload :Waiter, "#{SRC}/waiters/waiter"
|
124
|
+
end
|
125
|
+
|
118
126
|
# @api private
|
119
127
|
module Xml
|
120
128
|
autoload :Builder, "#{SRC}/xml/builder"
|
129
|
+
autoload :DefaultList, "#{SRC}/xml/default_list"
|
121
130
|
autoload :ErrorHandler, "#{SRC}/xml/error_handler"
|
122
131
|
autoload :Parser, "#{SRC}/xml/parser"
|
123
132
|
autoload :RestHandler, "#{SRC}/xml/rest_handler"
|
@@ -176,7 +185,6 @@ module Aws
|
|
176
185
|
|
177
186
|
# @api private
|
178
187
|
def load_json(path)
|
179
|
-
path = File.join(GEM_ROOT, path) unless path.match(/^#{File::SEPARATOR}/)
|
180
188
|
MultiJson.load(File.open(path, 'r', encoding: 'UTF-8') { |f| f.read })
|
181
189
|
end
|
182
190
|
|
@@ -246,6 +254,27 @@ module Aws
|
|
246
254
|
svc_module.const_get(:Client).paginators = paginators
|
247
255
|
end
|
248
256
|
|
257
|
+
# build service paginators
|
258
|
+
service_added do |name, svc_module, options|
|
259
|
+
waiters = options[:waiters]
|
260
|
+
waiters = case waiters
|
261
|
+
when Waiters::Provider then waiters
|
262
|
+
when Hash then Waiters::Provider.new(waiters)
|
263
|
+
when String then Waiters::Provider.new(Aws.load_json(waiters))
|
264
|
+
when nil then Waiters::NullProvider.new
|
265
|
+
else raise ArgumentError, 'invalid :waiters option'
|
266
|
+
end
|
267
|
+
if name == 'S3'
|
268
|
+
# temporary workaround for issue with S3 waiter definition
|
269
|
+
defs = waiters.instance_variable_get("@definitions")
|
270
|
+
defs[:bucket_exists]['ignore_errors'] = ['NotFound']
|
271
|
+
defs[:object_exists]['ignore_errors'] = ['NotFound']
|
272
|
+
defs[:bucket_not_exists]['success_value'] = 'NotFound'
|
273
|
+
defs[:object_not_exists]['success_value'] = 'NotFound'
|
274
|
+
end
|
275
|
+
svc_module.const_get(:Client).waiters = waiters
|
276
|
+
end
|
277
|
+
|
249
278
|
# deprecated = define helper method for client class, this will be
|
250
279
|
# replaced eventually with a helper that returns a resource object
|
251
280
|
# for the service.
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Aws
|
2
|
+
module Api
|
3
|
+
# @api private
|
4
|
+
# This module loads the API documentation for the given API.
|
5
|
+
module Docstrings
|
6
|
+
|
7
|
+
def self.apply(client_class, path)
|
8
|
+
api = client_class.api.definition
|
9
|
+
docs = File.open(path, 'r', encoding: 'UTF-8') { |f| f.read }
|
10
|
+
docs = MultiJson.load(docs)
|
11
|
+
|
12
|
+
api['documentation'] = docs['service']
|
13
|
+
|
14
|
+
docs['operations'].each do |operation, doc|
|
15
|
+
api['operations'][operation]['documentation'] = doc
|
16
|
+
end
|
17
|
+
|
18
|
+
docs['shapes'].each do |shape_name, shape|
|
19
|
+
api['shapes'][shape_name]['documentation'] = shape['base']
|
20
|
+
shape['refs'].each do |ref,doc|
|
21
|
+
target_shape_name, member = ref.split('$')
|
22
|
+
target_shape = api['shapes'][target_shape_name]
|
23
|
+
case target_shape['type']
|
24
|
+
when 'structure' then target_shape['members'][member]['documentation'] = doc
|
25
|
+
when 'list' then target_shape[member]['documentation'] = doc
|
26
|
+
when 'map' then target_shape[member]['documentation'] = doc
|
27
|
+
else raise 'not handled'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
client_class.set_api(Seahorse::Model::Api.new(api))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/aws/api/documenter.rb
CHANGED
@@ -9,12 +9,12 @@ module Aws
|
|
9
9
|
@svc_module = svc_module
|
10
10
|
@svc_name = svc_module.name.split('::').last
|
11
11
|
@client_class = svc_module.const_get(:Client)
|
12
|
+
Aws::Api::Docstrings.apply(@client_class, docs_path)
|
12
13
|
@api = @client_class.api
|
13
14
|
@full_name = @api.metadata('serviceFullName')
|
14
15
|
@error_names = @api.operations.map {|_,o| o.errors.map(&:name) }
|
15
16
|
@error_names = @error_names.flatten.uniq.sort
|
16
17
|
@namespace = YARD::Registry['Aws']
|
17
|
-
apply_docstrings(docs_path)
|
18
18
|
end
|
19
19
|
|
20
20
|
def apply
|
@@ -73,6 +73,7 @@ module Aws
|
|
73
73
|
yard_class.docstring = client_docstring
|
74
74
|
document_client_constructor(yard_class)
|
75
75
|
document_client_operations(yard_class)
|
76
|
+
document_client_waiters(yard_class)
|
76
77
|
end
|
77
78
|
|
78
79
|
def client_docstring
|
@@ -167,6 +168,35 @@ Constructs an API client.
|
|
167
168
|
DOCSTRING
|
168
169
|
end
|
169
170
|
|
171
|
+
def document_client_waiters(yard_class)
|
172
|
+
m = YARD::CodeObjects::MethodObject.new(yard_class, :wait_until)
|
173
|
+
m.scope = :instance
|
174
|
+
m.parameters << ['waiter_name', nil]
|
175
|
+
m.parameters << ['params', '{}']
|
176
|
+
m.docstring = YARD::Registry['Aws::Client#wait_until'].docstring
|
177
|
+
|
178
|
+
waiters = @client_class.waiters.waiter_names.sort.inject('') do |w,name|
|
179
|
+
operation = @client_class.waiters.waiter(name).send(:operation_name)
|
180
|
+
w << "<tr><td><tt>:#{name}</tt></td><td>{##{operation}}</td></tr>"
|
181
|
+
end
|
182
|
+
docstring = <<-DOCSTRING
|
183
|
+
Returns the list of supported waiters. The following table lists the supported
|
184
|
+
waiters and the client method they call:
|
185
|
+
<table>
|
186
|
+
<thead>
|
187
|
+
<tr><th>Waiter Name</th><th>Client Method</th></tr>
|
188
|
+
</thead>
|
189
|
+
<tbody>
|
190
|
+
#{waiters}
|
191
|
+
</tbody>
|
192
|
+
</table>
|
193
|
+
@return [Array<Symbol>] the list of supported waiters.
|
194
|
+
DOCSTRING
|
195
|
+
m = YARD::CodeObjects::MethodObject.new(yard_class, :waiter_names)
|
196
|
+
m.scope = :instance
|
197
|
+
m.docstring = docstring
|
198
|
+
end
|
199
|
+
|
170
200
|
class Tabulator
|
171
201
|
|
172
202
|
def initialize
|
@@ -202,33 +232,6 @@ Constructs an API client.
|
|
202
232
|
|
203
233
|
end
|
204
234
|
|
205
|
-
def apply_docstrings(path)
|
206
|
-
docs = MultiJson.load(read(path))
|
207
|
-
api = @api.definition
|
208
|
-
|
209
|
-
api['documentation'] = docs['service']
|
210
|
-
|
211
|
-
docs['operations'].each do |operation, doc|
|
212
|
-
api['operations'][operation]['documentation'] = doc
|
213
|
-
end
|
214
|
-
|
215
|
-
docs['shapes'].each do |shape_name, shape|
|
216
|
-
api['shapes'][shape_name]['documentation'] = shape['base']
|
217
|
-
shape['refs'].each do |ref,doc|
|
218
|
-
target_shape_name, member = ref.split('$')
|
219
|
-
target_shape = api['shapes'][target_shape_name]
|
220
|
-
case target_shape['type']
|
221
|
-
when 'structure' then target_shape['members'][member]['documentation'] = doc
|
222
|
-
when 'list' then target_shape[member]['documentation'] = doc
|
223
|
-
when 'map' then target_shape[member]['documentation'] = doc
|
224
|
-
else raise 'not handled'
|
225
|
-
end
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
@api = Seahorse::Model::Api.new(api)
|
230
|
-
end
|
231
|
-
|
232
235
|
def read(path)
|
233
236
|
File.open(path, 'r', encoding: 'UTF-8') { |f| f.read }
|
234
237
|
end
|
data/lib/aws/client.rb
CHANGED
@@ -2,6 +2,85 @@ module Aws
|
|
2
2
|
|
3
3
|
# Base class for all {Aws} service clients.
|
4
4
|
class Client < Seahorse::Client::Base
|
5
|
+
|
6
|
+
# Waits until a particular condition is satisfied. This works by
|
7
|
+
# polling a client request and checking for particular response
|
8
|
+
# data or errors. Waiters each have a default duration max attempts
|
9
|
+
# which are configurable. Additionally, you can register callbacks
|
10
|
+
# and stop waiters by throwing `:success` or `:failure`.
|
11
|
+
#
|
12
|
+
# @example Basic usage
|
13
|
+
# client.wait_until(:waiter_name)
|
14
|
+
#
|
15
|
+
# @example Configuring interval and maximum attempts
|
16
|
+
# client.wait_until(:waiter_name) do |w|
|
17
|
+
# w.interval = 10 # number of seconds to sleep between attempts
|
18
|
+
# w.max_attempts = 6 # maximum number of polling attempts
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# @example Rescuing a failed wait
|
22
|
+
# begin
|
23
|
+
# client.wait_until(:waiter_name)
|
24
|
+
# rescue Aws::Waiters::Errors::WaiterFailed
|
25
|
+
# # gave up waiting
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# @example Waiting with progress callbacks
|
29
|
+
# client.wait_until(:waiter_name) do |w|
|
30
|
+
#
|
31
|
+
# # yields just before polling for change
|
32
|
+
# w.before_attempt do |attempt|
|
33
|
+
# # attempts - number of previous attempts made
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# # yields before sleeping
|
37
|
+
# w.before_wait do |attempt, prev_response|
|
38
|
+
# # attempts - number of previous attempts made
|
39
|
+
# # prev_response - the last client response received
|
40
|
+
# end
|
41
|
+
# end
|
42
|
+
#
|
43
|
+
# @example Throw :success or :failure to terminate early
|
44
|
+
# # wait for an hour, not for a number of requests
|
45
|
+
# client.wait_until(:waiter_name) do |waiter|
|
46
|
+
# one_hour = Time.now + 3600
|
47
|
+
# waiter.max_attempts = nil
|
48
|
+
# waiter.before_attempt do |attempt|
|
49
|
+
# throw(:failure, 'waited to long') if Time.now > one_hour
|
50
|
+
# end
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# @param [Symbol] waiter_name The name of the waiter. See {#waiter_names}
|
54
|
+
# for a full list of supported waiters.
|
55
|
+
# @param [Hash] params Additional request parameters. See the {#waiter_names}
|
56
|
+
# for a list of supported waiters and what request they call. The
|
57
|
+
# called request determines the list of accepted parameters.
|
58
|
+
# @return [Seahorse::Client::Response] Returns the client response from
|
59
|
+
# the successful polling request. If `:success` is thrown from a callback,
|
60
|
+
# then the 2nd argument to `#throw` is returned.
|
61
|
+
# @yieldparam [Waiters::Waiter] waiter Yields a {Waiters::Waiter Waiter}
|
62
|
+
# object that can be configured prior to waiting.
|
63
|
+
# @raise [Waiters::Errors::NoSuchWaiter] Raised when the named waiter
|
64
|
+
# is not defined.
|
65
|
+
# @raise [Waiters::Errors::WaiterFailed] Raised when one of the
|
66
|
+
# following conditions is met:
|
67
|
+
#
|
68
|
+
# * A failure condition is detected
|
69
|
+
# * The maximum number of attempts has been made without success
|
70
|
+
# * `:failure` is thrown from a callback
|
71
|
+
#
|
72
|
+
def wait_until(waiter_name, params = {}, &block)
|
73
|
+
waiter = self.class.waiters.waiter(waiter_name)
|
74
|
+
yield(waiter) if block_given?
|
75
|
+
waiter.wait(self, params)
|
76
|
+
end
|
77
|
+
|
78
|
+
# Returns the list of supported waiters.
|
79
|
+
# @return [Array<Symbol>]
|
80
|
+
def waiter_names
|
81
|
+
self.class.waiters.waiter_names
|
82
|
+
end
|
83
|
+
|
5
84
|
class << self
|
6
85
|
|
7
86
|
# @return [Symbol]
|
@@ -12,6 +91,10 @@ module Aws
|
|
12
91
|
# @api private
|
13
92
|
attr_accessor :paginators
|
14
93
|
|
94
|
+
# @return [Waiters::Provider]
|
95
|
+
# @api private
|
96
|
+
attr_accessor :waiters
|
97
|
+
|
15
98
|
# @api private
|
16
99
|
def define(svc_name, options)
|
17
100
|
client_class = Class.new(self)
|