From 96e0eb23a458f068f540d98132ee261053c45585 Mon Sep 17 00:00:00 2001 From: Hui HX Xiang Date: Mon, 16 Sep 2013 19:38:56 -0700 Subject: [PATCH] Raise an exception if no router_id provided IF both service neutron-l3-agent and neutron-server are up, but no router id configured in /etc/neutron/l3_agent.ini, an exception will be raised on DB as "DBError: IntegrityError", because the variable router_ids has a default '' value that doesn't match the DB grammar. * Check router id is specified in _init_() of l3 when not using namespace. * Move part of checking config params actions to new function _check_config_params() * Add corresponding unit tests. Closes-Bug: #1226366 Change-Id: I905f8a4061c5b250782e025681dfefcc41c8c03c --- neutron/agent/l3_agent.py | 18 ++++++++++++++++-- neutron/tests/unit/test_l3_agent.py | 11 +++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/neutron/agent/l3_agent.py b/neutron/agent/l3_agent.py index f53361138..950344850 100644 --- a/neutron/agent/l3_agent.py +++ b/neutron/agent/l3_agent.py @@ -195,8 +195,8 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, manager.Manager): self.root_helper = config.get_root_helper(self.conf) self.router_info = {} - if not self.conf.interface_driver: - raise SystemExit(_('An interface driver must be specified')) + self._check_config_params() + try: self.driver = importutils.import_object( self.conf.interface_driver, @@ -221,6 +221,20 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, manager.Manager): self.rpc_loop.start(interval=RPC_LOOP_INTERVAL) super(L3NATAgent, self).__init__(conf=self.conf) + def _check_config_params(self): + """Check items in configuration files. + + Check for required and invalid configuration items. + The actual values are not verified for correctness. + """ + if not self.conf.interface_driver: + raise SystemExit(_('An interface driver must be specified')) + + if not self.conf.use_namespaces and not self.conf.router_id: + msg = _('Router id is required if not using namespaces.') + LOG.error(msg) + raise SystemExit(msg) + def _destroy_router_namespaces(self, only_router_id=None): """Destroy router namespaces on the host to eliminate all stale linux devices, iptables rules, and namespaces. diff --git a/neutron/tests/unit/test_l3_agent.py b/neutron/tests/unit/test_l3_agent.py index e4057d354..66bb0876b 100644 --- a/neutron/tests/unit/test_l3_agent.py +++ b/neutron/tests/unit/test_l3_agent.py @@ -43,6 +43,7 @@ class TestBasicRouterOperations(base.BaseTestCase): self.conf.register_opts(l3_agent.L3NATAgent.OPTS) agent_config.register_root_helper(self.conf) self.conf.register_opts(interface.OPTS) + self.conf.set_override('router_id', 'fake_id') self.conf.set_override('interface_driver', 'neutron.agent.linux.interface.NullDriver') self.conf.root_helper = 'sudo' @@ -646,6 +647,16 @@ class TestBasicRouterOperations(base.BaseTestCase): '-p tcp -m tcp --dport 80 -j REDIRECT --to-port 8775') self.assertEqual([rules], agent.metadata_nat_rules()) + def test_router_id_specified_in_conf(self): + self.conf.set_override('use_namespaces', False) + self.conf.set_override('router_id', '') + self.assertRaises(SystemExit, l3_agent.L3NATAgent, + HOSTNAME, self.conf) + + self.conf.set_override('router_id', '1234') + agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) + self.assertEqual(['1234'], agent._router_ids()) + class TestL3AgentEventHandler(base.BaseTestCase): -- 2.45.2