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:
		@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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:
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user