def test_shutdown_with_running_tasks(self): t = Task.objects.create( worker=self._worker.worker, arch=self._arch, channel=self._channel, owner=self._user, method='DummyForkTask', state=TASK_STATES['FREE'], ) self.assertEqual(t.state, TASK_STATES['FREE']) tm = TaskManager(conf={'worker': self._worker}) task_info = t.export(False) with patch('kobo.worker.taskmanager.os', fork=Mock(return_value=9999)) as os_mock: tm.take_task(task_info) os_mock.fork.assert_called_once() tm.update_tasks() # reload task info t = Task.objects.get(id=t.id) self.assertEqual(t.state, TASK_STATES['OPEN']) tm.shutdown() # reload task info t = Task.objects.get(id=t.id) self.assertEqual(t.state, TASK_STATES['INTERRUPTED'])
def test_update_tasks_timeout_task_if_running_for_to_long(self): t = Task.objects.create( worker=self._worker.worker, arch=self._arch, channel=self._channel, owner=self._user, method='DummyForkTask', timeout=0, state=TASK_STATES['FREE'], ) self.assertEqual(t.state, TASK_STATES['FREE']) tm = TaskManager(conf={'worker': self._worker}) task_info = t.export(False) with patch('kobo.worker.taskmanager.os', fork=Mock(return_value=9999)) as os_mock: tm.take_task(task_info) os_mock.fork.assert_called_once() # reload task info t = Task.objects.get(id=t.id) self.assertEqual(t.state, TASK_STATES['OPEN']) self.assertTrue(t.id in tm.pid_dict) tm.update_tasks() self.assertFalse(t.id in tm.pid_dict) # reload task info t = Task.objects.get(id=t.id) self.assertEqual(t.state, TASK_STATES['TIMEOUT'])
def test_take_task_set_load_and_ready(self): t = Task.objects.create( worker=self._worker.worker, arch=self._arch, channel=self._channel, owner=self._user, method='DummyHeavyTask', state=TASK_STATES['FREE'], ) self.assertEqual(t.state, TASK_STATES['FREE']) tm = TaskManager(conf={'worker': self._worker}) task_info = t.export(False) with patch('kobo.worker.taskmanager.os', fork=Mock(return_value=9999)) as os_mock: tm.take_task(task_info) os_mock.fork.assert_called_once() self.assertEqual(tm.worker_info['current_load'], 100) self.assertFalse(tm.worker_info['ready']) # reload task info t = Task.objects.get(id=t.id) self.assertEqual(t.state, TASK_STATES['OPEN'])
def test_is_finished_task_catch_os_error(self): t = Task.objects.create( worker=self._worker.worker, arch=self._arch, channel=self._channel, owner=self._user, method='DummyForkTask', state=TASK_STATES['FREE'], ) tm = TaskManager(conf={'worker': self._worker}) task_info = t.export(False) with patch('kobo.worker.taskmanager.os', fork=Mock(return_value=9999)) as os_mock: tm.take_task(task_info) os_mock.fork.assert_called_once() err = OSError() err.errno = errno.ECHILD with patch('kobo.worker.taskmanager.os', waitpid=Mock(side_effect=err)) as os_mock: self.assertFalse(tm.is_finished_task(t.id)) os_mock.waitpid.assert_called_once()
def test_wakeup_task_catch_os_error(self): t = Task.objects.create( worker=self._worker.worker, arch=self._arch, channel=self._channel, owner=self._user, method='DummyForkTask', state=TASK_STATES['FREE'], ) tm = TaskManager(conf={'worker': self._worker}) task_info = t.export(False) task_info['alert'] = True with patch('kobo.worker.taskmanager.os', fork=Mock(return_value=9999)) as os_mock: tm.take_task(task_info) with patch('kobo.worker.taskmanager.os', kill=Mock(side_effect=OSError)) as os_mock: tm.wakeup_task(task_info) os_mock.kill.assert_called_once_with(9999, signal.SIGUSR2) with self.assertRaises(ValueError): with patch('kobo.worker.taskmanager.os', kill=Mock(side_effect=ValueError)) as os_mock: tm.wakeup_task(task_info) os_mock.kill.assert_called_once_with(9999, signal.SIGUSR2)
def test_take_task_if_wrong_channel(self): channel = Channel.objects.create(name='channel_x86') t = Task.objects.create( worker=self._worker.worker, arch=self._arch, channel=channel, owner=self._user, method='DummyForkTask', state=TASK_STATES['FREE'], ) self.assertEqual(t.state, TASK_STATES['FREE']) tm = TaskManager(conf={'worker': self._worker}) task_info = t.export(False) with patch('kobo.worker.taskmanager.os', fork=Mock(return_value=9999)) as os_mock: tm.take_task(task_info) os_mock.fork.assert_not_called() # reload task info t = Task.objects.get(id=t.id) self.assertEqual(t.state, TASK_STATES['FREE'])
def test_take_task_catch_errors_if_cant_open_task(self): t = Task.objects.create( worker=self._worker.worker, arch=self._arch, channel=self._channel, owner=self._user, method='DummyForegroundTask', state=TASK_STATES['FREE'], ) self.assertEqual(t.state, TASK_STATES['FREE']) tm = TaskManager(conf={'worker': self._worker}) tm.hub.worker.open_task = Mock(side_effect=ValueError) task_info = t.export(False) with patch('kobo.worker.taskmanager.os', fork=Mock(return_value=9999)) as os_mock: tm.take_task(task_info) os_mock.fork.assert_not_called() # reload task info t = Task.objects.get(id=t.id) self.assertEqual(t.state, TASK_STATES['FREE'])
def test_take_task_runs_task_if_foreground(self): t = Task.objects.create( worker=self._worker.worker, arch=self._arch, channel=self._channel, owner=self._user, method='DummyForegroundTask', state=TASK_STATES['FREE'], ) self.assertEqual(t.state, TASK_STATES['FREE']) tm = TaskManager(conf={'worker': self._worker}) task_info = t.export(False) with patch('kobo.worker.taskmanager.os', fork=Mock(return_value=9999)) as os_mock: os_mock.devnull = os.devnull tm.take_task(task_info) os_mock.fork.assert_not_called() # reload task info t = Task.objects.get(id=t.id) self.assertEqual(t.state, TASK_STATES['CLOSED'])
def test_wakeup_task_if_alert_is_not_set(self): t = Task.objects.create( worker=self._worker.worker, arch=self._arch, channel=self._channel, owner=self._user, method='DummyForkTask', state=TASK_STATES['FREE'], ) tm = TaskManager(conf={'worker': self._worker}) task_info = t.export(False) with patch('kobo.worker.taskmanager.os', fork=Mock(return_value=9999)) as os_mock: tm.take_task(task_info) os_mock.fork.assert_called_once() tm.wakeup_task(task_info) os_mock.kill.assert_not_called()
def test_update_tasks_cleanup_finished_tasks(self): t = Task.objects.create( worker=self._worker.worker, arch=self._arch, channel=self._channel, owner=self._user, method='DummyForkTask', state=TASK_STATES['FREE'], ) self.assertEqual(t.state, TASK_STATES['FREE']) tm = TaskManager(conf={'worker': self._worker}) task_info = t.export(False) with patch('kobo.worker.taskmanager.os', fork=Mock(return_value=9999)) as os_mock: tm.take_task(task_info) os_mock.fork.assert_called_once() # reload task info t = Task.objects.get(id=t.id) self.assertEqual(t.state, TASK_STATES['OPEN']) tm.run_task(task_info) # reload task info t = Task.objects.get(id=t.id) self.assertEqual(t.state, TASK_STATES['CLOSED']) with patch('kobo.worker.taskmanager.os', waitpid=Mock(return_value=(123, 0))) as os_mock: self.assertTrue(t.id in tm.pid_dict) tm.update_tasks() self.assertFalse(t.id in tm.pid_dict) os_mock.waitpid.assert_called_once() # reload task info t = Task.objects.get(id=t.id) self.assertEqual(t.state, TASK_STATES['CLOSED'])