class Gitlab::Triage::Network

Constants

MINIMUM_RATE_LIMIT
TokenNotFound

Attributes

adapter[R]
options[R]

Public Class Methods

new(adapter) click to toggle source
# File lib/gitlab/triage/network.rb, line 18
def initialize(adapter)
  @adapter = adapter
  @options = adapter.options
  @cache = {}
end

Public Instance Methods

post_api(url, body) click to toggle source
# File lib/gitlab/triage/network.rb, line 64
def post_api(url, body)
  response = execute_with_retry(
    exception_types: Net::ReadTimeout,
    backoff_exceptions: Errors::Network::TooManyRequests) do
    puts Gitlab::Triage::UI.debug "post_api: #{url}" if options.debug

    @adapter.post(token, url, body)
  end

  rate_limit_debug(response) if options.debug
  rate_limit_wait(response)

  results = response.delete(:results)

  case results
  when Hash
    results.with_indifferent_access
  else
    raise_unexpected_response(results)
  end
rescue Net::ReadTimeout
  {}
end
query_api(url) click to toggle source
# File lib/gitlab/triage/network.rb, line 28
def query_api(url)
  response = {}
  resources = []

  begin
    print '.'
    url = response.fetch(:next_page_url) { url }

    response = execute_with_retry(
      exception_types: [Net::ReadTimeout, Errors::Network::InternalServerError],
      backoff_exceptions: Errors::Network::TooManyRequests) do
      puts Gitlab::Triage::UI.debug "query_api: #{url}" if options.debug

      @adapter.get(token, url)
    end

    results = response.delete(:results)

    case results
    when Array
      resources.concat(results)
    when Hash
      resources << results
    else
      raise_unexpected_response(results)
    end

    rate_limit_debug(response) if options.debug
    rate_limit_wait(response)
  end while response.delete(:more_pages)

  resources.map!(&:with_indifferent_access)
rescue Net::ReadTimeout
  []
end
query_api_cached(url) click to toggle source
# File lib/gitlab/triage/network.rb, line 24
def query_api_cached(url)
  @cache[url] || @cache[url] = query_api(url)
end

Private Instance Methods

raise_unexpected_response(results) click to toggle source
# File lib/gitlab/triage/network.rb, line 106
def raise_unexpected_response(results)
  raise Errors::Network::UnexpectedResponse, "Unexpected response: #{results.inspect}"
end
rate_limit_debug(response) click to toggle source
# File lib/gitlab/triage/network.rb, line 94
def rate_limit_debug(response)
  rate_limit_infos = "Rate limit remaining: #{response[:ratelimit_remaining]} (reset at #{response[:ratelimit_reset_at]})"
  puts Gitlab::Triage::UI.debug "rate_limit_infos: #{rate_limit_infos}"
end
rate_limit_wait(response) click to toggle source
# File lib/gitlab/triage/network.rb, line 99
def rate_limit_wait(response)
  return unless response.delete(:ratelimit_remaining) < MINIMUM_RATE_LIMIT

  puts Gitlab::Triage::UI.debug "Rate limit almost exceeded, sleeping for #{response[:ratelimit_reset_at] - Time.now} seconds" if options.debug
  sleep(1) until Time.now >= response[:ratelimit_reset_at]
end
token() click to toggle source
# File lib/gitlab/triage/network.rb, line 90
def token
  options.token || raise(TokenNotFound)
end