From dd6fd625391d310040118ae5c3575ff6cff6e833 Mon Sep 17 00:00:00 2001 From: Pepijn Oomen Date: Mon, 21 Nov 2016 12:07:45 +0100 Subject: [PATCH] Solve unexpected NoneType returned by _get_routers_can_schedule. Solve a problem with an unexpected NoneType returned by _get_routers_can_schedule called from within _schedule_ha_routers_to_additional_agent when using: router_scheduler_driver = neutron.scheduler.l3_agent_scheduler.AZLeastRoutersScheduler This was leading to problems with starting neutron-l3-agent on network nodes, causing HA routers to fail to start. Closes-Bug: #1641879 Related-Bug: #1654128 Change-Id: I33c5a6214670f0ada9c2293b0eb2ff243f6f7b1b (cherry picked from commit 62176a9b40619327aacee9ed4162252d1245d019) --- neutron/scheduler/l3_agent_scheduler.py | 2 +- neutron/tests/unit/scheduler/test_l3_agent_scheduler.py | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/neutron/scheduler/l3_agent_scheduler.py b/neutron/scheduler/l3_agent_scheduler.py index 7154ba58e51..900ef28209a 100644 --- a/neutron/scheduler/l3_agent_scheduler.py +++ b/neutron/scheduler/l3_agent_scheduler.py @@ -411,7 +411,7 @@ class AZLeastRoutersScheduler(LeastRoutersScheduler): target_routers.append(r) if not target_routers: - return + return [] return super(AZLeastRoutersScheduler, self)._get_routers_can_schedule( context, plugin, target_routers, l3_agent) diff --git a/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py b/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py index 9c00673cbe6..fd67a12a5ff 100644 --- a/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py +++ b/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py @@ -171,7 +171,7 @@ class L3SchedulerBaseTestCase(base.BaseTestCase): self.scheduler, '_get_routers_can_schedule') as mock_target_routers: mock_unscheduled_routers.return_value = mock.ANY - mock_target_routers.return_value = None + mock_target_routers.return_value = [] result = self.scheduler.auto_schedule_routers( self.plugin, mock.ANY, mock.ANY, mock.ANY) self.assertTrue(self.plugin.get_enabled_agent_on_host.called) @@ -1985,6 +1985,11 @@ class L3AgentAZLeastRoutersSchedulerTestCase(L3HATestCaseMixin): hosts = set([a['host'] for a in agents]) self.assertEqual(expected_hosts, hosts) + def test__get_routers_can_schedule_with_no_target_routers(self): + result = self.plugin.router_scheduler._get_routers_can_schedule( + self.plugin, mock.ANY, [], mock.ANY) + self.assertEqual([], result) + class L3DVRHAPlugin(db_v2.NeutronDbPluginV2, l3_hamode_db.L3_HA_NAT_db_mixin,