Adds a default reload callback to ProcessManager

Currently, process reload in ProcessManager is being done with 'HUP'.
Some processes, such as haproxy[1], use a different method for reloading
configuration updates.

This patch addes a default reload callback option to handle such cases, while
keeping 'HUP' as the default method, in case a default reload callback
was not provided.

[1] See -sf flags: http://www.haproxy.org/download/1.2/doc/haproxy-en.txt

Related-Bug: #1565801

Change-Id: Ia2f67e742778cd99f2211c94782635652d9032c7
This commit is contained in:
Nir Magnezi 2016-07-21 11:46:49 +03:00 committed by Jakub Libosvar
parent 99cbcba48c
commit ec929d9b1c
2 changed files with 36 additions and 2 deletions

View File

@ -61,7 +61,8 @@ class ProcessManager(MonitoredProcess):
"""
def __init__(self, conf, uuid, namespace=None, service=None,
pids_path=None, default_cmd_callback=None,
cmd_addl_env=None, pid_file=None, run_as_root=False):
cmd_addl_env=None, pid_file=None, run_as_root=False,
custom_reload_callback=None):
self.conf = conf
self.uuid = uuid
@ -71,6 +72,7 @@ class ProcessManager(MonitoredProcess):
self.pids_path = pids_path or self.conf.external_pids
self.pid_file = pid_file
self.run_as_root = run_as_root
self.custom_reload_callback = custom_reload_callback
if service:
self.service_pid_fname = 'pid.' + service
@ -94,7 +96,10 @@ class ProcessManager(MonitoredProcess):
self.reload_cfg()
def reload_cfg(self):
self.disable('HUP')
if self.custom_reload_callback:
self.disable(get_stop_command=self.custom_reload_callback)
else:
self.disable('HUP')
def disable(self, sig='9', get_stop_command=None):
pid = self.pid

View File

@ -164,6 +164,35 @@ class TestProcessManager(base.BaseTestCase):
manager.enable(callback)
self.assertFalse(callback.called)
def test_reload_cfg_without_custom_reload_callback(self):
with mock.patch.object(ep.ProcessManager, 'disable') as disable:
manager = ep.ProcessManager(self.conf, 'uuid', namespace='ns')
manager.reload_cfg()
disable.assert_called_once_with('HUP')
def test_reload_cfg_with_custom_reload_callback(self):
reload_callback = mock.sentinel.callback
with mock.patch.object(ep.ProcessManager, 'disable') as disable:
manager = ep.ProcessManager(
self.conf, 'uuid', namespace='ns',
custom_reload_callback=reload_callback)
manager.reload_cfg()
disable.assert_called_once_with(get_stop_command=reload_callback)
def test_disable_get_stop_command(self):
cmd = ['the', 'cmd']
reload_callback = mock.Mock(return_value=cmd)
with mock.patch.object(ep.ProcessManager, 'pid',
mock.PropertyMock(return_value=4)):
with mock.patch.object(ep.ProcessManager, 'active',
mock.PropertyMock(return_value=True)):
manager = ep.ProcessManager(
self.conf, 'uuid',
custom_reload_callback=reload_callback)
manager.disable(
get_stop_command=manager.custom_reload_callback)
self.assertIn(cmd, self.execute.call_args[0])
def test_disable_no_namespace(self):
with mock.patch.object(ep.ProcessManager, 'pid') as pid:
pid.__get__ = mock.Mock(return_value=4)