]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Delete routers that are requested but not reported as active
authorCarl Baldwin <carl.baldwin@hp.com>
Tue, 1 Apr 2014 22:02:17 +0000 (22:02 +0000)
committerCarl Baldwin <carl.baldwin@hp.com>
Wed, 2 Apr 2014 21:58:16 +0000 (21:58 +0000)
There are two cases that I can think of that result in a router being
requested but not reported as active.  One is that admin_state_up has
been set to False.  In this case, the router is never removed and
continues to be operational.

The other case is if a router is changed and then deleted before the
change is processed.  In this case, it is prudent to be sure that the
router is queued for deletion.

Change-Id: I4738f599a18f0d130cc8ad4d4dafc488eec75ffd
Closes-Bug: #1215387

neutron/agent/l3_agent.py
neutron/tests/unit/test_l3_agent.py

index 5b7d709d6bfa6be310e65bc58a19dd53fcb27f30..3e6dd405757afa8478f13d175afd21c0a3a1a609 100644 (file)
@@ -775,9 +775,6 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, manager.Manager):
                 [router['id'] for router in routers])
         cur_router_ids = set()
         for r in routers:
-            if not r['admin_state_up']:
-                continue
-
             # If namespaces are disabled, only process the router associated
             # with the configured agent id.
             if (not self.conf.use_namespaces and
@@ -814,9 +811,13 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, manager.Manager):
                       len(self.updated_routers))
             if self.updated_routers:
                 router_ids = list(self.updated_routers)
-                self.updated_routers.clear()
                 routers = self.plugin_rpc.get_routers(
                     self.context, router_ids)
+
+                fetched = set([r['id'] for r in routers])
+                self.removed_routers.update(self.updated_routers - fetched)
+                self.updated_routers.clear()
+
                 self._process_routers(routers)
             self._process_router_delete()
             LOG.debug(_("RPC loop successfully completed"))
index d390ac29bd6e83161cd04a2f1cbbccedf1767384..25d11845da356214283009ace2d693548ec9886f 100644 (file)
@@ -870,17 +870,6 @@ class TestBasicRouterOperations(base.BaseTestCase):
             namespace=ri.ns_name(),
             prefix=l3_agent.EXTERNAL_DEV_PREFIX)
 
-    def test_routers_with_admin_state_down(self):
-        agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
-        self.plugin_api.get_external_network_id.return_value = None
-
-        routers = [
-            {'id': _uuid(),
-             'admin_state_up': False,
-             'external_gateway_info': {}}]
-        agent._process_routers(routers)
-        self.assertNotIn(routers[0]['id'], agent.router_info)
-
     def test_router_deleted(self):
         agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
         agent.router_deleted(None, FAKE_ID)