Merge "Fixes race condition and boosts the scheduling performance" into stable/juno
This commit is contained in:
commit
b4c37aef90
|
@ -378,6 +378,23 @@ class L3AgentSchedulerDbMixin(l3agentscheduler.L3AgentSchedulerPluginBase,
|
|||
return False
|
||||
|
||||
core_plugin = manager.NeutronManager.get_plugin()
|
||||
# NOTE(swami):Before checking for existence of dvr
|
||||
# serviceable ports on the host managed by the l3
|
||||
# agent, let's verify if at least one subnet has
|
||||
# dhcp enabled. If so, then the host will have a
|
||||
# dvr serviceable port, which is in fact the DHCP
|
||||
# port.
|
||||
# This optimization is valid assuming that the L3
|
||||
# DVR_SNAT node will be the one hosting the DHCP
|
||||
# Agent.
|
||||
agent_conf = self.get_configuration_dict(l3_agent)
|
||||
agent_mode = agent_conf.get('agent_mode', 'legacy')
|
||||
|
||||
for subnet_id in subnet_ids:
|
||||
subnet_dict = core_plugin.get_subnet(context, subnet_id)
|
||||
if subnet_dict['enable_dhcp'] and agent_mode == 'dvr_snat':
|
||||
return True
|
||||
|
||||
filter = {'fixed_ips': {'subnet_id': subnet_ids}}
|
||||
ports = core_plugin.get_ports(context, filters=filter)
|
||||
for port in ports:
|
||||
|
|
|
@ -661,6 +661,29 @@ class L3SchedulerTestBaseMixin(object):
|
|||
l3_agent, router['id'])
|
||||
self.assertFalse(val)
|
||||
|
||||
def test_check_ports_exist_on_l3agent_with_dhcp_enabled_subnets(self):
|
||||
self._register_l3_dvr_agents()
|
||||
router = self._make_router(self.fmt,
|
||||
tenant_id=str(uuid.uuid4()),
|
||||
name='r2')
|
||||
router['external_gateway_info'] = None
|
||||
router['id'] = str(uuid.uuid4())
|
||||
router['distributed'] = True
|
||||
|
||||
agent_list = [self.l3_dvr_snat_agent]
|
||||
subnet = {'id': str(uuid.uuid4()),
|
||||
'enable_dhcp': True}
|
||||
|
||||
self.get_subnet_ids_on_router = mock.Mock(
|
||||
return_value=[subnet['id']])
|
||||
|
||||
self.plugin.get_subnet = mock.Mock(return_value=subnet)
|
||||
self.plugin.get_ports = mock.Mock()
|
||||
val = self.check_ports_exist_on_l3agent(
|
||||
self.adminContext, agent_list[0], router['id'])
|
||||
self.assertTrue(val)
|
||||
self.assertFalse(self.plugin.get_ports.called)
|
||||
|
||||
def test_check_ports_exist_on_l3agent_if_no_subnets_then_return(self):
|
||||
l3_agent, router = self._prepare_check_ports_exist_tests()
|
||||
with mock.patch.object(manager.NeutronManager,
|
||||
|
@ -678,7 +701,9 @@ class L3SchedulerTestBaseMixin(object):
|
|||
'get_plugin') as getp:
|
||||
getp.return_value = self.plugin
|
||||
# no matching subnet
|
||||
self.get_subnet_ids_on_router.return_value = [str(uuid.uuid4())]
|
||||
subnet = {'id': str(uuid.uuid4()), 'enable_dhcp': False}
|
||||
self.get_subnet_ids_on_router.return_value = [subnet['id']]
|
||||
self.plugin.get_subnet = mock.Mock(return_value=subnet)
|
||||
val = self.check_ports_exist_on_l3agent(self.adminContext,
|
||||
l3_agent, router['id'])
|
||||
self.assertFalse(val)
|
||||
|
@ -693,9 +718,12 @@ class L3SchedulerTestBaseMixin(object):
|
|||
'binding:host_id': HOST,
|
||||
'device_owner': 'compute:',
|
||||
'id': 1234}
|
||||
subnet = {'id': str(uuid.uuid4()),
|
||||
'enable_dhcp': False}
|
||||
self.plugin.get_ports.return_value = [port]
|
||||
self.get_subnet_ids_on_router = mock.Mock(
|
||||
return_value=[port['subnet_id']])
|
||||
self.plugin.get_subnet = mock.Mock(return_value=subnet)
|
||||
val = self.check_ports_exist_on_l3agent(self.adminContext,
|
||||
l3_agent, router['id'])
|
||||
self.assertTrue(val)
|
||||
|
|
Loading…
Reference in New Issue