aws-sdk-core 2.0.2 → 2.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/apis/CloudSearch.api.json +22 -1
- data/apis/EC2.waiters.json +20 -0
- data/apis/ElasticTranscoder.api.json +3 -4
- data/apis/ElasticTranscoder.waiters.json +16 -0
- data/apis/RDS.api.json +264 -19
- data/lib/aws-sdk-core.rb +6 -28
- data/lib/aws-sdk-core/api/service_customizations.rb +6 -25
- data/lib/aws-sdk-core/client.rb +18 -99
- data/lib/aws-sdk-core/client_paging.rb +29 -0
- data/lib/aws-sdk-core/client_stubs.rb +23 -11
- data/lib/aws-sdk-core/client_waiters.rb +105 -0
- data/lib/aws-sdk-core/elastictranscoder.rb +1 -0
- data/lib/aws-sdk-core/query/ec2_param_builder.rb +4 -2
- data/lib/aws-sdk-core/query/param_builder.rb +4 -2
- data/lib/aws-sdk-core/s3/presigner.rb +16 -5
- data/lib/aws-sdk-core/version.rb +1 -1
- data/lib/seahorse/client/base.rb +8 -5
- data/lib/seahorse/client/net_http/connection_pool.rb +4 -0
- data/lib/seahorse/client/plugins/net_http.rb +1 -0
- data/lib/seahorse/util.rb +5 -0
- metadata +6 -2
data/lib/aws-sdk-core.rb
CHANGED
@@ -68,7 +68,9 @@ module Aws
|
|
68
68
|
end
|
69
69
|
|
70
70
|
autoload :Client, 'aws-sdk-core/client'
|
71
|
+
autoload :ClientPaging, 'aws-sdk-core/client_paging'
|
71
72
|
autoload :ClientStubs, 'aws-sdk-core/client_stubs'
|
73
|
+
autoload :ClientWaiters, 'aws-sdk-core/client_waiters'
|
72
74
|
autoload :CredentialProviderChain, 'aws-sdk-core/credential_provider_chain'
|
73
75
|
autoload :Credentials, 'aws-sdk-core/credentials'
|
74
76
|
autoload :EmptyStructure, 'aws-sdk-core/empty_structure'
|
@@ -216,7 +218,7 @@ module Aws
|
|
216
218
|
|
217
219
|
# @api private
|
218
220
|
def load_json(path)
|
219
|
-
|
221
|
+
Seahorse::Util.load_json(path)
|
220
222
|
end
|
221
223
|
|
222
224
|
# Registers a new service.
|
@@ -259,42 +261,18 @@ module Aws
|
|
259
261
|
|
260
262
|
# build service client classes
|
261
263
|
service_added do |name, svc_module, options|
|
264
|
+
|
262
265
|
svc_module.const_set(:Client, Client.define(name, options))
|
263
266
|
svc_module.const_set(:Errors, Module.new { extend Errors::DynamicErrors })
|
264
|
-
end
|
265
|
-
|
266
|
-
# build service paginators
|
267
|
-
service_added do |name, svc_module, options|
|
268
|
-
paginators = options[:paginators]
|
269
|
-
paginators = case paginators
|
270
|
-
when Paging::Provider then paginators
|
271
|
-
when Hash then Paging::Provider.new(paginators)
|
272
|
-
when String then Paging::Provider.new(Aws.load_json(paginators))
|
273
|
-
when nil then Paging::NullProvider.new
|
274
|
-
else raise ArgumentError, 'invalid :paginators option'
|
275
|
-
end
|
276
|
-
svc_module.const_get(:Client).paginators = paginators
|
277
|
-
end
|
278
267
|
|
279
|
-
|
280
|
-
service_added do |name, svc_module, options|
|
281
|
-
waiters = options[:waiters]
|
282
|
-
waiters = case waiters
|
283
|
-
when Waiters::Provider then waiters
|
284
|
-
when Hash then Waiters::Provider.new(waiters)
|
285
|
-
when String then Waiters::Provider.new(Aws.load_json(waiters))
|
286
|
-
when nil then Waiters::NullProvider.new
|
287
|
-
else raise ArgumentError, 'invalid :waiters option'
|
288
|
-
end
|
268
|
+
# temporary workaround for issue with S3 waiter definition
|
289
269
|
if name == 'S3'
|
290
|
-
|
291
|
-
defs = waiters.instance_variable_get("@definitions")
|
270
|
+
defs = svc_module::Client.waiters.instance_variable_get("@definitions")
|
292
271
|
defs[:bucket_exists]['ignore_errors'] = ['NotFound']
|
293
272
|
defs[:object_exists]['ignore_errors'] = ['NotFound']
|
294
273
|
defs[:bucket_not_exists]['success_value'] = 'NotFound'
|
295
274
|
defs[:object_not_exists]['success_value'] = 'NotFound'
|
296
275
|
end
|
297
|
-
svc_module.const_get(:Client).waiters = waiters
|
298
276
|
end
|
299
277
|
|
300
278
|
end
|
@@ -2,19 +2,6 @@ module Aws
|
|
2
2
|
module Api
|
3
3
|
module ServiceCustomizations
|
4
4
|
|
5
|
-
DEFAULT_PLUGINS = [
|
6
|
-
'Seahorse::Client::Plugins::Logging',
|
7
|
-
'Seahorse::Client::Plugins::RestfulBindings',
|
8
|
-
'Seahorse::Client::Plugins::ContentLength',
|
9
|
-
'Aws::Plugins::UserAgent',
|
10
|
-
'Aws::Plugins::RetryErrors',
|
11
|
-
'Aws::Plugins::GlobalConfiguration',
|
12
|
-
'Aws::Plugins::RegionalEndpoint',
|
13
|
-
'Aws::Plugins::ResponsePaging',
|
14
|
-
'Aws::Plugins::RequestSigner',
|
15
|
-
'Aws::Plugins::StubResponses',
|
16
|
-
]
|
17
|
-
|
18
5
|
@customizations = Hash.new {|h,k| h[k] = [] }
|
19
6
|
|
20
7
|
class << self
|
@@ -40,7 +27,7 @@ module Aws
|
|
40
27
|
# @see {#customize}
|
41
28
|
# @see {Customizer}
|
42
29
|
def apply(client_class)
|
43
|
-
|
30
|
+
apply_protocol_plugin(client_class)
|
44
31
|
endpoint_prefix = client_class.api.metadata('endpointPrefix')
|
45
32
|
@customizations[endpoint_prefix].each do |customization|
|
46
33
|
Customizer.new(client_class).apply(&customization)
|
@@ -49,17 +36,6 @@ module Aws
|
|
49
36
|
|
50
37
|
private
|
51
38
|
|
52
|
-
def apply_plugins(client_class)
|
53
|
-
apply_default_plugins(client_class)
|
54
|
-
apply_protocol_plugin(client_class)
|
55
|
-
end
|
56
|
-
|
57
|
-
def apply_default_plugins(client_class)
|
58
|
-
DEFAULT_PLUGINS.each do |plugin|
|
59
|
-
client_class.add_plugin(plugin)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
39
|
def apply_protocol_plugin(client_class)
|
64
40
|
protocol = client_class.api.metadata('protocol')
|
65
41
|
plugin = case protocol
|
@@ -126,6 +102,11 @@ module Aws
|
|
126
102
|
add_plugin 'Aws::Plugins::S3Redirects'
|
127
103
|
add_plugin 'Aws::Plugins::S3SseCpk'
|
128
104
|
add_plugin 'Aws::Plugins::S3UrlEncodedKeys'
|
105
|
+
defs = client_class.waiters.instance_variable_get("@definitions")
|
106
|
+
defs[:bucket_exists]['ignore_errors'] = ['NotFound']
|
107
|
+
defs[:object_exists]['ignore_errors'] = ['NotFound']
|
108
|
+
defs[:bucket_not_exists]['success_value'] = 'NotFound'
|
109
|
+
defs[:object_not_exists]['success_value'] = 'NotFound'
|
129
110
|
end
|
130
111
|
|
131
112
|
customize 'sqs' do
|
data/lib/aws-sdk-core/client.rb
CHANGED
@@ -2,85 +2,21 @@ module Aws
|
|
2
2
|
# Base class for all {Aws} service clients.
|
3
3
|
class Client < Seahorse::Client::Base
|
4
4
|
|
5
|
+
# @api private
|
6
|
+
DEFAULT_PLUGINS = [
|
7
|
+
'Seahorse::Client::Plugins::Logging',
|
8
|
+
'Seahorse::Client::Plugins::RestfulBindings',
|
9
|
+
'Seahorse::Client::Plugins::ContentLength',
|
10
|
+
'Aws::Plugins::UserAgent',
|
11
|
+
'Aws::Plugins::RetryErrors',
|
12
|
+
'Aws::Plugins::GlobalConfiguration',
|
13
|
+
'Aws::Plugins::RegionalEndpoint',
|
14
|
+
'Aws::Plugins::RequestSigner',
|
15
|
+
]
|
16
|
+
|
17
|
+
include ClientPaging
|
5
18
|
include ClientStubs
|
6
|
-
|
7
|
-
# Waits until a particular condition is satisfied. This works by
|
8
|
-
# polling a client request and checking for particular response
|
9
|
-
# data or errors. Waiters each have a default duration max attempts
|
10
|
-
# which are configurable. Additionally, you can register callbacks
|
11
|
-
# and stop waiters by throwing `:success` or `:failure`.
|
12
|
-
#
|
13
|
-
# @example Basic usage
|
14
|
-
# client.wait_until(:waiter_name)
|
15
|
-
#
|
16
|
-
# @example Configuring interval and maximum attempts
|
17
|
-
# client.wait_until(:waiter_name) do |w|
|
18
|
-
# w.interval = 10 # number of seconds to sleep between attempts
|
19
|
-
# w.max_attempts = 6 # maximum number of polling attempts
|
20
|
-
# end
|
21
|
-
#
|
22
|
-
# @example Rescuing a failed wait
|
23
|
-
# begin
|
24
|
-
# client.wait_until(:waiter_name)
|
25
|
-
# rescue Aws::Waiters::Errors::WaiterFailed
|
26
|
-
# # gave up waiting
|
27
|
-
# end
|
28
|
-
#
|
29
|
-
# @example Waiting with progress callbacks
|
30
|
-
# client.wait_until(:waiter_name) do |w|
|
31
|
-
#
|
32
|
-
# # yields just before polling for change
|
33
|
-
# w.before_attempt do |attempt|
|
34
|
-
# # attempts - number of previous attempts made
|
35
|
-
# end
|
36
|
-
#
|
37
|
-
# # yields before sleeping
|
38
|
-
# w.before_wait do |attempt, prev_response|
|
39
|
-
# # attempts - number of previous attempts made
|
40
|
-
# # prev_response - the last client response received
|
41
|
-
# end
|
42
|
-
# end
|
43
|
-
#
|
44
|
-
# @example Throw :success or :failure to terminate early
|
45
|
-
# # wait for an hour, not for a number of requests
|
46
|
-
# client.wait_until(:waiter_name) do |waiter|
|
47
|
-
# one_hour = Time.now + 3600
|
48
|
-
# waiter.max_attempts = nil
|
49
|
-
# waiter.before_attempt do |attempt|
|
50
|
-
# throw(:failure, 'waited to long') if Time.now > one_hour
|
51
|
-
# end
|
52
|
-
# end
|
53
|
-
#
|
54
|
-
# @param [Symbol] waiter_name The name of the waiter. See {#waiter_names}
|
55
|
-
# for a full list of supported waiters.
|
56
|
-
# @param [Hash] params Additional request parameters. See the {#waiter_names}
|
57
|
-
# for a list of supported waiters and what request they call. The
|
58
|
-
# called request determines the list of accepted parameters.
|
59
|
-
# @return [Seahorse::Client::Response] Returns the client response from
|
60
|
-
# the successful polling request. If `:success` is thrown from a callback,
|
61
|
-
# then the 2nd argument to `#throw` is returned.
|
62
|
-
# @yieldparam [Waiters::Waiter] waiter Yields a {Waiters::Waiter Waiter}
|
63
|
-
# object that can be configured prior to waiting.
|
64
|
-
# @raise [Waiters::Errors::NoSuchWaiter] Raised when the named waiter
|
65
|
-
# is not defined.
|
66
|
-
# @raise [Waiters::Errors::WaiterFailed] Raised when one of the
|
67
|
-
# following conditions is met:
|
68
|
-
#
|
69
|
-
# * A failure condition is detected
|
70
|
-
# * The maximum number of attempts has been made without success
|
71
|
-
# * `:failure` is thrown from a callback
|
72
|
-
#
|
73
|
-
def wait_until(waiter_name, params = {}, &block)
|
74
|
-
waiter = self.class.waiters.waiter(waiter_name)
|
75
|
-
yield(waiter) if block_given?
|
76
|
-
waiter.wait(self, params)
|
77
|
-
end
|
78
|
-
|
79
|
-
# Returns the list of supported waiters.
|
80
|
-
# @return [Array<Symbol>]
|
81
|
-
def waiter_names
|
82
|
-
self.class.waiters.waiter_names
|
83
|
-
end
|
19
|
+
include ClientWaiters
|
84
20
|
|
85
21
|
class << self
|
86
22
|
|
@@ -88,35 +24,18 @@ module Aws
|
|
88
24
|
# @api private
|
89
25
|
attr_accessor :identifier
|
90
26
|
|
91
|
-
# @return [Paging::Provider]
|
92
|
-
# @api private
|
93
|
-
attr_accessor :paginators
|
94
|
-
|
95
|
-
# @return [Waiters::Provider]
|
96
|
-
# @api private
|
97
|
-
attr_accessor :waiters
|
98
|
-
|
99
27
|
# @api private
|
100
28
|
def define(svc_name, options)
|
101
29
|
client_class = Class.new(self)
|
102
30
|
client_class.identifier = svc_name.downcase.to_sym
|
103
|
-
|
31
|
+
[:api, :paginators, :waiters].each do |definition|
|
32
|
+
client_class.send("set_#{definition}", options[definition])
|
33
|
+
end
|
34
|
+
DEFAULT_PLUGINS.each { |plugin| client_class.add_plugin(plugin) }
|
104
35
|
Api::ServiceCustomizations.apply(client_class)
|
105
36
|
client_class
|
106
37
|
end
|
107
38
|
|
108
|
-
private
|
109
|
-
|
110
|
-
def load_api(api)
|
111
|
-
case api
|
112
|
-
when Seahorse::Model::Api then api
|
113
|
-
when Hash then Seahorse::Model::Api.new(api)
|
114
|
-
when String then Seahorse::Model::Api.new(Aws.load_json(api))
|
115
|
-
when nil then Seahorse::Model::Api.new({})
|
116
|
-
else raise ArgumentError, "invalid api definition #{api}"
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
39
|
end
|
121
40
|
end
|
122
41
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Aws
|
2
|
+
# @api private
|
3
|
+
module ClientPaging
|
4
|
+
|
5
|
+
# @api private
|
6
|
+
def self.included(subclass)
|
7
|
+
|
8
|
+
subclass.add_plugin('Aws::Plugins::ResponsePaging')
|
9
|
+
|
10
|
+
class << subclass
|
11
|
+
|
12
|
+
def set_paginators(paginators)
|
13
|
+
@paginators = case paginators
|
14
|
+
when Paging::Provider then paginators
|
15
|
+
when Hash then Paging::Provider.new(paginators)
|
16
|
+
when String then Paging::Provider.new(Aws.load_json(paginators))
|
17
|
+
when nil then Paging::NullProvider.new
|
18
|
+
else raise ArgumentError, 'invalid paginators'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def paginators
|
23
|
+
@paginators
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'thread'
|
2
|
+
|
1
3
|
module Aws
|
2
4
|
|
3
5
|
# This module provides the ability to specify the data and/or errors to
|
@@ -6,8 +8,14 @@ module Aws
|
|
6
8
|
# behavior.
|
7
9
|
module ClientStubs
|
8
10
|
|
11
|
+
# @api private
|
12
|
+
def self.included(subclass)
|
13
|
+
subclass.add_plugin('Aws::Plugins::StubResponses')
|
14
|
+
end
|
15
|
+
|
9
16
|
def initialize(*args)
|
10
17
|
@stubs = {}
|
18
|
+
@stub_mutex = Mutex.new
|
11
19
|
super
|
12
20
|
end
|
13
21
|
|
@@ -83,11 +91,13 @@ module Aws
|
|
83
91
|
|
84
92
|
# @api private
|
85
93
|
def next_stub(operation_name)
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
94
|
+
@stub_mutex.synchronize do
|
95
|
+
stubs = @stubs[operation_name.to_sym] || []
|
96
|
+
case stubs.length
|
97
|
+
when 0 then new_stub(operation_name)
|
98
|
+
when 1 then stubs.first
|
99
|
+
else stubs.shift
|
100
|
+
end
|
91
101
|
end
|
92
102
|
end
|
93
103
|
|
@@ -101,12 +111,14 @@ module Aws
|
|
101
111
|
end
|
102
112
|
|
103
113
|
def apply_stubs(operation_name, stubs)
|
104
|
-
@
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
114
|
+
@stub_mutex.synchronize do
|
115
|
+
@stubs[operation_name.to_sym] = stubs.map do |stub|
|
116
|
+
case stub
|
117
|
+
when Exception then stub
|
118
|
+
when String then service_error_class(stub)
|
119
|
+
when Hash then new_stub(operation_name, stub)
|
120
|
+
else stub
|
121
|
+
end
|
110
122
|
end
|
111
123
|
end
|
112
124
|
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
module Aws
|
2
|
+
module ClientWaiters
|
3
|
+
|
4
|
+
# @api private
|
5
|
+
def self.included(subclass)
|
6
|
+
class << subclass
|
7
|
+
|
8
|
+
def set_waiters(waiters)
|
9
|
+
@waiters =
|
10
|
+
case waiters
|
11
|
+
when Waiters::Provider then waiters
|
12
|
+
when Hash then Waiters::Provider.new(waiters)
|
13
|
+
when String then Waiters::Provider.new(Aws.load_json(waiters))
|
14
|
+
when nil then Waiters::NullProvider.new
|
15
|
+
else raise ArgumentError, 'invalid waiters'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def waiters
|
20
|
+
@waiters
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Waits until a particular condition is satisfied. This works by
|
27
|
+
# polling a client request and checking for particular response
|
28
|
+
# data or errors. Waiters each have a default duration max attempts
|
29
|
+
# which are configurable. Additionally, you can register callbacks
|
30
|
+
# and stop waiters by throwing `:success` or `:failure`.
|
31
|
+
#
|
32
|
+
# @example Basic usage
|
33
|
+
# client.wait_until(:waiter_name)
|
34
|
+
#
|
35
|
+
# @example Configuring interval and maximum attempts
|
36
|
+
# client.wait_until(:waiter_name) do |w|
|
37
|
+
# w.interval = 10 # number of seconds to sleep between attempts
|
38
|
+
# w.max_attempts = 6 # maximum number of polling attempts
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# @example Rescuing a failed wait
|
42
|
+
# begin
|
43
|
+
# client.wait_until(:waiter_name)
|
44
|
+
# rescue Aws::Waiters::Errors::WaiterFailed
|
45
|
+
# # gave up waiting
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
# @example Waiting with progress callbacks
|
49
|
+
# client.wait_until(:waiter_name) do |w|
|
50
|
+
#
|
51
|
+
# # yields just before polling for change
|
52
|
+
# w.before_attempt do |attempt|
|
53
|
+
# # attempts - number of previous attempts made
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
# # yields before sleeping
|
57
|
+
# w.before_wait do |attempt, prev_response|
|
58
|
+
# # attempts - number of previous attempts made
|
59
|
+
# # prev_response - the last client response received
|
60
|
+
# end
|
61
|
+
# end
|
62
|
+
#
|
63
|
+
# @example Throw :success or :failure to terminate early
|
64
|
+
# # wait for an hour, not for a number of requests
|
65
|
+
# client.wait_until(:waiter_name) do |waiter|
|
66
|
+
# one_hour = Time.now + 3600
|
67
|
+
# waiter.max_attempts = nil
|
68
|
+
# waiter.before_attempt do |attempt|
|
69
|
+
# throw(:failure, 'waited to long') if Time.now > one_hour
|
70
|
+
# end
|
71
|
+
# end
|
72
|
+
#
|
73
|
+
# @param [Symbol] waiter_name The name of the waiter. See {#waiter_names}
|
74
|
+
# for a full list of supported waiters.
|
75
|
+
# @param [Hash] params Additional request parameters. See the {#waiter_names}
|
76
|
+
# for a list of supported waiters and what request they call. The
|
77
|
+
# called request determines the list of accepted parameters.
|
78
|
+
# @return [Seahorse::Client::Response] Returns the client response from
|
79
|
+
# the successful polling request. If `:success` is thrown from a callback,
|
80
|
+
# then the 2nd argument to `#throw` is returned.
|
81
|
+
# @yieldparam [Waiters::Waiter] waiter Yields a {Waiters::Waiter Waiter}
|
82
|
+
# object that can be configured prior to waiting.
|
83
|
+
# @raise [Waiters::Errors::NoSuchWaiter] Raised when the named waiter
|
84
|
+
# is not defined.
|
85
|
+
# @raise [Waiters::Errors::WaiterFailed] Raised when one of the
|
86
|
+
# following conditions is met:
|
87
|
+
#
|
88
|
+
# * A failure condition is detected
|
89
|
+
# * The maximum number of attempts has been made without success
|
90
|
+
# * `:failure` is thrown from a callback
|
91
|
+
#
|
92
|
+
def wait_until(waiter_name, params = {}, &block)
|
93
|
+
waiter = self.class.waiters.waiter(waiter_name)
|
94
|
+
yield(waiter) if block_given?
|
95
|
+
waiter.wait(self, params)
|
96
|
+
end
|
97
|
+
|
98
|
+
# Returns the list of supported waiters.
|
99
|
+
# @return [Array<Symbol>]
|
100
|
+
def waiter_names
|
101
|
+
self.class.waiters.waiter_names
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
end
|