aws-sdk-core 2.11.175 → 2.11.176

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2704a0fd3ec58947bddca3ee2088e2a76db72a4f
4
- data.tar.gz: 29100ed5617f9a7cb3c10f7633dcecc7c6fb1067
3
+ metadata.gz: 0071e4fe3106f7b8a5536ba25a6460aa2b87dbee
4
+ data.tar.gz: 7cb903f9379b80c8864c6a5e71ed7f46af7f8138
5
5
  SHA512:
6
- metadata.gz: c82c4e822c4eef660d3efbd09ee245878d944c6e0a19784a14267a24c066cafcb0a75ea99087f08ac8dbbca7a4d7ca7013e083d6baeb0084bc64b325d574e261
7
- data.tar.gz: f8d7f2462e48cf124ec35327841ac6438ffdcdd4389e1a7a723a01772575ae91008b4ff335f3194593b27a4fccd18908a48597f5d1a943db6863ecad4cde31ce
6
+ metadata.gz: b2c4f2bf73e0cae8cea8d73d69eee330177c1f78b869fe58f4722ebeb667ef5da961c3847f948f84c5db534eddc63fa5602922d0ba61076b56ffba13062289fa
7
+ data.tar.gz: 93cef4a5cf1992ed98b4174775b9efd0761abfefb212e24d7d284eabe06c6f43a5f9661a9951df438f2796b2712746ffc37d75f1dc7d594a44306452bfd7e515
@@ -1511,7 +1511,12 @@
1511
1511
  "mouthUp",
1512
1512
  "mouthDown",
1513
1513
  "leftPupil",
1514
- "rightPupil"
1514
+ "rightPupil",
1515
+ "upperJawlineLeft",
1516
+ "midJawlineLeft",
1517
+ "chinBottom",
1518
+ "midJawlineRight",
1519
+ "upperJawlineRight"
1515
1520
  ]
1516
1521
  },
