[DHCP] Don't resync network if same port is alredy in cache

Sometimes when port is created on dhcp agent's side, it may happend
that same port is already in network cache.
Before this patch if port with same IP address was already in cache,
resync was rescheduled because of duplicate IPs found in cache.

Now resync will be scheduled only if duplicate IP address belongs to
port with different MAC address or different id.

Change-Id: I23afbc10725f5dc78e3c63e6e505ef89ba8dc4a5
Closes-Bug: #1824802
(cherry picked from commit 5c433a027d)
This commit is contained in:
Slawek Kaplonski 2019-05-10 10:47:00 +02:00
parent 4352e821b8
commit 946faaf361
2 changed files with 21 additions and 3 deletions

View File

@ -541,11 +541,14 @@ class DhcpAgent(manager.Manager):
return
new_ips = {i['ip_address'] for i in created_port['fixed_ips']}
for port_cached in network.ports:
# if there are other ports cached with the same ip address in
# the same network this indicate that the cache is out of sync
# if in the same network there are ports cached with the same
# ip address but different MAC address and/or different id,
# this indicate that the cache is out of sync
cached_ips = {i['ip_address']
for i in port_cached['fixed_ips']}
if new_ips.intersection(cached_ips):
if (new_ips.intersection(cached_ips) and
(created_port['id'] != port_cached['id'] or
created_port['mac_address'] != port_cached['mac_address'])):
self.schedule_resync("Duplicate IP addresses found, "
"DHCP cache is out of sync",
created_port.network_id)

View File

@ -1137,6 +1137,21 @@ class TestDhcpAgentEventHandler(base.BaseTestCase):
self.reload_allocations.assert_called_once_with(fake_port2,
fake_network)
def test_port_create_end_no_resync_if_same_port_already_in_cache(self):
self.reload_allocations_p = mock.patch.object(self.dhcp,
'reload_allocations')
self.reload_allocations = self.reload_allocations_p.start()
payload = dict(port=copy.deepcopy(fake_port2))
cached_port = copy.deepcopy(fake_port2)
new_fake_network = copy.deepcopy(fake_network)
new_fake_network.ports = [cached_port]
self.cache.get_network_by_id.return_value = new_fake_network
self.dhcp.port_create_end(None, payload)
self.dhcp._process_resource_update()
self.reload_allocations.assert_called_once_with(fake_port2,
new_fake_network)
self.schedule_resync.assert_not_called()
def test_port_update_change_ip_on_port(self):
payload = dict(port=fake_port1, priority=FAKE_PRIORITY)
self.cache.get_network_by_id.return_value = fake_network