From 166206143d736733db39ebe3a259eed2dc0fce81 Mon Sep 17 00:00:00 2001 From: Miguel Angel Ajo Date: Thu, 22 Jan 2015 14:17:30 +0000 Subject: [PATCH] Move process monitor settings to neutron.conf AGENT section Instead of defining specific settings on each agent configuration file for later patches in the series, we provide a single point of configuration in the AGENT section of the neutron.conf file, which could yet be overriden per agent config file if needed. Partially Implements: blueprint agent-child-processes-status Change-Id: I8a6351c96b8699fdba50009fa9eace337b937a34 --- etc/neutron.conf | 9 +++++++++ neutron/agent/common/config.py | 13 +++++++++++++ neutron/agent/linux/external_process.py | 16 ++++++---------- .../agent/linux/test_process_monitor.py | 7 ++++--- .../unit/agent/linux/test_process_monitor.py | 4 ++-- 5 files changed, 34 insertions(+), 15 deletions(-) diff --git a/etc/neutron.conf b/etc/neutron.conf index 1a21d9e5d02..3c99c033a1f 100644 --- a/etc/neutron.conf +++ b/etc/neutron.conf @@ -588,6 +588,15 @@ lock_path = $state_path/lock # not required, set this to False for a performance improvement. # use_helper_for_ns_read = True +# The interval to check external processes for failure in seconds (0=disabled) +# check_child_processes_interval = 0 + +# Action to take when an external process spawned by an agent dies +# Values: +# respawn - Respawns the external process +# exit - Exits the agent +# check_child_processes_action = respawn + # =========== items for agent management extension ============= # seconds between nodes reporting state to server; should be less than # agent_down_time, best if it is half or less than agent_down_time diff --git a/neutron/agent/common/config.py b/neutron/agent/common/config.py index 43335fe4578..84c3bdf2d8a 100644 --- a/neutron/agent/common/config.py +++ b/neutron/agent/common/config.py @@ -55,6 +55,15 @@ IPTABLES_OPTS = [ help=_("Add comments to iptables rules.")), ] +PROCESS_MONITOR_OPTS = [ + cfg.StrOpt('check_child_processes_action', default='respawn', + choices=['respawn', 'exit'], + help=_('Action to be executed when a child process dies')), + cfg.IntOpt('check_child_processes_interval', default=0, + help=_('Interval between checks of child process liveness ' + '(seconds), use 0 to disable')), +] + def get_log_args(conf, log_file_name): cmd_args = [] @@ -105,6 +114,10 @@ def register_iptables_opts(conf): conf.register_opts(IPTABLES_OPTS, 'AGENT') +def register_process_monitor_opts(conf): + conf.register_opts(PROCESS_MONITOR_OPTS, 'AGENT') + + def get_root_helper(conf): root_helper = conf.AGENT.root_helper if root_helper != 'sudo': diff --git a/neutron/agent/linux/external_process.py b/neutron/agent/linux/external_process.py index a061f77b98c..5a57abff6be 100644 --- a/neutron/agent/linux/external_process.py +++ b/neutron/agent/linux/external_process.py @@ -18,6 +18,7 @@ import eventlet from oslo.config import cfg from oslo_concurrency import lockutils +from neutron.agent.common import config as agent_cfg from neutron.agent.linux import ip_lib from neutron.agent.linux import utils from neutron.i18n import _LE @@ -30,16 +31,11 @@ OPTS = [ cfg.StrOpt('external_pids', default='$state_path/external/pids', help=_('Location to store child pid files')), - cfg.StrOpt('check_child_processes_action', default='respawn', - choices=['respawn', 'exit'], - help=_('Action to be executed when a child process dies')), - cfg.IntOpt('check_child_processes_interval', default=0, - help=_('Interval between checks of child process liveness ' - '(seconds), use 0 to disable')), ] cfg.CONF.register_opts(OPTS) +agent_cfg.register_process_monitor_opts(cfg.CONF) class ProcessManager(object): @@ -154,7 +150,7 @@ class ProcessMonitor(object): self._process_managers = {} - if self._config.check_child_processes_interval: + if self._config.AGENT.check_child_processes_interval: self._spawn_checking_thread() def enable(self, uuid, cmd_callback, namespace=None, service=None, @@ -238,12 +234,12 @@ class ProcessMonitor(object): def _periodic_checking_thread(self): while True: - eventlet.sleep(self._config.check_child_processes_interval) + eventlet.sleep(self._config.AGENT.check_child_processes_interval) eventlet.spawn(self._check_child_processes) def _execute_action(self, service_id): - action_function = getattr( - self, "_%s_action" % self._config.check_child_processes_action) + action = self._config.AGENT.check_child_processes_action + action_function = getattr(self, "_%s_action" % action) action_function(service_id) def _respawn_action(self, service_id): diff --git a/neutron/tests/functional/agent/linux/test_process_monitor.py b/neutron/tests/functional/agent/linux/test_process_monitor.py index 4d3b69d279e..1f47d506abd 100644 --- a/neutron/tests/functional/agent/linux/test_process_monitor.py +++ b/neutron/tests/functional/agent/linux/test_process_monitor.py @@ -29,13 +29,13 @@ class BaseTestProcessMonitor(base.BaseSudoTestCase): def setUp(self): super(BaseTestProcessMonitor, self).setUp() self._exit_handler_called = False - cfg.CONF.set_override('check_child_processes_interval', 1) + cfg.CONF.set_override('check_child_processes_interval', 1, 'AGENT') self._child_processes = [] self._ext_processes = None self.addCleanup(self.cleanup_spawned_children) def create_child_processes_manager(self, action): - cfg.CONF.set_override('check_child_processes_action', action) + cfg.CONF.set_override('check_child_processes_action', action, 'AGENT') self._ext_processes = external_process.ProcessMonitor( config=cfg.CONF, root_helper=None, @@ -88,7 +88,8 @@ class BaseTestProcessMonitor(base.BaseSudoTestCase): # we need to allow extra_time for the check process to happen # and properly execute action over the gone processes under # high load conditions - max_wait_time = cfg.CONF.check_child_processes_interval + extra_time + max_wait_time = ( + cfg.CONF.AGENT.check_child_processes_interval + extra_time) with self.assert_max_execution_time(max_wait_time): while not exit_condition(): eventlet.sleep(0.01) diff --git a/neutron/tests/unit/agent/linux/test_process_monitor.py b/neutron/tests/unit/agent/linux/test_process_monitor.py index 1f9e0b36b15..3e75687ce63 100644 --- a/neutron/tests/unit/agent/linux/test_process_monitor.py +++ b/neutron/tests/unit/agent/linux/test_process_monitor.py @@ -44,8 +44,8 @@ class BaseTestProcessMonitor(base.BaseTestCase): def create_child_process_monitor(self, action): self.exit_handler = mock.Mock() conf = mock.Mock() - conf.check_child_processes_action = action - conf.check_child_processes = True + conf.AGENT.check_child_processes_action = action + conf.AGENT.check_child_processes = True self.pmonitor = external_process.ProcessMonitor( config=conf, root_helper=None,