[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:
parent
4352e821b8
commit
946faaf361
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue