diff options
author | Jenkins <jenkins@review.openstack.org> | 2016-07-29 03:48:27 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2016-07-29 03:48:27 +0000 |
commit | cc6c2029ba05068df025643efdb373503b6cd40f (patch) | |
tree | 7eb84d8327b6d7fc1c16ce87bfcaebdaaf8302fc | |
parent | 6d28df0c295c4854807a879dd39b30b652e069a6 (diff) | |
parent | d76a91070b42c142c7c6fd2a653cbbac75754a97 (diff) | |
download | neutron-cc6c2029ba05068df025643efdb373503b6cd40f.tar.gz |
Merge "Check compatibility when auto schedule ha routers" into stable/liberty7.1.2
-rw-r--r-- | neutron/scheduler/l3_agent_scheduler.py | 26 | ||||
-rw-r--r-- | neutron/tests/unit/scheduler/test_l3_agent_scheduler.py | 30 |
2 files changed, 46 insertions, 10 deletions
diff --git a/neutron/scheduler/l3_agent_scheduler.py b/neutron/scheduler/l3_agent_scheduler.py index 221ad0800b..f6ca3c2210 100644 --- a/neutron/scheduler/l3_agent_scheduler.py +++ b/neutron/scheduler/l3_agent_scheduler.py @@ -307,16 +307,22 @@ class L3Scheduler(object): scheduled = False admin_ctx = context.elevated() - for router_id, tenant_id, agents in routers_agents: - max_agents_not_reached = ( - not self.max_ha_agents or agents < self.max_ha_agents) - if max_agents_not_reached: - if not self._router_has_binding(admin_ctx, router_id, - agent.id): - self.create_ha_port_and_bind(plugin, admin_ctx, - router_id, tenant_id, - agent) - scheduled = True + underscheduled_router_ids = [ + router_id for router_id, tenant_id, agents in routers_agents + if (not self.max_ha_agents or agents < self.max_ha_agents) + ] + underscheduled_routers = plugin.get_routers( + context, filters={'id': underscheduled_router_ids}) + schedulable_routers = self._get_routers_can_schedule( + admin_ctx, plugin, underscheduled_routers, agent) + for router in schedulable_routers: + if not self._router_has_binding(admin_ctx, router['id'], + agent.id): + self.create_ha_port_and_bind(plugin, admin_ctx, + router['id'], + router['tenant_id'], + agent) + scheduled = True return scheduled diff --git a/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py b/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py index 079d220753..07d40164f1 100644 --- a/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py +++ b/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py @@ -2033,6 +2033,36 @@ class L3HAChanceSchedulerTestCase(L3HATestCaseMixin): def test_auto_schedule_all_routers_when_agent_added(self): self._auto_schedule_when_agent_added(False) + def test_auto_schedule_ha_router_when_incompatible_agent_exist(self): + handle_internal_only_routers_agent = helpers.register_l3_agent( + 'host_3', constants.L3_AGENT_MODE_LEGACY, internal_only=False) + router = self._create_ha_router() + self.plugin.schedule_router(self.adminContext, router['id']) + + self.plugin.auto_schedule_routers( + self.adminContext, handle_internal_only_routers_agent.host, []) + agents = self.plugin.get_l3_agents_hosting_routers( + self.adminContext, [router['id']], + admin_state_up=True) + agent_ids = [agent['id'] for agent in agents] + self.assertEqual(2, len(agents)) + self.assertNotIn(handle_internal_only_routers_agent.id, agent_ids) + + def test_auto_schedule_ha_router_when_dvr_agent_exist(self): + dvr_agent = helpers.register_l3_agent( + HOST_DVR, constants.L3_AGENT_MODE_DVR) + router = self._create_ha_router() + self.plugin.schedule_router(self.adminContext, router['id']) + + self.plugin.auto_schedule_routers(self.adminContext, dvr_agent.host, + []) + agents = self.plugin.get_l3_agents_hosting_routers( + self.adminContext, [router['id']], + admin_state_up=True) + agent_ids = [agent['id'] for agent in agents] + self.assertEqual(2, len(agents)) + self.assertNotIn(dvr_agent.id, agent_ids) + def _auto_schedule_when_agent_added(self, specific_router): router = self._create_ha_router() self.plugin.schedule_router(self.adminContext, router['id']) |