Merge "Reload DHCP interface when its port is updated"
This commit is contained in:
commit
61b3be1b43
@ -316,8 +316,21 @@ class DhcpAgent(manager.Manager):
|
|||||||
updated_port = dhcp.DictModel(payload['port'])
|
updated_port = dhcp.DictModel(payload['port'])
|
||||||
network = self.cache.get_network_by_id(updated_port.network_id)
|
network = self.cache.get_network_by_id(updated_port.network_id)
|
||||||
if network:
|
if network:
|
||||||
|
driver_action = 'reload_allocations'
|
||||||
|
if self._is_port_on_this_agent(updated_port):
|
||||||
|
orig = self.cache.get_port_by_id(updated_port['id'])
|
||||||
|
# assume IP change if not in cache
|
||||||
|
old_ips = {i['ip_address'] for i in orig['fixed_ips'] or []}
|
||||||
|
new_ips = {i['ip_address'] for i in updated_port['fixed_ips']}
|
||||||
|
if old_ips != new_ips:
|
||||||
|
driver_action = 'restart'
|
||||||
self.cache.put_port(updated_port)
|
self.cache.put_port(updated_port)
|
||||||
self.call_driver('reload_allocations', network)
|
self.call_driver(driver_action, network)
|
||||||
|
|
||||||
|
def _is_port_on_this_agent(self, port):
|
||||||
|
thishost = utils.get_dhcp_agent_device_id(
|
||||||
|
port['network_id'], self.conf.host)
|
||||||
|
return port['device_id'] == thishost
|
||||||
|
|
||||||
# Use the update handler for the port create event.
|
# Use the update handler for the port create event.
|
||||||
port_create_end = port_update_end
|
port_create_end = port_update_end
|
||||||
|
@ -33,6 +33,7 @@ from neutron.agent.linux import interface
|
|||||||
from neutron.common import config as common_config
|
from neutron.common import config as common_config
|
||||||
from neutron.common import constants as const
|
from neutron.common import constants as const
|
||||||
from neutron.common import exceptions
|
from neutron.common import exceptions
|
||||||
|
from neutron.common import utils
|
||||||
from neutron import context
|
from neutron import context
|
||||||
from neutron.tests import base
|
from neutron.tests import base
|
||||||
|
|
||||||
@ -102,6 +103,7 @@ fake_port1 = dhcp.DictModel(dict(id='12345678-1234-aaaa-1234567890ab',
|
|||||||
fixed_ips=[fake_fixed_ip1]))
|
fixed_ips=[fake_fixed_ip1]))
|
||||||
|
|
||||||
fake_port2 = dhcp.DictModel(dict(id='12345678-1234-aaaa-123456789000',
|
fake_port2 = dhcp.DictModel(dict(id='12345678-1234-aaaa-123456789000',
|
||||||
|
device_id='dhcp-12345678-1234-aaaa-123456789000',
|
||||||
device_owner='',
|
device_owner='',
|
||||||
mac_address='aa:bb:cc:dd:ee:99',
|
mac_address='aa:bb:cc:dd:ee:99',
|
||||||
network_id='12345678-1234-5678-1234567890ab',
|
network_id='12345678-1234-5678-1234567890ab',
|
||||||
@ -529,6 +531,7 @@ class TestDhcpAgentEventHandler(base.BaseTestCase):
|
|||||||
cfg.CONF.set_override('interface_driver',
|
cfg.CONF.set_override('interface_driver',
|
||||||
'neutron.agent.linux.interface.NullDriver')
|
'neutron.agent.linux.interface.NullDriver')
|
||||||
cfg.CONF.register_opts(dhcp_config.DHCP_AGENT_OPTS)
|
cfg.CONF.register_opts(dhcp_config.DHCP_AGENT_OPTS)
|
||||||
|
cfg.CONF.register_opts(dhcp_config.DHCP_OPTS)
|
||||||
|
|
||||||
self.plugin_p = mock.patch(DHCP_PLUGIN)
|
self.plugin_p = mock.patch(DHCP_PLUGIN)
|
||||||
plugin_cls = self.plugin_p.start()
|
plugin_cls = self.plugin_p.start()
|
||||||
@ -914,6 +917,26 @@ class TestDhcpAgentEventHandler(base.BaseTestCase):
|
|||||||
self.call_driver.assert_has_calls(
|
self.call_driver.assert_has_calls(
|
||||||
[mock.call.call_driver('reload_allocations', fake_network)])
|
[mock.call.call_driver('reload_allocations', fake_network)])
|
||||||
|
|
||||||
|
def test_port_update_change_ip_on_dhcp_agents_port(self):
|
||||||
|
self.cache.get_network_by_id.return_value = fake_network
|
||||||
|
self.cache.get_port_by_id.return_value = fake_port1
|
||||||
|
payload = dict(port=copy.deepcopy(fake_port1))
|
||||||
|
device_id = utils.get_dhcp_agent_device_id(
|
||||||
|
payload['port']['network_id'], self.dhcp.conf.host)
|
||||||
|
payload['port']['fixed_ips'][0]['ip_address'] = '172.9.9.99'
|
||||||
|
payload['port']['device_id'] = device_id
|
||||||
|
self.dhcp.port_update_end(None, payload)
|
||||||
|
self.call_driver.assert_has_calls(
|
||||||
|
[mock.call.call_driver('restart', fake_network)])
|
||||||
|
|
||||||
|
def test_port_update_on_dhcp_agents_port_no_ip_change(self):
|
||||||
|
payload = dict(port=fake_port1)
|
||||||
|
self.cache.get_network_by_id.return_value = fake_network
|
||||||
|
self.cache.get_port_by_id.return_value = fake_port1
|
||||||
|
self.dhcp.port_update_end(None, payload)
|
||||||
|
self.call_driver.assert_has_calls(
|
||||||
|
[mock.call.call_driver('reload_allocations', fake_network)])
|
||||||
|
|
||||||
def test_port_delete_end(self):
|
def test_port_delete_end(self):
|
||||||
payload = dict(port_id=fake_port2.id)
|
payload = dict(port_id=fake_port2.id)
|
||||||
self.cache.get_network_by_id.return_value = fake_network
|
self.cache.get_network_by_id.return_value = fake_network
|
||||||
|
Loading…
Reference in New Issue
Block a user