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
This commit is contained in:
Hui HX Xiang 2013-09-16 19:38:56 -07:00
parent 03858476f1
commit 9365cfbb26
2 changed files with 27 additions and 2 deletions

View File

@ -195,8 +195,8 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, manager.Manager):
self.root_helper = config.get_root_helper(self.conf) self.root_helper = config.get_root_helper(self.conf)
self.router_info = {} self.router_info = {}
if not self.conf.interface_driver: self._check_config_params()
raise SystemExit(_('An interface driver must be specified'))
try: try:
self.driver = importutils.import_object( self.driver = importutils.import_object(
self.conf.interface_driver, self.conf.interface_driver,
@ -221,6 +221,20 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, manager.Manager):
self.rpc_loop.start(interval=RPC_LOOP_INTERVAL) self.rpc_loop.start(interval=RPC_LOOP_INTERVAL)
super(L3NATAgent, self).__init__(conf=self.conf) 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): def _destroy_router_namespaces(self, only_router_id=None):
"""Destroy router namespaces on the host to eliminate all stale """Destroy router namespaces on the host to eliminate all stale
linux devices, iptables rules, and namespaces. linux devices, iptables rules, and namespaces.

View File

@ -43,6 +43,7 @@ class TestBasicRouterOperations(base.BaseTestCase):
self.conf.register_opts(l3_agent.L3NATAgent.OPTS) self.conf.register_opts(l3_agent.L3NATAgent.OPTS)
agent_config.register_root_helper(self.conf) agent_config.register_root_helper(self.conf)
self.conf.register_opts(interface.OPTS) self.conf.register_opts(interface.OPTS)
self.conf.set_override('router_id', 'fake_id')
self.conf.set_override('interface_driver', self.conf.set_override('interface_driver',
'neutron.agent.linux.interface.NullDriver') 'neutron.agent.linux.interface.NullDriver')
self.conf.root_helper = 'sudo' self.conf.root_helper = 'sudo'
@ -646,6 +647,16 @@ class TestBasicRouterOperations(base.BaseTestCase):
'-p tcp -m tcp --dport 80 -j REDIRECT --to-port 8775') '-p tcp -m tcp --dport 80 -j REDIRECT --to-port 8775')
self.assertEqual([rules], agent.metadata_nat_rules()) 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): class TestL3AgentEventHandler(base.BaseTestCase):