From 45be804b4069599e8eda9820084fcf11fb94167b Mon Sep 17 00:00:00 2001 From: Ihar Hrachyshka Date: Fri, 15 Sep 2017 10:46:26 -0600 Subject: [PATCH] ovs: log config options when all of them are registered Otherwise we don't see some of them for the agent, for example, AGENT.root_helper is missing. To make sure the logging is as early as possible, and to make sure that options that may be registered by extensions are also logged, some refactoring was applied to the code to move the extension manager loading as early as possible, even before agent's __init__ is called. Related-Bug: #1718767 Change-Id: I823150cf6406f709d1e4ffa74897d598e80f5329 --- .../ml2/drivers/openvswitch/agent/main.py | 2 -- .../openvswitch/agent/ovs_neutron_agent.py | 27 ++++++++++--------- neutron/tests/functional/agent/l2/base.py | 3 ++- .../agent/test_ovs_neutron_agent.py | 18 ++++++++----- .../openvswitch/agent/test_ovs_tunnel.py | 4 ++- 5 files changed, 31 insertions(+), 23 deletions(-) diff --git a/neutron/plugins/ml2/drivers/openvswitch/agent/main.py b/neutron/plugins/ml2/drivers/openvswitch/agent/main.py index 87564991c1b..78d70db1499 100644 --- a/neutron/plugins/ml2/drivers/openvswitch/agent/main.py +++ b/neutron/plugins/ml2/drivers/openvswitch/agent/main.py @@ -23,7 +23,6 @@ from oslo_utils import importutils from neutron.common import config as common_config from neutron.common import profiler -from neutron.common import utils as n_utils LOG = logging.getLogger(__name__) @@ -46,6 +45,5 @@ def main(): mod = importutils.import_module(mod_name) mod.init_config() common_config.setup_logging() - n_utils.log_opt_values(LOG) profiler.setup("neutron-ovs-agent", cfg.CONF.host) mod.main() diff --git a/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py b/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py index 5dc0201f71e..68c97ebf389 100644 --- a/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py +++ b/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py @@ -53,6 +53,7 @@ from neutron.api.rpc.handlers import securitygroups_rpc as sg_rpc from neutron.common import config from neutron.common import constants as c_const from neutron.common import topics +from neutron.common import utils as n_utils from neutron.conf.agent import xenapi_conf from neutron.plugins.common import constants as p_const from neutron.plugins.common import utils as p_utils @@ -125,7 +126,7 @@ class OVSNeutronAgent(l2population_rpc.L2populationRpcCallBackTunnelMixin, # 1.4 Added support for network_update target = oslo_messaging.Target(version='1.4') - def __init__(self, bridge_classes, conf=None): + def __init__(self, bridge_classes, ext_manager, conf=None): '''Constructor. :param bridge_classes: a dict for bridge classes. @@ -134,6 +135,7 @@ class OVSNeutronAgent(l2population_rpc.L2populationRpcCallBackTunnelMixin, super(OVSNeutronAgent, self).__init__() self.conf = conf or cfg.CONF self.ovs = ovs_lib.BaseOVS() + self.ext_manager = ext_manager agent_conf = self.conf.AGENT ovs_conf = self.conf.OVS @@ -203,7 +205,9 @@ class OVSNeutronAgent(l2population_rpc.L2populationRpcCallBackTunnelMixin, self.setup_tunnel_br(ovs_conf.tunnel_bridge) self.setup_tunnel_br_flows() - self.init_extension_manager(self.connection) + agent_api = ovs_ext_api.OVSAgentExtensionAPI(self.int_br, self.tun_br) + self.ext_manager.initialize( + self.connection, constants.EXTENSION_DRIVER_TYPE, agent_api) self.dvr_agent = ovs_dvr_neutron_agent.OVSDVRNeutronAgent( self.context, @@ -404,16 +408,6 @@ class OVSNeutronAgent(l2population_rpc.L2populationRpcCallBackTunnelMixin, start_listening=False ) - def init_extension_manager(self, connection): - ext_manager.register_opts(self.conf) - self.ext_manager = ( - ext_manager.L2AgentExtensionsManager(self.conf)) - self.agent_api = ovs_ext_api.OVSAgentExtensionAPI(self.int_br, - self.tun_br) - self.ext_manager.initialize( - connection, constants.EXTENSION_DRIVER_TYPE, - self.agent_api) - def port_update(self, context, **kwargs): port = kwargs.get('port') # Put the port identifier in the updated_ports set. @@ -2192,10 +2186,17 @@ def prepare_xen_compute(): def main(bridge_classes): prepare_xen_compute() ovs_capabilities.register() + ext_manager.register_opts(cfg.CONF) + + ext_mgr = ext_manager.L2AgentExtensionsManager(cfg.CONF) + + # now that all extensions registered their options, we can log them + n_utils.log_opt_values(LOG) + validate_tunnel_config(cfg.CONF.AGENT.tunnel_types, cfg.CONF.OVS.local_ip) try: - agent = OVSNeutronAgent(bridge_classes, cfg.CONF) + agent = OVSNeutronAgent(bridge_classes, ext_mgr, cfg.CONF) capabilities.notify_init_event(n_const.AGENT_TYPE_OVS, agent) except (RuntimeError, ValueError) as e: LOG.error("%s Agent terminated!", e) diff --git a/neutron/tests/functional/agent/l2/base.py b/neutron/tests/functional/agent/l2/base.py index 36c954ec984..b38cfed66f0 100644 --- a/neutron/tests/functional/agent/l2/base.py +++ b/neutron/tests/functional/agent/l2/base.py @@ -110,8 +110,9 @@ class OVSAgentTestFramework(base.BaseOVSLinuxTestCase): self.config.set_override('bridge_mappings', bridge_mappings, "OVS") # Physical bridges should be created prior to running self._bridge_classes()['br_phys'](self.br_phys).create() + ext_mgr = ext_manager.L2AgentExtensionsManager(self.config) agent = ovs_agent.OVSNeutronAgent(self._bridge_classes(), - self.config) + ext_mgr, self.config) self.addCleanup(self.ovs.delete_bridge, self.br_int) if tunnel_types: self.addCleanup(self.ovs.delete_bridge, self.br_tun) diff --git a/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py b/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py index 10ef4c2503c..89f9924810f 100644 --- a/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py +++ b/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py @@ -143,8 +143,9 @@ class TestOvsNeutronAgent(object): mock.patch( 'neutron.agent.common.ovs_lib.OVSBridge.' 'get_vif_ports', return_value=[]): + ext_manager = mock.Mock() agent = self.mod_agent.OVSNeutronAgent(self._bridge_classes(), - cfg.CONF) + ext_manager, cfg.CONF) agent.tun_br = self.br_tun_cls(br_name='br-tun') return agent @@ -204,8 +205,9 @@ class TestOvsNeutronAgent(object): cfg.CONF.set_override('datapath_type', expected, group='OVS') + ext_manager = mock.Mock() self.agent = self.mod_agent.OVSNeutronAgent(self._bridge_classes(), - cfg.CONF) + ext_manager, cfg.CONF) self.assertEqual(expected, self.agent.int_br.datapath_type) def test_agent_type_ovs(self): @@ -248,8 +250,9 @@ class TestOvsNeutronAgent(object): cfg.CONF.set_override('agent_type', expected, group='AGENT') + ext_manager = mock.Mock() self.agent = self.mod_agent.OVSNeutronAgent(self._bridge_classes(), - cfg.CONF) + ext_manager, cfg.CONF) self.assertEqual(expected, self.agent.agent_state['agent_type']) @@ -2214,8 +2217,9 @@ class AncillaryBridgesTest(object): mock.patch( 'neutron.agent.common.ovs_lib.OVSBridge.' 'get_vif_ports', return_value=[]): + ext_manager = mock.Mock() self.agent = self.mod_agent.OVSNeutronAgent(self._bridge_classes(), - cfg.CONF) + ext_manager, cfg.CONF) self.assertEqual(len(ancillary), len(self.agent.ancillary_brs)) if ancillary: bridges = [br.br_name for br in self.agent.ancillary_brs] @@ -2251,8 +2255,9 @@ class AncillaryBridgesTest(object): mock.patch('neutron.agent.common.ovs_lib.OVSBridge.' 'get_vif_port_set', return_value=vif_port_set): + ext_manager = mock.Mock() self.agent = self.mod_agent.OVSNeutronAgent(self._bridge_classes(), - cfg.CONF) + ext_manager, cfg.CONF) return self.agent.scan_ancillary_ports(registered_ports, sync) def test_scan_ancillary_ports_returns_cur_only_for_unchanged_ports(self): @@ -2325,8 +2330,9 @@ class TestOvsDvrNeutronAgent(object): mock.patch( 'neutron.agent.common.ovs_lib.OVSBridge.' 'get_vif_ports', return_value=[]): + ext_manager = mock.Mock() self.agent = self.mod_agent.OVSNeutronAgent(self._bridge_classes(), - cfg.CONF) + ext_manager, cfg.CONF) self.agent.tun_br = self.br_tun_cls(br_name='br-tun') self.agent.sg_agent = mock.Mock() diff --git a/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_tunnel.py b/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_tunnel.py index 13bd4010bf2..a32fe71c5e5 100644 --- a/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_tunnel.py +++ b/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_tunnel.py @@ -301,7 +301,9 @@ class TunnelTest(object): for k, v in config_opts_agent.items(): cfg.CONF.set_override(k, v, 'AGENT') - return self.mod_agent.OVSNeutronAgent(bridge_classes, cfg.CONF) + ext_mgr = mock.Mock() + return self.mod_agent.OVSNeutronAgent( + bridge_classes, ext_mgr, cfg.CONF) def _verify_mock_call(self, mock_obj, expected): mock_obj.assert_has_calls(expected)