]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Raise an exception if no router_id provided
authorHui HX Xiang <xianghui@cn.ibm.com>
Tue, 17 Sep 2013 02:38:56 +0000 (19:38 -0700)
committerHui HX Xiang <xianghui@cn.ibm.com>
Fri, 27 Sep 2013 02:19:52 +0000 (19:19 -0700)
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
neutron/tests/unit/test_l3_agent.py

index f533611385930bb7f73226e90601691f6dde3e5e..950344850b62362f0456aab0f8076c32899c937a 100644 (file)
@@ -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.
index e4057d3541a14e9768691b4c0b3772fb072a2125..66bb0876b612d6ae9bfc624b891682b146db750b 100644 (file)
@@ -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):