Merge "Restart dsnmasq on any network subnet change" into stable/mitaka
This commit is contained in:
commit
2f8f7523b0
|
@ -280,17 +280,18 @@ class DhcpAgent(manager.Manager):
|
||||||
if not network:
|
if not network:
|
||||||
return
|
return
|
||||||
|
|
||||||
old_cidrs = set(s.cidr for s in old_network.subnets if s.enable_dhcp)
|
if not any(s for s in network.subnets if s.enable_dhcp):
|
||||||
new_cidrs = set(s.cidr for s in network.subnets if s.enable_dhcp)
|
self.disable_dhcp_helper(network.id)
|
||||||
|
return
|
||||||
if new_cidrs and old_cidrs == new_cidrs:
|
# NOTE(kevinbenton): we don't exclude dhcp disabled subnets because
|
||||||
|
# they still change the indexes used for tags
|
||||||
|
old_cidrs = [s.cidr for s in network.subnets]
|
||||||
|
new_cidrs = [s.cidr for s in old_network.subnets]
|
||||||
|
if old_cidrs == new_cidrs:
|
||||||
self.call_driver('reload_allocations', network)
|
self.call_driver('reload_allocations', network)
|
||||||
self.cache.put(network)
|
self.cache.put(network)
|
||||||
elif new_cidrs:
|
elif self.call_driver('restart', network):
|
||||||
if self.call_driver('restart', network):
|
self.cache.put(network)
|
||||||
self.cache.put(network)
|
|
||||||
else:
|
|
||||||
self.disable_dhcp_helper(network.id)
|
|
||||||
|
|
||||||
@utils.synchronized('dhcp-agent')
|
@utils.synchronized('dhcp-agent')
|
||||||
def network_create_end(self, context, payload):
|
def network_create_end(self, context, payload):
|
||||||
|
|
|
@ -135,7 +135,11 @@ class DhcpRpcCallback(object):
|
||||||
filters = {'network_id': [network['id'] for network in networks]}
|
filters = {'network_id': [network['id'] for network in networks]}
|
||||||
ports = plugin.get_ports(context, filters=filters)
|
ports = plugin.get_ports(context, filters=filters)
|
||||||
filters['enable_dhcp'] = [True]
|
filters['enable_dhcp'] = [True]
|
||||||
subnets = plugin.get_subnets(context, filters=filters)
|
# NOTE(kevinbenton): we sort these because the agent builds tags
|
||||||
|
# based on position in the list and has to restart the process if
|
||||||
|
# the order changes.
|
||||||
|
subnets = sorted(plugin.get_subnets(context, filters=filters),
|
||||||
|
key=operator.itemgetter('id'))
|
||||||
|
|
||||||
grouped_subnets = self._group_by_network_id(subnets)
|
grouped_subnets = self._group_by_network_id(subnets)
|
||||||
grouped_ports = self._group_by_network_id(ports)
|
grouped_ports = self._group_by_network_id(ports)
|
||||||
|
@ -160,7 +164,12 @@ class DhcpRpcCallback(object):
|
||||||
"been deleted concurrently.", network_id)
|
"been deleted concurrently.", network_id)
|
||||||
return
|
return
|
||||||
filters = dict(network_id=[network_id])
|
filters = dict(network_id=[network_id])
|
||||||
network['subnets'] = plugin.get_subnets(context, filters=filters)
|
# NOTE(kevinbenton): we sort these because the agent builds tags
|
||||||
|
# based on position in the list and has to restart the process if
|
||||||
|
# the order changes.
|
||||||
|
network['subnets'] = sorted(
|
||||||
|
plugin.get_subnets(context, filters=filters),
|
||||||
|
key=operator.itemgetter('id'))
|
||||||
network['ports'] = plugin.get_ports(context, filters=filters)
|
network['ports'] = plugin.get_ports(context, filters=filters)
|
||||||
return network
|
return network
|
||||||
|
|
||||||
|
|
|
@ -909,6 +909,20 @@ class TestDhcpAgentEventHandler(base.BaseTestCase):
|
||||||
self.assertTrue(log.called)
|
self.assertTrue(log.called)
|
||||||
self.assertTrue(self.dhcp.schedule_resync.called)
|
self.assertTrue(self.dhcp.schedule_resync.called)
|
||||||
|
|
||||||
|
def test_subnet_create_restarts_with_dhcp_disabled(self):
|
||||||
|
payload = dict(subnet=dhcp.DictModel(
|
||||||
|
dict(network_id=fake_network.id, enable_dhcp=False,
|
||||||
|
cidr='99.99.99.0/24')))
|
||||||
|
self.cache.get_network_by_id.return_value = fake_network
|
||||||
|
new_net = copy.deepcopy(fake_network)
|
||||||
|
new_net.subnets.append(payload['subnet'])
|
||||||
|
self.plugin.get_network_info.return_value = new_net
|
||||||
|
|
||||||
|
self.dhcp.subnet_create_end(None, payload)
|
||||||
|
|
||||||
|
self.cache.assert_has_calls([mock.call.put(new_net)])
|
||||||
|
self.call_driver.assert_called_once_with('restart', new_net)
|
||||||
|
|
||||||
def test_subnet_update_end(self):
|
def test_subnet_update_end(self):
|
||||||
payload = dict(subnet=dict(network_id=fake_network.id))
|
payload = dict(subnet=dict(network_id=fake_network.id))
|
||||||
self.cache.get_network_by_id.return_value = fake_network
|
self.cache.get_network_by_id.return_value = fake_network
|
||||||
|
|
|
@ -67,7 +67,7 @@ class TestDhcpRpcCallback(base.BaseTestCase):
|
||||||
plugin_retval = [{'id': 'a'}, {'id': 'b'}]
|
plugin_retval = [{'id': 'a'}, {'id': 'b'}]
|
||||||
self.plugin.get_networks.return_value = plugin_retval
|
self.plugin.get_networks.return_value = plugin_retval
|
||||||
port = {'network_id': 'a'}
|
port = {'network_id': 'a'}
|
||||||
subnet = {'network_id': 'b'}
|
subnet = {'network_id': 'b', 'id': 'c'}
|
||||||
self.plugin.get_ports.return_value = [port]
|
self.plugin.get_ports.return_value = [port]
|
||||||
self.plugin.get_subnets.return_value = [subnet]
|
self.plugin.get_subnets.return_value = [subnet]
|
||||||
networks = self.callbacks.get_active_networks_info(mock.Mock(),
|
networks = self.callbacks.get_active_networks_info(mock.Mock(),
|
||||||
|
@ -151,7 +151,7 @@ class TestDhcpRpcCallback(base.BaseTestCase):
|
||||||
def test_get_network_info(self):
|
def test_get_network_info(self):
|
||||||
network_retval = dict(id='a')
|
network_retval = dict(id='a')
|
||||||
|
|
||||||
subnet_retval = mock.Mock()
|
subnet_retval = [dict(id='a'), dict(id='c'), dict(id='b')]
|
||||||
port_retval = mock.Mock()
|
port_retval = mock.Mock()
|
||||||
|
|
||||||
self.plugin.get_network.return_value = network_retval
|
self.plugin.get_network.return_value = network_retval
|
||||||
|
@ -160,7 +160,8 @@ class TestDhcpRpcCallback(base.BaseTestCase):
|
||||||
|
|
||||||
retval = self.callbacks.get_network_info(mock.Mock(), network_id='a')
|
retval = self.callbacks.get_network_info(mock.Mock(), network_id='a')
|
||||||
self.assertEqual(retval, network_retval)
|
self.assertEqual(retval, network_retval)
|
||||||
self.assertEqual(retval['subnets'], subnet_retval)
|
sorted_subnet_retval = [dict(id='a'), dict(id='b'), dict(id='c')]
|
||||||
|
self.assertEqual(retval['subnets'], sorted_subnet_retval)
|
||||||
self.assertEqual(retval['ports'], port_retval)
|
self.assertEqual(retval['ports'], port_retval)
|
||||||
|
|
||||||
def test_update_dhcp_port_verify_port_action_port_dict(self):
|
def test_update_dhcp_port_verify_port_action_port_dict(self):
|
||||||
|
|
Loading…
Reference in New Issue