debian-koji/tests/test_lib/test_restart_tasks.py
Yuming Zhu ca05418fb5 unittest: use unittest.mock instead of mock
because the absence of unittest.mock on python2.7, we still fallback to
mock
2024-10-23 16:35:30 +00:00

245 lines
9.2 KiB
Python

from __future__ import absolute_import
try:
from unittest import mock
except ImportError:
import mock
import shutil
import tempfile
import unittest
import koji.tasks
class TestRestartTask(unittest.TestCase):
def setUp(self):
self.session = mock.MagicMock()
self.options = mock.MagicMock()
self.manager = mock.MagicMock()
self.workdir = tempfile.mkdtemp()
self.options.workdir = self.workdir
self.safe_rmtree = mock.patch('koji.tasks.safe_rmtree').start()
def tearDown(self):
shutil.rmtree(self.workdir)
mock.patch.stopall()
def get_handler(self, *args, **kwargs):
params = koji.encode_args(*args, **kwargs)
handler = koji.tasks.RestartTask(137, 'restart', params, self.session,
self.options)
# this is a foreground task
handler.setManager(self.manager)
return handler
def test_restart_task(self):
host = {'id': 'HOST ID'}
self.session.host.getID.return_value = "HOST ID"
handler = self.get_handler(host)
self.assertEqual(handler.Foreground, True)
handler.run()
self.assertEqual(self.manager.restart_pending, True)
def test_restart_wrong_host(self):
host = {'id': 'HOST ID'}
self.session.host.getID.return_value = "ANOTHER HOST"
handler = self.get_handler(host)
self.assertEqual(handler.Foreground, True)
with self.assertRaises(koji.GenericError):
handler.run()
class TestRestartVerifyTask(unittest.TestCase):
def setUp(self):
self.session = mock.MagicMock()
self.options = mock.MagicMock()
self.manager = mock.MagicMock()
self.workdir = tempfile.mkdtemp()
self.options.workdir = self.workdir
self.safe_rmtree = mock.patch('koji.tasks.safe_rmtree').start()
def tearDown(self):
shutil.rmtree(self.workdir)
mock.patch.stopall()
def get_handler(self, *args, **kwargs):
params = koji.encode_args(*args, **kwargs)
handler = koji.tasks.RestartVerifyTask(137, 'restartVerify', params, self.session,
self.options)
# this is a foreground task
handler.setManager(self.manager)
return handler
def test_restart_verify_task(self):
task1 = {
'id': 'TASK ID',
'state': koji.TASK_STATES['CLOSED'],
'completion_ts': 10,
}
host = {'id': 'HOST ID'}
self.session.host.getID.return_value = "HOST ID"
self.session.getTaskInfo.return_value = task1
handler = self.get_handler(task1['id'], host)
self.manager.start_ts = 100 # greater than task1['start_time']
self.assertEqual(handler.Foreground, True)
handler.run()
def test_restart_verify_not_closed(self):
task1 = {
'id': 'TASK ID',
'state': koji.TASK_STATES['OPEN'],
'completion_ts': 10,
}
host = {'id': 'HOST ID'}
self.session.host.getID.return_value = "HOST ID"
self.session.getTaskInfo.return_value = task1
handler = self.get_handler(task1['id'], host)
try:
handler.run()
except koji.GenericError as e:
self.assertEqual(e.args[0], 'Stage one restart task is OPEN')
else:
raise Exception('Error not raised')
def test_restart_verify_wrong_host(self):
task1 = {
'id': 'TASK ID',
'state': koji.TASK_STATES['CLOSED'],
'completion_ts': 10,
}
host = {'id': 'HOST ID'}
self.session.host.getID.return_value = "OTHER HOST"
self.session.getTaskInfo.return_value = task1
handler = self.get_handler(task1['id'], host)
try:
handler.run()
except koji.GenericError as e:
self.assertEqual(e.args[0], 'Host mismatch')
else:
raise Exception('Error not raised')
def test_restart_verify_wrong_time(self):
task1 = {
'id': 'TASK ID',
'state': koji.TASK_STATES['CLOSED'],
'completion_ts': 10,
}
host = {'id': 'HOST ID'}
self.session.host.getID.return_value = "HOST ID"
self.session.getTaskInfo.return_value = task1
handler = self.get_handler(task1['id'], host)
self.manager.start_ts = 0 # LESS THAN task1['start_time']
try:
handler.run()
except koji.GenericError as e:
self.assertEqual(e.args[0][:30], 'Restart failed - start time is')
else:
raise Exception('Error not raised')
class TestRestartHostsTask(unittest.TestCase):
def setUp(self):
self.session = mock.MagicMock()
self.options = mock.MagicMock()
self.manager = mock.MagicMock()
self.workdir = tempfile.mkdtemp()
self.options.workdir = self.workdir
self.safe_rmtree = mock.patch('koji.tasks.safe_rmtree').start()
def tearDown(self):
shutil.rmtree(self.workdir)
mock.patch.stopall()
def get_handler(self, *args, **kwargs):
params = koji.encode_args(*args, **kwargs)
handler = koji.tasks.RestartHostsTask(137, 'restartHosts', params, self.session,
self.options)
handler.wait = mock.MagicMock()
handler.subtask = mock.MagicMock()
return handler
def test_restart_hosts_task(self):
self.session.host.getID.return_value = "THIS HOST"
host = {'id': 99}
self.session.listHosts.return_value = [host]
handler = self.get_handler({})
handler.subtask.side_effect = [101, 102]
handler.run()
self.session.listHosts.assert_called_once_with(enabled=True)
self.session.taskFinished.assert_not_called()
handler.wait.assert_called_once_with([101, 102], all=True, timeout=3600*24)
# subtask calls
call1 = mock.call('restart', [host], assign=host['id'], label="restart %i" % host['id'])
call2 = mock.call('restartVerify', [101, host], assign=host['id'], label="sleep %i" % host['id'])
handler.subtask.assert_has_calls([call1, call2])
def test_restart_hosts_no_host(self):
self.session.listHosts.return_value = []
handler = self.get_handler({})
try:
handler.run()
except koji.GenericError as e:
self.assertEqual(e.args[0], 'No matching hosts')
else:
raise Exception('Error not raised')
self.session.listHosts.assert_called_once_with(enabled=True)
self.session.taskFinished.assert_not_called()
handler.wait.assert_not_called()
handler.subtask.assert_not_called()
def test_restart_hosts_with_opts(self):
self.session.host.getID.return_value = "THIS HOST"
host = {'id': 99}
self.session.listHosts.return_value = [host]
self.session.getChannel.return_value = {'id': 1, 'name': 'default'}
handler = self.get_handler({'channel': 'default', 'arches': ['x86_64']})
handler.subtask.side_effect = [101, 102]
handler.run()
self.session.listHosts.assert_called_once_with(enabled=True, channelID=1, arches=['x86_64'])
self.session.taskFinished.assert_not_called()
handler.wait.assert_called_once_with([101, 102], all=True, timeout=3600*24)
# subtask calls
call1 = mock.call('restart', [host], assign=host['id'], label="restart %i" % host['id'])
call2 = mock.call('restartVerify', [101, host], assign=host['id'], label="sleep %i" % host['id'])
handler.subtask.assert_has_calls([call1, call2])
def test_restart_hosts_self_finished(self):
self.session.host.getID.return_value = 99
host = {'id': 99}
self.session.listHosts.return_value = [host]
handler = self.get_handler({})
self.session.taskFinished.return_value = True
handler.subtask.side_effect = [101, 102]
handler.run()
self.session.listHosts.assert_called_once_with(enabled=True)
self.session.taskFinished.assert_called_once()
call1 = mock.call('restart', [host], assign=host['id'], label="restart %i" % host['id'])
call2 = mock.call('restartVerify', [101, host], assign=host['id'], label="sleep %i" % host['id'])
handler.subtask.assert_has_calls([call1, call2])
call1 = mock.call(101, timeout=3600*24)
call2 = mock.call([101, 102], all=True, timeout=3600*24)
handler.wait.assert_has_calls([call1, call2])
def test_restart_hosts_self_unfinished(self):
self.session.host.getID.return_value = 99
host = {'id': 99}
self.session.listHosts.return_value = [host]
handler = self.get_handler({})
self.session.taskFinished.return_value = False
handler.subtask.side_effect = [101, 102]
with self.assertRaises(koji.tasks.ServerRestart):
handler.run()
self.session.listHosts.assert_called_once_with(enabled=True)
self.session.taskFinished.assert_called_once()
call1 = mock.call('restart', [host], assign=host['id'], label="restart %i" % host['id'])
call2 = mock.call('restartVerify', [101, host], assign=host['id'], label="sleep %i" % host['id'])
handler.subtask.assert_has_calls([call1, call2])
handler.wait.assert_called_once_with(101, timeout=3600*24)