Make IRC bot list which failures were seen in which job.
Instead of saying you failed x jobs, because of y bugs. Map the two. Some refactoring was needed to add unit tests. Change-Id: I1c49c8cd4df24c7fb4c152e188f74caa13dfed9c
This commit is contained in:
parent
dba919e385
commit
dcff5a4739
@ -119,6 +119,18 @@ class RecheckWatch(threading.Thread):
|
|||||||
'production',
|
'production',
|
||||||
LPCACHEDIR)
|
LPCACHEDIR)
|
||||||
|
|
||||||
|
def display(self, channel, event):
|
||||||
|
display = False
|
||||||
|
for project in self._get_bug_projects(event.get_all_bugs()):
|
||||||
|
if channel in self.channel_config.projects['all']:
|
||||||
|
display = True
|
||||||
|
break
|
||||||
|
elif project in self.channel_config.projects:
|
||||||
|
if channel in self.channel_config.projects[project]:
|
||||||
|
display = True
|
||||||
|
break
|
||||||
|
return display
|
||||||
|
|
||||||
def new_error(self, channel, event):
|
def new_error(self, channel, event):
|
||||||
# only on gate fails
|
# only on gate fails
|
||||||
queue = event.queue()
|
queue = event.queue()
|
||||||
@ -132,21 +144,11 @@ class RecheckWatch(threading.Thread):
|
|||||||
self.print_msg(channel, msg)
|
self.print_msg(channel, msg)
|
||||||
|
|
||||||
def error_found(self, channel, event):
|
def error_found(self, channel, event):
|
||||||
msg = ('%s change: %s failed %s because of: %s' % (
|
msg = ('%s change: %s failed because of: %s' % (
|
||||||
event.project,
|
event.project,
|
||||||
event.url,
|
event.url,
|
||||||
", ".join(event.failed_job_names()),
|
", ".join(event.bug_urls_map())))
|
||||||
" and ".join(event.bug_urls())))
|
if self.display(channel, event):
|
||||||
display = False
|
|
||||||
for project in self._get_bug_projects(event.get_all_bugs()):
|
|
||||||
if channel in self.channel_config.projects['all']:
|
|
||||||
display = True
|
|
||||||
break
|
|
||||||
elif project in self.channel_config.projects:
|
|
||||||
if channel in self.channel_config.projects[project]:
|
|
||||||
display = True
|
|
||||||
break
|
|
||||||
if display:
|
|
||||||
self.print_msg(channel, msg)
|
self.print_msg(channel, msg)
|
||||||
else:
|
else:
|
||||||
self.log.info("Didn't leave a message on channel %s for %s because"
|
self.log.info("Didn't leave a message on channel %s for %s because"
|
||||||
|
@ -16,9 +16,30 @@ import ConfigParser
|
|||||||
import unittest
|
import unittest
|
||||||
import yaml
|
import yaml
|
||||||
|
|
||||||
|
import fixtures
|
||||||
import mock
|
import mock
|
||||||
|
|
||||||
from elastic_recheck import bot
|
from elastic_recheck import bot
|
||||||
|
from elastic_recheck import elasticRecheck
|
||||||
|
from elastic_recheck import tests
|
||||||
|
import elastic_recheck.tests.unit.fake_gerrit as fg
|
||||||
|
|
||||||
|
|
||||||
|
def _set_fake_config(fake_config):
|
||||||
|
fake_config.add_section('ircbot')
|
||||||
|
fake_config.add_section('gerrit')
|
||||||
|
# Set fake ircbot config
|
||||||
|
fake_config.set('ircbot', 'nick', 'Fake_User')
|
||||||
|
fake_config.set('ircbot', 'pass', '')
|
||||||
|
fake_config.set('ircbot', 'server', 'irc.fake.net')
|
||||||
|
fake_config.set('ircbot', 'port', 6667)
|
||||||
|
fake_config.set('ircbot', 'channel_config',
|
||||||
|
'fake_recheck_watch_bot.yaml')
|
||||||
|
# Set fake gerrit config
|
||||||
|
fake_config.set('gerrit', 'user', 'fake_user')
|
||||||
|
fake_config.set('gerrit', 'query_file', 'fake_query_file')
|
||||||
|
fake_config.set('gerrit', 'host', 'fake_host.openstack.org')
|
||||||
|
fake_config.set('gerrit', 'key', 'abc123def456')
|
||||||
|
|
||||||
|
|
||||||
# NOTE(mtreinish) Using unittest here because testtools TestCase.assertRaises
|
# NOTE(mtreinish) Using unittest here because testtools TestCase.assertRaises
|
||||||
@ -27,7 +48,7 @@ class TestBot(unittest.TestCase):
|
|||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestBot, self).setUp()
|
super(TestBot, self).setUp()
|
||||||
self.fake_config = ConfigParser.ConfigParser({'server_password': None})
|
self.fake_config = ConfigParser.ConfigParser({'server_password': None})
|
||||||
self._set_fake_config()
|
_set_fake_config(self.fake_config)
|
||||||
self.channel_config = bot.ChannelConfig(yaml.load(
|
self.channel_config = bot.ChannelConfig(yaml.load(
|
||||||
open('recheckwatchbot.yaml')))
|
open('recheckwatchbot.yaml')))
|
||||||
with mock.patch('launchpadlib.launchpad.Launchpad'):
|
with mock.patch('launchpadlib.launchpad.Launchpad'):
|
||||||
@ -40,28 +61,12 @@ class TestBot(unittest.TestCase):
|
|||||||
self.fake_config.get('gerrit', 'key'),
|
self.fake_config.get('gerrit', 'key'),
|
||||||
False)
|
False)
|
||||||
|
|
||||||
def _set_fake_config(self):
|
|
||||||
self.fake_config.add_section('ircbot')
|
|
||||||
self.fake_config.add_section('gerrit')
|
|
||||||
# Set fake ircbot config
|
|
||||||
self.fake_config.set('ircbot', 'nick', 'Fake_User')
|
|
||||||
self.fake_config.set('ircbot', 'pass', '')
|
|
||||||
self.fake_config.set('ircbot', 'server', 'irc.fake.net')
|
|
||||||
self.fake_config.set('ircbot', 'port', 6667)
|
|
||||||
self.fake_config.set('ircbot', 'channel_config',
|
|
||||||
'fake_recheck_watch_bot.yaml')
|
|
||||||
# Set fake gerrit config
|
|
||||||
self.fake_config.set('gerrit', 'user', 'fake_user')
|
|
||||||
self.fake_config.set('gerrit', 'query_file', 'fake_query_file')
|
|
||||||
self.fake_config.set('gerrit', 'host', 'fake_host.openstack.org')
|
|
||||||
self.fake_config.set('gerrit', 'key', 'abc123def456')
|
|
||||||
|
|
||||||
def test_read_channel_config_not_specified(self):
|
def test_read_channel_config_not_specified(self):
|
||||||
self.fake_config.set('ircbot', 'channel_config', None)
|
self.fake_config.set('ircbot', 'channel_config', None)
|
||||||
with self.assertRaises(Exception) as exc:
|
with self.assertRaises(Exception) as exc:
|
||||||
bot._main([], self.fake_config)
|
bot._main([], self.fake_config)
|
||||||
raised_exc = exc.exception
|
raised_exc = exc.exception
|
||||||
self.assertEquals(str(raised_exc), "Channel Config must be specified "
|
self.assertEqual(str(raised_exc), "Channel Config must be specified "
|
||||||
"in config file.")
|
"in config file.")
|
||||||
|
|
||||||
def test_read_channel_config_invalid_path(self):
|
def test_read_channel_config_invalid_path(self):
|
||||||
@ -70,11 +75,63 @@ class TestBot(unittest.TestCase):
|
|||||||
bot._main([], self.fake_config)
|
bot._main([], self.fake_config)
|
||||||
raised_exc = exc.exception
|
raised_exc = exc.exception
|
||||||
error_msg = "Unable to read layout config file at fake_path.yaml"
|
error_msg = "Unable to read layout config file at fake_path.yaml"
|
||||||
self.assertEquals(str(raised_exc), error_msg)
|
self.assertEqual(str(raised_exc), error_msg)
|
||||||
|
|
||||||
def test__read_no_event_no_msg(self):
|
def test__read_no_event_no_msg(self):
|
||||||
with self.assertRaises(Exception) as exc:
|
with self.assertRaises(Exception) as exc:
|
||||||
self.recheck_watch._read()
|
self.recheck_watch._read()
|
||||||
raised_exc = exc.exception
|
raised_exc = exc.exception
|
||||||
error_msg = 'No event or msg specified'
|
error_msg = 'No event or msg specified'
|
||||||
self.assertEquals(str(raised_exc), error_msg)
|
self.assertEqual(str(raised_exc), error_msg)
|
||||||
|
|
||||||
|
|
||||||
|
class TestBotWithTestTools(tests.TestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestBotWithTestTools, self).setUp()
|
||||||
|
self.useFixture(fixtures.MonkeyPatch(
|
||||||
|
'gerritlib.gerrit.Gerrit',
|
||||||
|
fg.Gerrit))
|
||||||
|
self.fake_config = ConfigParser.ConfigParser({'server_password': None})
|
||||||
|
_set_fake_config(self.fake_config)
|
||||||
|
self.channel_config = bot.ChannelConfig(yaml.load(
|
||||||
|
open('recheckwatchbot.yaml')))
|
||||||
|
with mock.patch('launchpadlib.launchpad.Launchpad'):
|
||||||
|
self.recheck_watch = bot.RecheckWatch(
|
||||||
|
None,
|
||||||
|
self.channel_config,
|
||||||
|
self.fake_config.get('gerrit', 'user'),
|
||||||
|
self.fake_config.get('gerrit', 'query_file'),
|
||||||
|
self.fake_config.get('gerrit', 'host'),
|
||||||
|
self.fake_config.get('gerrit', 'key'),
|
||||||
|
False)
|
||||||
|
|
||||||
|
def fake_print(self, channel, msg):
|
||||||
|
reference = ("openstack/keystone change: https://review.openstack.org/"
|
||||||
|
"64750 failed because of: gate-keystone-python27: "
|
||||||
|
"unrecognized error, gate-keystone-python2"
|
||||||
|
"6: https://bugs.launchpad.net/bugs/123456")
|
||||||
|
self.assertEqual(reference, msg)
|
||||||
|
|
||||||
|
def fake_display(self, channel, msg):
|
||||||
|
return True
|
||||||
|
|
||||||
|
def test_error_found(self):
|
||||||
|
self.useFixture(fixtures.MonkeyPatch(
|
||||||
|
'elastic_recheck.bot.RecheckWatch.print_msg',
|
||||||
|
self.fake_print))
|
||||||
|
self.useFixture(fixtures.MonkeyPatch(
|
||||||
|
'elastic_recheck.bot.RecheckWatch.display',
|
||||||
|
self.fake_display))
|
||||||
|
with mock.patch.object(
|
||||||
|
elasticRecheck.Stream, '_does_es_have_data') as mock_data:
|
||||||
|
mock_data.return_value = True
|
||||||
|
stream = elasticRecheck.Stream("", "", "")
|
||||||
|
event = stream.get_failed_tempest()
|
||||||
|
self.assertIsNone(event.bug_urls_map())
|
||||||
|
# Add bugs
|
||||||
|
for job in event.failed_jobs:
|
||||||
|
if job.name == 'gate-keystone-python26':
|
||||||
|
job.bugs = ['123456']
|
||||||
|
self.assertTrue(self.recheck_watch.display('channel', event))
|
||||||
|
self.recheck_watch.error_found('channel', event)
|
||||||
|
Loading…
Reference in New Issue
Block a user