1517
1522
  "Landmarks":{
@@ -200,6 +200,7 @@ module Aws
200
200
  autoload :EagerLoader, 'aws-sdk-core/eager_loader'
201
201
  autoload :ECSCredentials, 'aws-sdk-core/ecs_credentials'
202
202
  autoload :EndpointProvider, 'aws-sdk-core/endpoint_provider'
203
+ autoload :EndpointCache, 'aws-sdk-core/endpoint_cache'
203
204
  autoload :Errors, 'aws-sdk-core/errors'
204
205
  autoload :IniParser, 'aws-sdk-core/ini_parser'
205
206
  autoload :InstanceProfileCredentials, 'aws-sdk-core/instance_profile_credentials'
@@ -259,6 +260,8 @@ module Aws
259
260
  autoload :HelpfulSocketErrors, 'aws-sdk-core/plugins/helpful_socket_errors'
260
261
  autoload :IdempotencyToken, 'aws-sdk-core/plugins/idempotency_token'
261
262
  autoload :JsonvalueConverter, 'aws-sdk-core/plugins/jsonvalue_converter'
263
+ autoload :EndpointDiscovery, 'aws-sdk-core/plugins/endpoint_discovery'
264
+ autoload :EndpointPattern, 'aws-sdk-core/plugins/endpoint_pattern'
262
265
  autoload :Logging, 'aws-sdk-core/plugins/logging'
263
266
  autoload :MachineLearningPredictEndpoint, 'aws-sdk-core/plugins/machine_learning_predict_endpoint'
264
267
  autoload :ParamConverter, 'aws-sdk-core/plugins/param_converter'
@@ -575,10 +578,10 @@ module Aws
575
578
  service_added do |name, svc_module, options|
576
579
  if paginators = options[:paginators]
577
580
  paginators = Json.load_file(paginators) unless Hash === paginators
578
- svc_module::Client.api.operations.each do |_, operation|
579
- if rules = paginators['pagination'][operation.name]
580
- operation[:pager] = Pager.new(rules)
581
- end
581
+ paginators['pagination'].each do |n, rules|
582
+ op_name = Seahorse::Util.underscore(n)
583
+ operation = svc_module::Client.api.operation(op_name)
584
+ operation[:pager] = Pager.new(rules)
582
585
  end
583
586
  end
584
587
  end
@@ -58,9 +58,20 @@ module Aws
58
58
  api = Seahorse::Model::Api.new
59
59
  api.metadata = definition['metadata'] || {}
60
60
  api.version = api.metadata['apiVersion']
61
+ if op = has_endpoint_operation?(definition['operations'])
62
+ api.endpoint_operation = op
63
+ end
61
64
  api
62
65
  end
63
66
 
67
+ def has_endpoint_operation?(ops)
68
+ return nil if ops.nil?
69
+ ops.each do |name, op|
70
+ return underscore(name) if op['endpointoperation']
71
+ end
72
+ nil
73
+ end
74
+
64
75
  def build_shape_map(definition, api, docs)
65
76
  shapes = definition['shapes'] || {}
66
77
  api.metadata['shapes'] = ShapeMap.new(shapes, docs: docs)
@@ -76,17 +87,29 @@ module Aws
76
87
  def build_operation(name, definition, shapes, docs)
77
88
  http = definition['http'] || {}
78
89
  op = Seahorse::Model::Operation.new
79
- op.name = name
90
+ op.name = definition['name'] || name
80
91
  op.http_method = http['method']
81
92
  op.http_request_uri = http['requestUri'] || '/'
82
93
  op.documentation = docs.operation_docs(name)
83
94
  op.deprecated = !!definition['deprecated']
95
+ op.endpoint_operation = !!definition['endpointoperation']
84
96
  op.input = shapes.shape_ref(definition['input'])
85
97
  op.output = shapes.shape_ref(definition['output'])
86
98
  op['authtype'] = definition['authtype'] unless definition['authtype'].nil?
87
99
  (definition['errors'] || []).each do |error|
88
100
  op.errors << shapes.shape_ref(error)
89
101
  end
102
+ if definition['endpointdiscovery']
103
+ op.endpoint_discovery = {}
104
+ definition['endpointdiscovery'].each do |k, v|
105
+ op.endpoint_discovery[k] = v
106
+ end
107
+ elsif definition['endpoint']
108
+ op.endpoint_pattern = {}
109
+ definition['endpoint'].each do |k, v|
110
+ op.endpoint_pattern[k] = v
111
+ end
112
+ end
90
113
  op
91
114
  end
92
115
 
@@ -94,7 +94,9 @@ module Aws
94
94
  plugins('Amazon CloudSearch Domain',
95
95
  add: %w(Aws::Plugins::CSDConditionalSigning
96
96
  Aws::Plugins::CSDSwitchToPost),
97
- remove: %w(Aws::Plugins::RegionalEndpoint),
97
+ remove: %w(Aws::Plugins::RegionalEndpoint
98
+ Aws::Plugins::EndpointPattern
99
+ Aws::Plugins::EndpointDiscovery),
98
100
  )
99
101
 
100
102
  plugins('Amazon DynamoDB', add: %w(
@@ -54,6 +54,10 @@ module Aws
54
54
  location_name = meta.delete('locationName')
55
55
  location_name ||= options[:member_name] unless location == 'headers'
56
56
  documentation = @docs.shape_ref_docs(shape.name, options[:target])
57
+ if meta['hostLabel']
58
+ # used for endpoint pattern
59
+ meta['hostLabelName'] = options[:member_name]
60
+ end
57
61
 
58
62
  ShapeRef.new(
59
63
  shape: shape,
@@ -17,7 +17,9 @@ module Aws
17
17
  'Aws::Plugins::ResponsePaging',
18
18
  'Aws::Plugins::StubResponses',
19
19
  'Aws::Plugins::IdempotencyToken',
20
- 'Aws::Plugins::JsonvalueConverter'
20
+ 'Aws::Plugins::JsonvalueConverter',
21
+ 'Aws::Plugins::EndpointDiscovery',
22
+ 'Aws::Plugins::EndpointPattern'
21
23
  ]
22
24
 
23
25
  # @api private
@@ -18,6 +18,19 @@ module Aws
18
18
  end
19
19
  @config.stub_responses = true
20
20
  end
21
+
22
+ # When a client is stubbed allow the user to access the requests made
23
+ @api_requests = []
24
+
25
+ requests = @api_requests
26
+ self.handle do |context|
27
+ requests << {
28
+ operation_name: context.operation_name,
29
+ params: context.params,
30
+ context: context
31
+ }
32
+ @handler.call(context)
33
+ end
21
34
  end
22
35
 
23
36
  # Configures what data / errors should be returned from the named operation
@@ -167,6 +180,27 @@ module Aws
167
180
  end
168
181
  end
169
182
 
183
+ # Allows you to access all of the requests that the stubbed client has made
184
+ #
185
+ # @params [Boolean] exclude_presign Setting to true for filtering out not sent requests from
186
+ # generating presigned urls. Default to false.
187
+ # @return [Array] Returns an array of the api requests made, each request object contains the
188
+ # :operation_name, :params, and :context of the request.
189
+ # @raise [NotImplementedError] Raises `NotImplementedError` when the client is not stubbed
190
+ def api_requests(options = {})
191
+ if config.stub_responses
192
+ if options[:exclude_presign]
193
+ @api_requests.reject {|req| req[:context][:presigned_url] }
194
+ else
195
+ @api_requests
196
+ end
197
+ else
198
+ msg = 'This method is only implemented for stubbed clients, and is '
199
+ msg << 'available when you enable stubbing in the constructor with `stub_responses: true`'
200
+ raise NotImplementedError.new(msg)
201
+ end
202
+ end
203
+
170
204
  # Generates and returns stubbed response data from the named operation.
171
205
  #
172
206
  # s3 = Aws::S3::Client.new
@@ -0,0 +1,188 @@
1
+ module Aws
2
+ # @api private
3
+ # a LRU cache caching endpoints data
4
+ class EndpointCache
5
+
6
+ # default cache entries limit
7
+ MAX_ENTRIES = 1000
8
+
9
+ # default max threads pool size
10
+ MAX_THREADS = 10
11
+
12
+ def initialize(options = {})
13
+ @max_entries = options[:max_entries] || MAX_ENTRIES
14
+ @entries = {} # store endpoints
15
+ @max_threads = options[:max_threads] || MAX_THREADS
16
+ @pool = {} # store polling threads
17
+ @mutex = Mutex.new
18
+ @require_identifier = nil # whether endpoint operation support identifier
19
+ end
20
+
21
+ # @return [Integer] Max size limit of cache
22
+ attr_reader :max_entries
23
+
24
+ # @return [Integer] Max count of polling threads
25
+ attr_reader :max_threads
26
+
27
+ # return [Hash] Polling threads pool
28
+ attr_reader :pool
29
+
30
+ # @param [String] key
31
+ # @return [Endpoint]
32
+ def [](key)
33
+ @mutex.synchronize do
34
+ # fetching an existing endpoint delete it and then append it
35
+ endpoint = @entries[key]
36
+ if endpoint
37
+ @entries.delete(key)
38
+ @entries[key] = endpoint
39
+ end
40
+ endpoint
41
+ end
42
+ end
43
+
44
+ # @param [String] key
45
+ # @param [Hash] value
46
+ def []=(key, value)
47
+ @mutex.synchronize do
48
+ # delete the least recent used endpoint when cache is full
49
+ unless @entries.size < @max_entries
50
+ old_key, _ = @entries.shift
51
+ self.delete_polling_thread(old_key)
52
+ end
53
+ # delete old value if exists
54
+ @entries.delete(key)
55
+ @entries[key] = Endpoint.new(value.to_hash)
56
+ end
57
+ end
58
+
59
+ # checking whether an unexpired endpoint key exists in cache
60
+ # @param [String] key
61
+ # @return [Boolean]
62
+ def key?(key)
63
+ if @entries.key?(key) && (@entries[key].nil? || @entries[key].expired?)
64
+ self.delete(key)
65
+ end
66
+ @entries.key?(key)
67
+ end
68
+
69
+ # checking whether an polling thread exist for the key
70
+ # @param [String] key
71
+ # @return [Boolean]
72
+ def threads_key?(key)
73
+ @pool.key?(key)
74
+ end
75
+
76
+ # remove entry only
77
+ # @param [String] key
78
+ def delete(key)
79
+ @mutex.synchronize do
80
+ @entries.delete(key)
81
+ end
82
+ end
83
+
84
+ # kill the old polling thread and remove it from pool
85
+ # @param [String] key
86
+ def delete_polling_thread(key)
87
+ Thread.kill(@pool[key]) if self.threads_key?(key)
88
+ @pool.delete(key)
89
+ end
90
+
91
+ # update cache with requests (using service endpoint operation)
92
+ # to fetch endpoint list (with identifiers when available)
93
+ # @param [String] key
94
+ # @param [RequestContext] ctx
95
+ def update(key, ctx)
96
+ resp = _request_endpoint(ctx)
97
+ if resp && resp.endpoints
98
+ resp.endpoints.each { |e| self[key] = e }
99
+ end
100
+ end
101
+
102
+ # extract the key to be used in the cache from request context
103
+ # @param [RequestContext] ctx
104
+ # @return [String]
105
+ def extract_key(ctx)
106
+ parts = []
107
+ # fetching from cred provider directly gives warnings
108
+ parts << ctx.config.credentials.credentials.access_key_id
109
+ if _endpoint_operation_identifier(ctx)
110
+ parts << ctx.operation_name
111
+ ctx.operation.input.shape.members.inject(parts) do |p, (name, ref)|
112
+ p << ctx.params[name] if ref["endpointdiscoveryid"]
113
+ p
114
+ end
115
+ end
116
+ parts.join('_')
117
+ end
118
+
119
+ # update polling threads pool
120
+ # param [String] key
121
+ # param [Thread] thread
122
+ def update_polling_pool(key, thread)
123
+ unless @pool.size < @max_threads
124
+ _, thread = @pool.shift
125
+ Thread.kill(thread)
126
+ end
127
+ @pool[key] = thread
128
+ end
129
+
130
+ # kill all polling threads
131
+ def stop_polling!
132
+ @pool.each { |_, t| Thread.kill(t) }
133
+ @pool = {}
134
+ end
135
+
136
+ private
137
+
138
+ def _request_endpoint(ctx)
139
+ params = {}
140
+ if _endpoint_operation_identifier(ctx)
141
+ # build identifier params when available
142
+ params[:operation] = ctx.operation.name
143
+ ctx.operation.input.shape.members.inject(params) do |p, (name, ref)|
144
+ if ref["endpointdiscoveryid"]
145
+ p[:identifiers] ||= {}
146
+ p[:identifiers][ref.location_name] = ctx.params[name]
147
+ end
148
+ p
149
+ end
150
+ end
151
+
152
+ begin
153
+ endpoint_operation_name = ctx.config.api.endpoint_operation
154
+ ctx.client.send(endpoint_operation_name, params)
155
+ rescue Aws::Errors::ServiceError
156
+ nil
157
+ end
158
+ end
159
+
160
+ def _endpoint_operation_identifier(ctx)
161
+ return @require_identifier unless @require_identifier.nil?
162
+ operation_name = ctx.config.api.endpoint_operation
163
+ operation = ctx.config.api.operation(operation_name)
164
+ @require_identifier = operation.input.shape.members.any?
165
+ end
166
+
167
+ class Endpoint
168
+
169
+ # default endpoint cache time, 1 minute
170
+ CACHE_PERIOD = 1
171
+
172
+ def initialize(options)
173
+ @address = options.fetch(:address)
174
+ @cache_period = options[:cache_period_in_minutes] || CACHE_PERIOD
175
+ @created_time = Time.now
176
+ end
177
+
178
+ # [String] valid URI address (with path)
179
+ attr_reader :address
180
+
181
+ def expired?
182
+ Time.now - @created_time > @cache_period * 60
183
+ end
184
+
185
+ end
186
+
187
+ end
188
+ end
@@ -53,6 +53,30 @@ module Aws
53
53
  # Raised when a {Service} is constructed and region is not specified.
54
54
  class MissingRegionError < ArgumentError; end
55
55
 
56
+ # Rasied when endpoint discovery failed for operations
57
+ # that requires endpoints from endpoint discovery
58
+ class EndpointDiscoveryError < RuntimeError
59
+ def initialize(*args)
60
+ msg = 'Endpoint discovery failed for the operation or discovered endpoint is not working, '\
61
+ 'request will keep failing until endpoint discovery succeeds or :endpoint option is provided.'
62
+ super(msg)
63
+ end
64
+ end
65
+
66
+ # raised when hostLabel member is not provided
67
+ # at operation input when endpoint trait is available
68
+ # with 'hostPrefix' requirement
69
+ class MissingEndpointHostLabelValue < RuntimeError
70
+
71
+ def initialize(name)
72
+ msg = "Missing required parameter #{name} to construct"\
73
+ " endpoint host prefix. You can disable host prefix by"\
74
+ " setting :disable_host_prefix_injection to `true`."
75
+ super(msg)
76
+ end
77
+
78
+ end
79
+
56
80
  # Raised when attempting to connect to an endpoint and a `SocketError`
57
81
  # is received from the HTTP client. This error is typically the result
58
82
  # of configuring an invalid `:region`.
@@ -0,0 +1,167 @@
1
+ module Aws
2
+ module Plugins
3
+
4
+ # Enables Endpoint Discovery per service when supported
5
+ #
6
+ # @seahorse.client.option [Boolean] :endpoint_discovery When
7
+ # set to `true`, endpoint discovery will be enabled for
8
+ # operations when available. Defaults to `false`.
9
+ #
10
+ # @seahorse.client.option [Integer] :endpoint_cache_max_entries
11
+ # Used for the maximum size limit of the LRU cache storing endpoints data
12
+ # for endpoint discovery enabled operations. Defaults to 1000.
13
+ #
14
+ # @seahorse.client.option [Integer] :endpoint_cache_max_threads
15
+ # Used for the maximum threads in use for polling endpoints to be cached,
16
+ # defaults to 10.
17
+ #
18
+ # @seahorse.client.option [Integer] :endpoint_cache_poll_interval
19
+ # When :endpoint_discovery and :active_endpoint_cache is enabled,
20
+ # Use this option to config the time interval in seconds for making
21
+ # requests fetching endpoints information. Defaults to 60 sec.
22
+ #
23
+ # @seahorse.client.option [Boolean] :active_endpoint_cache
24
+ # When set to `true`, a thread polling for endpoints will be running in
25
+ # the background every 60 secs (default). Defaults to `false`.
26
+ class EndpointDiscovery < Seahorse::Client::Plugin
27
+
28
+ option(:endpoint_discovery, false) do |cfg|
29
+ resolve_endpoint_discovery(cfg)
30
+ end
31
+
32
+ option(:endpoint_cache_max_entries, 1000)
33
+
34
+ option(:endpoint_cache_max_threads, 10)
35
+
36
+ option(:endpoint_cache_poll_interval, 60)
37
+
38
+ option(:endpoint_cache) do |cfg|
39
+ Aws::EndpointCache.new(
40
+ max_entries: cfg.endpoint_cache_max_entries,
41
+ max_threads: cfg.endpoint_cache_max_threads
42
+ )
43
+ end
44
+
45
+ option(:active_endpoint_cache, false)
46
+
47
+ def add_handlers(handlers, config)
48
+ handlers.add(Handler, priority: 90) if config.regional_endpoint
49
+ end
50
+
51
+ class Handler < Seahorse::Client::Handler
52
+
53
+ def call(context)
54
+ if context.operation.endpoint_operation
55
+ context.http_request.headers['x-amz-api-version'] = context.config.api.version
56
+ _apply_endpoint_discovery_user_agent(context)
57
+ elsif discovery_cfg = context.operation.endpoint_discovery
58
+ endpoint = _discover_endpoint(
59
+ context,
60
+ str_2_bool(discovery_cfg["required"])
61
+ )
62
+ context.http_request.endpoint = _valid_uri(endpoint.address) if endpoint
63
+ if endpoint || context.config.endpoint_discovery
64
+ _apply_endpoint_discovery_user_agent(context)
65
+ end
66
+ end
67
+ @handler.call(context)
68
+ end
69
+
70
+ private
71
+
72
+ def _valid_uri(address)
73
+ # returned address can be missing scheme
74
+ if address.start_with?('http')
75
+ URI.parse(address)
76
+ else
77
+ URI.parse("https://" + address)
78
+ end
79
+ end
80
+
81
+ def _apply_endpoint_discovery_user_agent(ctx)
82
+ if ctx.config.user_agent_suffix.nil?
83
+ ctx.config.user_agent_suffix = "endpoint-discovery"
84
+ elsif !ctx.config.user_agent_suffix.include? "endpoint-discovery"
85
+ ctx.config.user_agent_suffix += "endpoint-discovery"
86
+ end
87
+ end
88
+
89
+ def _discover_endpoint(ctx, required)
90
+ cache = ctx.config.endpoint_cache
91
+ key = cache.extract_key(ctx)
92
+
93
+ if required
94
+ # required for the operation
95
+ unless cache.key?(key)
96
+ cache.update(key, ctx)
97
+ end
98
+ endpoint = cache[key]
99
+ # hard fail if endpoint is not discovered
100
+ raise Aws::Errors::EndpointDiscoveryError.new unless endpoint
101
+ endpoint
102
+ elsif ctx.config.endpoint_discovery
103
+ # not required for the operation
104
+ # but enabled
105
+ if cache.key?(key)
106
+ cache[key]
107
+ elsif ctx.config.active_endpoint_cache
108
+ # enabled active cache pull
109
+ interval = ctx.config.endpoint_cache_poll_interval
110
+ if key.include?('_')
111
+ # identifier related, kill the previous polling thread by key
112
+ # because endpoint req params might be changed
113
+ cache.delete_polling_thread(key)
114
+ end
115
+
116
+ # start a thread for polling endpoints when non-exist
117
+ unless cache.threads_key?(key)
118
+ thread = Thread.new do
119
+ while !cache.key?(key) do
120
+ cache.update(key, ctx)
121
+ sleep(interval)
122
+ end
123
+ end
124
+ cache.update_polling_pool(key, thread)
125
+ end
126
+
127
+ cache[key]
128
+ else
129
+ # disabled active cache pull
130
+ # attempt, buit fail soft
131
+ cache.update(key, ctx)
132
+ cache[key]
133
+ end
134
+ end
135
+ end
136
+
137
+ def str_2_bool(str)
138
+ case str.to_s
139
+ when "true" then true
140
+ when "false" then false
141
+ else
142
+ nil
143
+ end
144
+ end
145
+
146
+ end
147
+
148
+ private
149
+
150
+ def self.resolve_endpoint_discovery(cfg)
151
+ env = ENV['AWS_ENABLE_ENDPOINT_DISCOVERY']
152
+ shared_cfg = Aws.shared_config.endpoint_discovery(profile: cfg.profile)
153
+ self.str_2_bool(env) || self.str_2_bool(shared_cfg)
154
+ end
155
+
156
+ def self.str_2_bool(str)
157
+ case str.to_s
158
+ when "true" then true
159
+ when "false" then false
160
+ else
161
+ nil
162
+ end
163
+ end
164
+
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,62 @@
1
+ module Aws
2
+ module Plugins
3
+
4
+ # Disable host prefix per operation when available
5
+ #
6
+ # @seahorse.client.option [Boolean] :disable_host_prefix_injection
7
+ # Set to true to disable SDK automatically adding host prefix
8
+ # to default service endpoint when available.
9
+ #
10
+ class EndpointPattern < Seahorse::Client::Plugin
11
+
12
+ option(:disable_host_prefix_injection, false)
13
+
14
+ def add_handlers(handlers, config)
15
+ if config.regional_endpoint && !config.disable_host_prefix_injection
16
+ handlers.add(Handler, priority: 90)
17
+ end
18
+ end
19
+
20
+ class Handler < Seahorse::Client::Handler
21
+
22
+ def call(context)
23
+ endpoint_trait = context.operation.endpoint_pattern
24
+ if endpoint_trait && !endpoint_trait.empty?
25
+ _apply_endpoint_trait(context, endpoint_trait)
26
+ end
27
+ @handler.call(context)
28
+ end
29
+
30
+ private
31
+
32
+ def _apply_endpoint_trait(context, trait)
33
+ # currently only support host pattern
34
+ ori_host = context.http_request.endpoint.host
35
+ if pattern = trait['hostPrefix']
36
+ host_prefix = pattern.gsub(/\{.+?\}/) do |label|
37
+ label = label.delete("{}")
38
+ _replace_label_value(
39
+ ori_host, label, context.operation.input, context.params)
40
+ end
41
+ context.http_request.endpoint.host = host_prefix + context.http_request.endpoint.host
42
+ end
43
+ end
44
+
45
+ def _replace_label_value(ori, label, input_ref, params)
46
+ name = nil
47
+ input_ref.shape.members.each do |m_name, ref|
48
+ if ref['hostLabel'] && ref['hostLabelName'] == label
49
+ name = m_name
50
+ end
51
+ end
52
+ if name.nil? || params[name].nil?
53
+ raise Errors::MissingEndpointHostLabelValue.new(name)
54
+ end
55
+ params[name]
56
+ end
57
+
58
+ end
59
+
60
+ end
61
+ end
62
+ end
@@ -20,6 +20,8 @@ module Aws
20
20
  resolve_region(cfg)
21
21
  end
22
22
 
23
+ option(:regional_endpoint, false)
24
+
23
25
  option(:endpoint) do |cfg|
24
26
  endpoint_prefix = cfg.api.metadata['endpointPrefix']
25
27
  if cfg.region && endpoint_prefix
@@ -71,6 +71,25 @@ module Aws
71
71
  (500..599).include?(@http_status_code)
72
72
  end
73
73
 
74
+ def endpoint_discovery?(context)
75
+ return false unless context.operation.endpoint_discovery
76
+
77
+ if @http_status_code == 421 ||
78
+ extract_name(@error) == 'InvalidEndpointException'
79
+ @error = Errors::EndpointDiscoveryError.new
80
+ end
81
+
82
+ # When endpoint discovery error occurs
83
+ # evict the endpoint from cache
84
+ if @error.is_a?(Errors::EndpointDiscoveryError)
85
+ key = context.config.endpoint_cache.extract_key(context)
86
+ context.config.endpoint_cache.delete(key)
87
+ true
88
+ else
89
+ false
90
+ end
91
+ end
92
+
74
93
  private
75
94
 
76
95
  def extract_name(error)
@@ -135,7 +154,8 @@ module Aws
135
154
  error.throttling_error? or
136
155
  error.checksum? or
137
156
  error.networking? or
138
- error.server?
157
+ error.server? or
158
+ error.endpoint_discovery?(context)
139
159
  end
140
160
 
141
161
  def refreshable_credentials?(context)
@@ -7,7 +7,9 @@ module Aws
7
7
 
8
8
  class Handler < Seahorse::Client::Handler
9
9
  def call(context)
10
- move_account_id_to_subdomain(context)
10
+ if context.operation.endpoint_pattern.nil?
11
+ move_account_id_to_subdomain(context)
12
+ end
11
13
  @handler.call(context)
12
14
  end
13
15
 
@@ -128,6 +128,13 @@ module Aws
128
128
  end
129
129
  end
130
130
 
131
+ def endpoint_discovery(opts = {})
132
+ p = opts[:profile] || @profile_name
133
+ if @config_enabled && @parsed_config
134
+ @parsed_config.fetch(p, {})["endpoint_discovery_enabled"]
135
+ end
136
+ end
137
+
131
138
  private
132
139
  def credentials_present?
133
140
  (@parsed_credentials && !@parsed_credentials.empty?) ||
@@ -1,3 +1,3 @@
1
1
  module Aws
2
- VERSION = '2.11.175'
2
+ VERSION = '2.11.176'
3
3
  end
@@ -197,7 +197,13 @@ module Seahorse
197
197
 
198
198
  def value_at(opt_name)
199
199
  value = @struct[opt_name]
200
- value.is_a?(Defaults) ? resolve_defaults(opt_name, value) : value
200
+ if value.is_a?(Defaults)
201
+ # this config value is used by endpoint discovery etc
202
+ @struct[:regional_endpoint] = true if opt_name == :endpoint
203
+ resolve_defaults(opt_name, value)
204
+ else
205
+ value
206
+ end
201
207
  end
202
208
 
203
209
  def resolve_defaults(opt_name, defaults)
@@ -5,6 +5,7 @@ module Seahorse
5
5
  def initialize
6
6
  @metadata = {}
7
7
  @operations = {}
8
+ @endpoint_operation = nil
8
9
  end
9
10
 
10
11
  # @return [String, nil]
@@ -13,6 +14,9 @@ module Seahorse
13
14
  # @return [Hash]
14
15
  attr_accessor :metadata
15
16
 
17
+ # @return [Symbol|nil]
18
+ attr_accessor :endpoint_operation
19
+
16
20
  def operations(&block)
17
21
  if block_given?
18
22
  @operations.each(&block)
@@ -22,9 +22,18 @@ module Seahorse
22
22
  # @return [Boolean]
23
23
  attr_accessor :deprecated
24
24
 
25
+ # @return [Boolean]
26
+ attr_accessor :endpoint_operation
27
+
28
+ # @return [Hash]
29
+ attr_accessor :endpoint_discovery
30
+
25
31
  # @return [String, nil]
26
32
  attr_accessor :documentation
27
33
 
34
+ # @return [Hash, nil]
35
+ attr_accessor :endpoint_pattern
36
+
28
37
  # @return [ShapeRef, nil]
29
38
  attr_accessor :input
30
39
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aws-sdk-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.11.175
4
+ version: 2.11.176
5
5
  platform: ruby
6
6
  authors:
7
7
  - Amazon Web Services
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-20 00:00:00.000000000 Z
11
+ date: 2018-11-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jmespath
@@ -765,6 +765,7 @@ files:
765
765
  - lib/aws-sdk-core/elastictranscoder.rb
766
766
  - lib/aws-sdk-core/empty_structure.rb
767
767
  - lib/aws-sdk-core/emr.rb
768
+ - lib/aws-sdk-core/endpoint_cache.rb
768
769
  - lib/aws-sdk-core/endpoint_provider.rb
769
770
  - lib/aws-sdk-core/errors.rb
770
771
  - lib/aws-sdk-core/firehose.rb
@@ -848,6 +849,8 @@ files:
848
849
  - lib/aws-sdk-core/plugins/dynamodb_simple_attributes.rb
849
850
  - lib/aws-sdk-core/plugins/ec2_copy_encrypted_snapshot.rb
850
851
  - lib/aws-sdk-core/plugins/ec2_region_validation.rb
852
+ - lib/aws-sdk-core/plugins/endpoint_discovery.rb
853
+ - lib/aws-sdk-core/plugins/endpoint_pattern.rb
851
854
  - lib/aws-sdk-core/plugins/glacier_account_id.rb
852
855
  - lib/aws-sdk-core/plugins/glacier_api_version.rb
853
856
  - lib/aws-sdk-core/plugins/glacier_checksums.rb