Merge "Check dnsmasq process is active when spawned"

This commit is contained in:
Zuul 2019-10-29 02:51:14 +00:00 committed by Gerrit Code Review
commit b7fbb74b46
4 changed files with 26 additions and 4 deletions

View File

@ -467,7 +467,7 @@ class Dnsmasq(DhcpLocalProcess):
pm = self._get_process_manager(
cmd_callback=self._build_cmdline_callback)
pm.enable(reload_cfg=reload_with_HUP)
pm.enable(reload_cfg=reload_with_HUP, ensure_active=True)
self.process_monitor.register(uuid=self.network.id,
service_name=DNSMASQ_SERVICE_NAME,

View File

@ -26,6 +26,7 @@ import six
from neutron.agent.linux import ip_lib
from neutron.agent.linux import utils
from neutron.common import utils as common_utils
from neutron.conf.agent import common as agent_cfg
@ -78,7 +79,7 @@ class ProcessManager(MonitoredProcess):
fileutils.ensure_tree(os.path.dirname(self.get_pid_file_name()),
mode=0o755)
def enable(self, cmd_callback=None, reload_cfg=False):
def enable(self, cmd_callback=None, reload_cfg=False, ensure_active=False):
if not self.active:
if not cmd_callback:
cmd_callback = self.default_cmd_callback
@ -89,6 +90,8 @@ class ProcessManager(MonitoredProcess):
run_as_root=self.run_as_root)
elif reload_cfg:
self.reload_cfg()
if ensure_active:
common_utils.wait_until_true(lambda: self.active)
def reload_cfg(self):
if self.custom_reload_callback:

View File

@ -1343,7 +1343,7 @@ class TestDnsmasq(TestBase):
self.assertTrue(test_pm.register.called)
self.external_process().enable.assert_called_once_with(
reload_cfg=False)
ensure_active=True, reload_cfg=False)
call_kwargs = self.external_process.mock_calls[0][2]
cmd_callback = call_kwargs['default_cmd_callback']
@ -2108,7 +2108,7 @@ class TestDnsmasq(TestBase):
dm.reload_allocations()
self.assertTrue(test_pm.register.called)
self.external_process().enable.assert_called_once_with(
reload_cfg=True)
ensure_active=True, reload_cfg=True)
self.safe.assert_has_calls([
mock.call(exp_host_name, exp_host_data),

View File

@ -21,6 +21,7 @@ from oslo_utils import fileutils
import psutil
from neutron.agent.linux import external_process as ep
from neutron.common import utils as common_utils
from neutron.tests import base
@ -169,6 +170,24 @@ class TestProcessManager(base.BaseTestCase):
manager.enable(callback)
self.assertFalse(callback.called)
def test_enable_with_ensure_active(self):
def _create_cmd(*args):
return ['sleep', 0]
pm = ep.ProcessManager(self.conf, 'uuid', pid_file='pid_file',
default_cmd_callback=_create_cmd)
with mock.patch.object(psutil, 'Process') as mock_psutil_process, \
mock.patch.object(ep.ProcessManager, 'pid',
new_callable=mock.PropertyMock) as mock_pid:
mock_pid.return_value = 'pid_value'
mock_process = mock.Mock()
mock_process.cmdline.side_effect = [[], ['the', 'cmd', 'uuid']]
mock_psutil_process.return_value = mock_process
try:
pm.enable(ensure_active=True)
except common_utils.WaitTimeout:
self.fail('ProcessManager.enable() raised WaitTimeout')
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')