Browse Source

Merge "Check dnsmasq process is active when spawned" into stable/queens

changes/86/720686/1
Zuul 2 months ago
committed by Gerrit Code Review
parent
commit
a96f950e4b
4 changed files with 26 additions and 4 deletions
  1. +1
    -1
      neutron/agent/linux/dhcp.py
  2. +4
    -1
      neutron/agent/linux/external_process.py
  3. +2
    -2
      neutron/tests/unit/agent/linux/test_dhcp.py
  4. +19
    -0
      neutron/tests/unit/agent/linux/test_external_process.py

+ 1
- 1
neutron/agent/linux/dhcp.py View File

@@ -470,7 +470,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,


+ 4
- 1
neutron/agent/linux/external_process.py 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


@@ -77,7 +78,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
@@ -88,6 +89,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:


+ 2
- 2
neutron/tests/unit/agent/linux/test_dhcp.py View File

@@ -1295,7 +1295,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']

@@ -2037,7 +2037,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),


+ 19
- 0
neutron/tests/unit/agent/linux/test_external_process.py View File

@@ -19,6 +19,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
from neutron.tests import tools

@@ -168,6 +169,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')


Loading…
Cancel
Save