class Aws::Waiters::Poller

Polls a single API operation inspecting the response data and/or error for states matching one of its acceptors. @api private

Constants

RAISE_HANDLER

@api private

Attributes

operation_name[R]

@return [Symbol]

Public Class Methods

new(options = {}) click to toggle source

@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

Public Instance Methods

call(options = {}) click to toggle source

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

Private Instance Methods

acceptor_matches?(acceptor, response) click to toggle source
# File lib/aws-sdk-core/waiters/poller.rb, line 64
def acceptor_matches?(acceptor, response)
  send("matches_#{acceptor['matcher']}?", acceptor, response)
end
matches_error?(acceptor, response) click to toggle source
# 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
matches_path?(acceptor, response) click to toggle source
# 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
matches_pathAll?(acceptor, response) click to toggle source
# 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
matches_pathAny?(acceptor, response) click to toggle source
# 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
matches_status?(acceptor, response) click to toggle source
# File lib/aws-sdk-core/waiters/poller.rb, line 88
def matches_status?(acceptor, response)
  response.context.http_response.status_code == acceptor['expected']
end
non_empty_array(acceptor, response) { |values| ... } click to toggle source
# 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
path(acceptor) click to toggle source
# 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
send_request(options) click to toggle source
# 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
underscore(str) click to toggle source
# File lib/aws-sdk-core/waiters/poller.rb, line 112
def underscore(str)
  Seahorse::Util.underscore(str)
end