objectify the gerrit event for our purposes

instead of passing around complex data structures, create an
event object for our purposes that means we can pass around the
payload relevant to us. Simplifies some things, and will make
adding build_uuid tighter.

Change-Id: I8172b25ae3c60e38d63cf7f4d8a0f6c854bae766
This commit is contained in:
Sean Dague
2014-01-20 16:02:23 -05:00
parent a58b9b2644
commit 8ef26cbed2
3 changed files with 63 additions and 33 deletions

View File

@@ -108,19 +108,14 @@ class RecheckWatch(threading.Thread):
self.commenting = commenting
self.key = key
def new_error(self, channel, data):
msg = '%s change: %s failed tempest with an unrecognized error' % (
data['change']['project'],
data['change']['url'])
def new_error(self, channel, event):
msg = '%s change: %s failed with an unrecognized error' % (
event.project, event.url)
self.print_msg(channel, msg)
def error_found(self, channel, data):
msg = ('%s change: %s failed tempest because of: ' % (
data['change']['project'],
data['change']['url']))
bug_urls = ['https://bugs.launchpad.net/bugs/%s' % x for x
in data['bug_numbers']]
msg += ' and '.join(bug_urls)
def error_found(self, channel, event):
msg = ('%s change: %s failed tempest because of: %s' % (
event.project, event.url, event.bug_urls()))
self.print_msg(channel, msg)
def print_msg(self, channel, msg):
@@ -128,17 +123,17 @@ class RecheckWatch(threading.Thread):
if self.ircbot:
self.ircbot.send(channel, msg)
def _read(self, data={}, msg=""):
def _read(self, event, msg=""):
for channel in self.channel_config.channels:
if msg:
if channel in self.channel_config.events['negative']:
self.print_msg(channel, msg)
elif data.get('bug_numbers'):
elif event.bugs:
if channel in self.channel_config.events['positive']:
self.error_found(channel, data)
self.error_found(channel, event)
else:
if channel in self.channel_config.events['negative']:
self.new_error(channel, data)
self.new_error(channel, event)
def run(self):
# Import here because it needs to happen after daemonization
@@ -148,19 +143,17 @@ class RecheckWatch(threading.Thread):
while True:
try:
event = stream.get_failed_tempest()
change = event['change']['number']
rev = event['patchSet']['number']
change_id = "%s,%s" % (change, rev)
project = event['change']['project']
bug_numbers = classifier.classify(change, rev)
if not bug_numbers:
event.bugs = classifier.classify(event.change, event.rev)
if not event.bugs:
self._read(event)
else:
event['bug_numbers'] = bug_numbers
self._read(data=event)
self._read(event)
if self.commenting:
stream.leave_comment(project, change_id, bug_numbers)
stream.leave_comment(
event.project,
event.name(),
event.bugs)
except er.ResultTimedOut as e:
LOG.warn(e.msg)
self._read(msg=e.msg)

View File

@@ -63,6 +63,27 @@ class ResultTimedOut(Exception):
self.msg = msg
class FailEvent(object):
change = None
rev = None
project = None
url = None
bugs = []
def __init__(self, event):
self.change = event['change']['number']
self.rev = event['patchSet']['number']
self.project = event['change']['project']
self.url = event['change']['url']
def name(self):
return "%s,%s" % (self.change, self.rev)
def bug_urls(self):
urls = ['https://bugs.launchpad.net/bugs/%s' % x for x in self.bugs]
return ' and '.join(urls)
class Stream(object):
"""Gerrit Stream.
@@ -197,12 +218,11 @@ class Stream(object):
if not self._is_openstack_project(event):
continue
change = event['change']['number']
rev = event['patchSet']['number']
fevent = FailEvent(event)
LOG.info("Looking for failures in %s,%s on %s" %
(change, rev, ", ".join(failed_jobs)))
if self._does_es_have_data(change, rev, failed_jobs):
return event
(fevent.change, fevent.rev, ", ".join(failed_jobs)))
if self._does_es_have_data(fevent.change, fevent.rev, failed_jobs):
return fevent
def leave_comment(self, project, commit, bugs=None):
if bugs:

View File

@@ -39,10 +39,27 @@ class TestStream(tests.TestCase):
# there are currently 10 events in the stream, 3 are
# failures
for i in xrange(3):
event = stream.get_failed_tempest()
self.assertEqual(event['author']['username'], 'jenkins')
self.assertIn('Build failed', event['comment'])
event = stream.get_failed_tempest()
self.assertEqual(event.change, "64749")
self.assertEqual(event.rev, "6")
self.assertEqual(event.project, "openstack/keystone")
self.assertEqual(event.name(), "64749,6")
self.assertEqual(event.url, "https://review.openstack.org/64749")
event = stream.get_failed_tempest()
self.assertEqual(event.change, "63078")
self.assertEqual(event.rev, "19")
self.assertEqual(event.project, "openstack/horizon")
self.assertEqual(event.name(), "63078,19")
self.assertEqual(event.url, "https://review.openstack.org/63078")
event = stream.get_failed_tempest()
self.assertEqual(event.change, "65361")
self.assertEqual(event.rev, "2")
self.assertEqual(event.project, "openstack/requirements")
self.assertEqual(event.name(), "65361,2")
self.assertEqual(event.url, "https://review.openstack.org/65361")
self.assertRaises(
fg.GerritDone,
stream.get_failed_tempest)