Polls a single API operation inspecting the response data and/or error for states matching one of its acceptors. @api private
@api private
@return [Symbol]
@api private
# File lib/aws-sdk-core/waiters/poller.rb, line 13 def initialize(options = {}) @operation_name = underscore(options['operation']).to_sym @acceptors = options['acceptors'] || [] end
Makes an API call, returning the resultant state and the response.
`:success` - A success state has been matched.
`:failure` - A terminate failure state has been matched.
`:retry` - The waiter may be retried.
`:error` - The waiter encountered an un-expected error.
@example A trival (bad) example of a waiter that polls indefinetly.
loop do state, resp = poller.call(client:client, params:{}) case state when :success then return true when :failure then return false when :retry then next when :error then raise 'oops' end end
@option options [required,Client] :client @option options [required,Hash] :params @return [Array<Symbol,Response>]
# File lib/aws-sdk-core/waiters/poller.rb, line 46 def call(options = {}) response = send_request(options) @acceptors.each do |acceptor| if acceptor_matches?(acceptor, response) return [acceptor['state'].to_sym, response] end end [response.error ? :error : :retry, response] end
# File lib/aws-sdk-core/waiters/poller.rb, line 64 def acceptor_matches?(acceptor, response) send("matches_#{acceptor['matcher']}?", acceptor, response) end
# File lib/aws-sdk-core/waiters/poller.rb, line 92 def matches_error?(acceptor, response) Aws::Errors::ServiceError === response.error && response.error.code == acceptor['expected'].gsub('.', '') end
# File lib/aws-sdk-core/waiters/poller.rb, line 68 def matches_path?(acceptor, response) if response.data JMESPath.search(path(acceptor), response.data) == acceptor['expected'] else false end end
# File lib/aws-sdk-core/waiters/poller.rb, line 76 def matches_pathAll?(acceptor, response) non_empty_array(acceptor, response) do |values| values.all? { |value| value == acceptor['expected'] } end end
# File lib/aws-sdk-core/waiters/poller.rb, line 82 def matches_pathAny?(acceptor, response) non_empty_array(acceptor, response) do |values| values.any? { |value| value == acceptor['expected'] } end end
# File lib/aws-sdk-core/waiters/poller.rb, line 88 def matches_status?(acceptor, response) response.context.http_response.status_code == acceptor['expected'] end
# File lib/aws-sdk-core/waiters/poller.rb, line 103 def non_empty_array(acceptor, response, &block) if response.data values = JMESPath.search(path(acceptor), response.data) Array === values && values.count > 0 ? yield(values) : false else false end end
# File lib/aws-sdk-core/waiters/poller.rb, line 97 def path(acceptor) acceptor['argument'].gsub(/(?<![`'])\b\w+\b(?![`'])/) do |str| Seahorse::Util.underscore(str) end end
# File lib/aws-sdk-core/waiters/poller.rb, line 58 def send_request(options) req = options[:client].build_request(@operation_name, options[:params]) req.handlers.remove(RAISE_HANDLER) req.send_request end
# File lib/aws-sdk-core/waiters/poller.rb, line 112 def underscore(str) Seahorse::Util.underscore(str) end