]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Join tables in query for down L3 agents
authorKevin Benton <blak111@gmail.com>
Tue, 19 Aug 2014 22:15:09 +0000 (15:15 -0700)
committerKevin Benton <blak111@gmail.com>
Thu, 21 Aug 2014 09:49:11 +0000 (02:49 -0700)
Join the agent table together with the L3 agent scheduler
table. This fixes an issue where the query would return
all admin_state_up L3 agents with router bindings when
any agent in the database was dead (missed heartbeats)
instead of just returning the dead L3 agents with bindings.

Closes-Bug: #1359460
Change-Id: I29215f81be7e3513155faaad015e24dbf1a1ad5d

neutron/db/l3_agentschedulers_db.py
neutron/tests/unit/openvswitch/test_agent_scheduler.py

index 478c2357123631cd0470279f4d36ac42d38d195d..8dd2739cb9ce7b004f57d9bde19572385515b73a 100644 (file)
@@ -110,6 +110,7 @@ class L3AgentSchedulerDbMixin(l3agentscheduler.L3AgentSchedulerPluginBase,
             seconds=agent_dead_limit)
         down_bindings = (
             context.session.query(RouterL3AgentBinding).
+            join(agents_db.Agent).
             filter(agents_db.Agent.heartbeat_timestamp < cutoff,
                    agents_db.Agent.admin_state_up))
         for binding in down_bindings:
index ab855b61c932279c3bf8602c77d7738fc056a1cb..cce5552feb1fba5f8ecf9d3ca3485961f5e11b01 100644 (file)
@@ -643,6 +643,19 @@ class OvsAgentSchedulerTestCase(OvsAgentSchedulerTestCaseBase):
         agt_db.admin_state_up = state
         self.adminContext.session.commit()
 
+    def test_router_is_not_rescheduled_from_alive_agent(self):
+        with self.router():
+            l3_rpc = l3_rpc_base.L3RpcCallbackMixin()
+            self._register_agent_states()
+
+            # schedule the router to host A
+            l3_rpc.sync_routers(self.adminContext, host=L3_HOSTA)
+            with mock.patch('neutron.db.l3_agentschedulers_db.'
+                            'L3AgentSchedulerDbMixin.reschedule_router') as rr:
+                # take down some unrelated agent and run reschedule check
+                self._take_down_agent_and_run_reschedule(DHCP_HOSTC)
+                self.assertFalse(rr.called)
+
     def test_router_reschedule_from_dead_agent(self):
         with self.router():
             l3_rpc = l3_rpc_base.L3RpcCallbackMixin()