diff options
author | Jenkins <jenkins@review.openstack.org> | 2015-03-18 13:20:47 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2015-03-18 13:20:47 +0000 |
commit | fd47ad61a546a8f9d6d6d4ef15215e933bb2fa2f (patch) | |
tree | 15ccec6a734805e01c541b094d6a615408d55eec | |
parent | 0c53608b31d91b9cc9ca4fe0d16c2d3c8e7815dd (diff) | |
parent | f29e865d9f33bd8f264255c6288a21777b4b1fbd (diff) | |
download | oslo-incubator-fd47ad61a546a8f9d6d6d4ef15215e933bb2fa2f.tar.gz |
Merge "Store ProcessLauncher signal handlers on class level"
-rw-r--r-- | openstack/common/service.py | 10 | ||||
-rw-r--r-- | tests/unit/test_service.py | 26 |
2 files changed, 32 insertions, 4 deletions
diff --git a/openstack/common/service.py b/openstack/common/service.py index 66b37d85..369abdab 100644 --- a/openstack/common/service.py +++ b/openstack/common/service.py @@ -199,6 +199,13 @@ class ServiceWrapper(object): class ProcessLauncher(object): + _signal_handlers_set = set() + + @classmethod + def _handle_class_signals(cls, *args, **kwargs): + for handler in cls._signal_handlers_set: + handler(*args, **kwargs) + def __init__(self): """Constructor.""" @@ -210,7 +217,8 @@ class ProcessLauncher(object): self.handle_signal() def handle_signal(self): - _set_signals_handler(self._handle_signal) + self._signal_handlers_set.add(self._handle_signal) + _set_signals_handler(self._handle_class_signals) def _handle_signal(self, signo, frame): self.sigcaught = signo diff --git a/tests/unit/test_service.py b/tests/unit/test_service.py index 8ba1f74d..3d758bbc 100644 --- a/tests/unit/test_service.py +++ b/tests/unit/test_service.py @@ -371,7 +371,9 @@ class LauncherTest(test_base.BaseTestCase): class ProcessLauncherTest(test_base.BaseTestCase): - def test_stop(self): + @mock.patch("signal.signal") + def test_stop(self, signal_mock): + signal_mock.SIGTERM = 15 launcher = service.ProcessLauncher() self.assertTrue(launcher.running) @@ -383,10 +385,28 @@ class ProcessLauncherTest(test_base.BaseTestCase): self.assertFalse(launcher.running) self.assertFalse(launcher.children) - self.assertEqual([mock.call(22, signal.SIGTERM), - mock.call(222, signal.SIGTERM)], + self.assertEqual([mock.call(22, signal_mock.SIGTERM), + mock.call(222, signal_mock.SIGTERM)], mock_kill.mock_calls) + @mock.patch( + "openstack.common.service.ProcessLauncher._signal_handlers_set", + new_callable=lambda: set()) + def test__signal_handlers_set(self, signal_handlers_set_mock): + service.ProcessLauncher() + self.assertEqual(1, len(service.ProcessLauncher._signal_handlers_set)) + service.ProcessLauncher() + self.assertEqual(2, len(service.ProcessLauncher._signal_handlers_set)) + + @mock.patch( + "openstack.common.service.ProcessLauncher._signal_handlers_set", + new_callable=lambda: set()) + def test__handle_class_signals(self, signal_handlers_set_mock): + signal_handlers_set_mock.update([mock.Mock(), mock.Mock()]) + service.ProcessLauncher._handle_class_signals() + for m in service.ProcessLauncher._signal_handlers_set: + m.assert_called_once_with() + class GracefulShutdownTestService(service.Service): def __init__(self): |