module FerrisBueller::Helpers

Public Instance Methods

go_handle_postbacks(queue) click to toggle source
# File lib/ferris-bueller/helpers.rb, line 53
def go_handle_postbacks queue
  Thread.new do
    loop do
      post_lambda = queue.pop
      response, uri_string = post_lambda.call
      uri = URI uri_string
      log.debug \
        event: 'sending Slack response',
        path: uri_string,
        data: response
      Net::HTTP.start(uri.hostname, uri.port, :use_ssl => uri.scheme == 'https') do |http|
        req = Net::HTTP::Post.new uri
        req['Content-Type'] = 'application/json'
        req['Accept'] = 'application/json'
        req.body = JSON.generate response
        http.request req
      end
    end
  end
end
go_refresh_jira_incidents() click to toggle source
# File lib/ferris-bueller/helpers.rb, line 94
def go_refresh_jira_incidents
  Thread.new do
    loop do
      refresh_jira_incidents
      sleep options.incident_refresh
    end
  end
end
go_refresh_jira_members() click to toggle source
# File lib/ferris-bueller/helpers.rb, line 84
def go_refresh_jira_members
  Thread.new do
    loop do
      refresh_jira_members
      sleep options.member_refresh
    end
  end
end
go_refresh_jira_users() click to toggle source
# File lib/ferris-bueller/helpers.rb, line 74
def go_refresh_jira_users
  Thread.new do
    loop do
      refresh_jira_users
      sleep options.user_refresh
    end
  end
end
jira_request(path, params) click to toggle source
# File lib/ferris-bueller/helpers.rb, line 195
def jira_request path, params
  api_url = File.join options.jira_url, 'rest/api/latest', path
  log.debug \
    event: 'jira request',
    path: path,
    params: params,
    api_url: api_url
  encoded_params = QueryParams.encode params
  uri = URI(api_url + '?' + encoded_params)
  http = Net::HTTP.new uri.host, uri.port
  req = Net::HTTP::Get.new uri
  req.use_ssl if uri.scheme == 'https'
  req.basic_auth options.jira_user, options.jira_pass
  req['Content-Type'] = 'application/json'
  req['Accept'] = 'application/json'
  resp = http.request req
  log.debug \
    event: 'jira request responded',
    path: path,
    params: params,
    api_url: api_url,
    response: resp
  JSON.parse resp.body, symbolize_names: true
end
refresh_jira_incidents() click to toggle source
# File lib/ferris-bueller/helpers.rb, line 172
def refresh_jira_incidents
  data = jira_request 'search', \
    jql: "project = #{options.jira_project} ORDER BY created ASC, priority DESC",
    fields: SHOW_FIELDS.keys.join(','),
    startAt: 0,
    maxResults: 1_000_000

  store[:jira_incidents] = data[:issues].map do |i|
    i[:num] = i[:key].split('-', 2).last ; i
  end
rescue StandardError => e
  log.error \
    error: 'could not refresh incidents',
    event: 'exception',
    class: e.class,
    message: e.message.inspect,
    backtrace: e.backtrace,
    remediation: 'pausing breifly before retrying'
  sleep RETRY_DELAY
  retry
end
refresh_jira_members() click to toggle source
# File lib/ferris-bueller/helpers.rb, line 134
def refresh_jira_members
  req_path = 'rest/api/2/group/member'
  is_last, values, start = false, [], 0
  until is_last
    req_params = QueryParams.encode \
      groupname: options.jira_group,
      startAt: start

    uri = URI(options.jira_url + req_path + '?' + req_params)
    http = Net::HTTP.new uri.hostname, uri.port

    req = Net::HTTP::Get.new uri
    req.basic_auth options.jira_user, options.jira_pass
    req['Content-Type'] = 'application/json'
    req['Accept'] = 'application/json'

    resp    = http.request req
    data    = JSON.parse resp.body
    values += data['values']
    is_last = data['isLast']
    start  += data['maxResults']
  end

  user_names = values.map { |u| u['name'] }
  store[:jira_members] = user_names
rescue StandardError => e
  log.error \
    error: 'could not refresh members',
    event: 'exception',
    class: e.class,
    message: e.message.inspect,
    backtrace: e.backtrace,
    remediation: 'pausing breifly before retrying'
  sleep RETRY_DELAY
  retry
end
refresh_jira_users() click to toggle source
# File lib/ferris-bueller/helpers.rb, line 104
def refresh_jira_users
  data = jira_request 'user/assignable/search', \
    project: options.jira_project,
    startAt: 0,
    maxResults: 1_000_000

  users = data.inject({}) do |h, user|
    h[user[:name]] = {
      key: user[:key],
      nick: user[:name],
      name: user[:displayName],
      email: user[:emailAddress]
    } ; h
  end

  store[:jira_users] = users

rescue StandardError => e
  log.error \
    error: 'could not refresh users',
    event: 'exception',
    class: e.class,
    message: e.message.inspect,
    backtrace: e.backtrace,
    remediation: 'pausing breifly before retrying'
  sleep RETRY_DELAY
  retry
end
start_your_day_off(queue) click to toggle source
# File lib/ferris-bueller/helpers.rb, line 21
def start_your_day_off queue
  Web.set :environment, options.environment
  Web.set :port, options.port
  Web.set :bind, options.bind
  Web.set :store, @store
  Web.set :logger, log
  Web.set :verification_token, options.verification_token
  Web.set :api, SlackAPI.new(token: options.api_token, logger: log)
  Web.set :jira, JiraAPI.new(
    api_url: options.jira_url,
    user: options.jira_user,
    pass: options.jira_pass,
    logger: log
  )
  Web.set :jira_project, options.jira_project
  Web.set :jira_url, options.jira_url
  Web.set :jira_type, options.jira_type
  Web.set :refresh_rate, options.incident_refresh
  Web.set :post_queue, queue

  if log.level >= ::Logger::DEBUG
    Web.set :raise_errors, true
    Web.set :dump_errors, true
    Web.set :show_exceptions, true
    Web.set :logging, ::Logger::DEBUG
  end

  Thin::Logging.logger = log

  Web.run!
end
store() click to toggle source
# File lib/ferris-bueller/helpers.rb, line 18
def store ; @store end