Module: Gerrit2jiracomment

Defined in:
lib/gerrit2jiracomment.rb,
lib/gerrit2jiracomment/version.rb

Overview

Gerrit 2 jira sync module

Defined Under Namespace

Classes: LoggerWithTag, ProcessException, ToJira

Constant Summary collapse

VERSION =
'0.2.6'

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.connect(logger, subject, event_sink) ⇒ Object



210
211
212
213
214
215
216
# File 'lib/gerrit2jiracomment.rb', line 210

def self.connect(logger, subject, event_sink)
  subject.as_observable.subscribe(
    ->(e) { dispatch(logger, e, event_sink) },
    ->(_err) { logger.error(error) },
    -> { logger.info('lifecycle†finished') }
  )
end

.dispatch(log, e, sink) ⇒ Object



152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/gerrit2jiracomment.rb', line 152

def self.dispatch(log, e, sink)
  logger = LoggerWithTag.new(log, 'events')
  event = e.first
  server = e[1]
  return sink.send(event.type.tr('-', '_').to_sym, log, event, server)
rescue NoMethodError => e
  logger.debug("Cannot handle event of type #{event.type} - #{e}")
  false
rescue StandardError => error
  logger.error('Cannot process event', error)
  false
end

.init_loggerObject



180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/gerrit2jiracomment.rb', line 180

def self.init_logger
  logger = syslog_or_stdout_logger
  logger.formatter = proc do |severity, datetime, _progname, msg|
    tag, message = tag_and_message(msg)
    format('%<year>04d-%<month>02d-%<day>02d %<hour>02d:%<min>02d:' \
           "%<sec>02d.000 7331 %<severity>s %<tag>s: %<message>s\n",
           year: datetime.year, month: datetime.month, day: datetime.day,
           hour: datetime.hour, min: datetime.min, sec: datetime.sec,
           severity: severity[0], tag: tag, message: message)
  end
  logger
end

.load_settings(logger) ⇒ Object



193
194
195
196
# File 'lib/gerrit2jiracomment.rb', line 193

def self.load_settings(logger)
  logger.debug('lifecycle†loading settings from settings.yaml.gpg')
  YAML.safe_load(`gpg --decrypt settings.yaml.gpg 2> /dev/null`)
end

.parse_json(line) ⇒ Object



130
131
132
# File 'lib/gerrit2jiracomment.rb', line 130

def self.parse_json(line)
  JSON.parse(line, object_class: OpenStruct)
end

.receive_events(logger, from, sink) ⇒ Object



140
141
142
143
144
145
146
147
148
149
150
# File 'lib/gerrit2jiracomment.rb', line 140

def self.receive_events(logger, from, sink)
  Thread.new do
    logger.debug("lifecycle†Connecting to event stream of #{from}")
    stdout_in_utf8("ssh #{from} gerrit stream-events").each_line do |line|
      sink.on_next([JSON.parse(line, object_class: OpenStruct), from])
    end
    logger.debug("lifecycle†Processing stream from #{from} finished")
  rescue StandardError => e
    logger.error(e.to_s)
  end
end

.regexpObject



40
41
42
# File 'lib/gerrit2jiracomment.rb', line 40

def self.regexp
  Regexp.new('\\b*[A-Z0-9]+-\\d+\\b*')
end

.runObject



223
224
225
226
227
228
229
230
231
232
233
234
235
236
# File 'lib/gerrit2jiracomment.rb', line 223

def self.run
  logger = init_logger

  settings = load_settings(logger)

  subject = Rx::Subject.new
  event_sink = to_jira(logger, settings)

  connect(logger, subject, event_sink)
  hosts
    .map { |server| receive_events(logger, server, subject) }
    .each(&:join)
  logger.info('lifecycle†exiting')
end

.stdout_in_utf8(command) ⇒ Object



134
135
136
137
138
# File 'lib/gerrit2jiracomment.rb', line 134

def self.stdout_in_utf8(command)
  _stdin, stdout, _stderr = Open3.popen3(command)
  stdout.set_encoding 'UTF-8:UTF-8'
  stdout
end

.syslog_or_stdout_loggerObject



165
166
167
168
169
# File 'lib/gerrit2jiracomment.rb', line 165

def self.syslog_or_stdout_logger
  Syslog::Logger.new 'g2jc'
rescue StandardError
  Logger.new(STDOUT)
end

.tag_and_message(msg) ⇒ Object



171
172
173
174
175
176
177
178
# File 'lib/gerrit2jiracomment.rb', line 171

def self.tag_and_message(msg)
  tag, m = msg.split('')
  unless m
    m = tag
    tag = 'gerrit2jiracomment'
  end
  [tag, m]
end

.to_jira(logger, settings) ⇒ Object



198
199
200
201
202
203
204
205
206
207
208
# File 'lib/gerrit2jiracomment.rb', line 198

def self.to_jira(logger, settings)
  ToJira.new(logger,
             JIRA::Client.new(
               username: settings['jira_user'],
               password: settings['jira_password'],
               site: 'https://esrlabs.atlassian.net/',
               context_path: '', auth_type: :basic,
               use_ssl: true,
               ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE
             ))
end

Instance Method Details

#hostsObject



218
219
220
221
# File 'lib/gerrit2jiracomment.rb', line 218

def hosts
  ['gerrit.int.esrlabs.com', 'git.esrlabs.com',
   'hcp5-sources.int.esrlabs.com']
end