Module: FerrisBueller::Helpers

Includes:
Constants
Included in:
Main
Defined in:
lib/ferris-bueller/helpers.rb

Constant Summary

Constants included from Constants

Constants::CLOSED_STATE, Constants::CLOSED_TRANSITIONS, Constants::HELP_TEXT, Constants::RESOLVED_STATE, Constants::RESOLVED_TRANSITIONS, Constants::RETRY_DELAY, Constants::SEVERITIES, Constants::SEVERITY_FIELD, Constants::SHOW_FIELDS

Instance Method Summary collapse

Instance Method Details

#go_handle_postbacks(queue) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# 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_incidentsObject



94
95
96
97
98
99
100
101
# 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_membersObject



84
85
86
87
88
89
90
91
# 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_usersObject



74
75
76
77
78
79
80
81
# 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) ⇒ Object



195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
# 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_incidentsObject



172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
# 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_membersObject



134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
# 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_usersObject



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# 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) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 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

#storeObject



18
# File 'lib/ferris-bueller/helpers.rb', line 18

def store ; @store end