summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-03-18 13:20:47 +0000
committerGerrit Code Review <review@openstack.org>2015-03-18 13:20:47 +0000
commitfd47ad61a546a8f9d6d6d4ef15215e933bb2fa2f (patch)
tree15ccec6a734805e01c541b094d6a615408d55eec
parent0c53608b31d91b9cc9ca4fe0d16c2d3c8e7815dd (diff)
parentf29e865d9f33bd8f264255c6288a21777b4b1fbd (diff)
downloadoslo-incubator-fd47ad61a546a8f9d6d6d4ef15215e933bb2fa2f.tar.gz
Merge "Store ProcessLauncher signal handlers on class level"
-rw-r--r--openstack/common/service.py10
-rw-r--r--tests/unit/test_service.py26
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):