Spawn/stop metadata proxies upon adding/deleting router interfaces
When a network becomes isolated and isolated_metadata_enabled=True, the DHCP agent won't spawn the required metadata proxy instance unless the agent gets restarted. Similarly, it won't stop them when the network is no longer isolated. This patch fixes it by updating the isolated metadata proxy on port_update_end and port_delete_end methods which are invoked every time a router interface port is added, updated or deleted. Change-Id: I5c197a5755135357c6465dfe4803019a2ad52c14 Closes-Bug: #1753540 Signed-off-by: Daniel Alvarez <dalvarez@redhat.com>
This commit is contained in:
parent
25f4406c72
commit
9362d4f1f2
|
@ -440,6 +440,7 @@ class DhcpAgent(manager.Manager):
|
|||
self.cache.put_port(updated_port)
|
||||
self.call_driver(driver_action, network)
|
||||
self.dhcp_ready_ports.add(updated_port.id)
|
||||
self.update_isolated_metadata_proxy(network)
|
||||
|
||||
def _is_port_on_this_agent(self, port):
|
||||
thishost = utils.get_dhcp_agent_device_id(
|
||||
|
@ -470,6 +471,7 @@ class DhcpAgent(manager.Manager):
|
|||
self.schedule_resync("Agent port was deleted", port.network_id)
|
||||
else:
|
||||
self.call_driver('reload_allocations', network)
|
||||
self.update_isolated_metadata_proxy(network)
|
||||
|
||||
def update_isolated_metadata_proxy(self, network):
|
||||
"""Spawn or kill metadata proxy.
|
||||
|
|
|
@ -1013,12 +1013,15 @@ class TestDhcpAgentEventHandler(base.BaseTestCase):
|
|||
payload = dict(port=fake_port2)
|
||||
self.cache.get_network_by_id.return_value = fake_network
|
||||
self.cache.get_port_by_id.return_value = fake_port2
|
||||
with mock.patch.object(
|
||||
self.dhcp, 'update_isolated_metadata_proxy') as ump:
|
||||
self.dhcp.port_update_end(None, payload)
|
||||
self.cache.assert_has_calls(
|
||||
[mock.call.get_network_by_id(fake_port2.network_id),
|
||||
mock.call.put_port(mock.ANY)])
|
||||
self.call_driver.assert_called_once_with('reload_allocations',
|
||||
fake_network)
|
||||
self.assertTrue(ump.called)
|
||||
|
||||
def test_port_update_end_grabs_lock(self):
|
||||
payload = dict(port=fake_port2)
|
||||
|
@ -1034,12 +1037,15 @@ class TestDhcpAgentEventHandler(base.BaseTestCase):
|
|||
updated_fake_port1 = copy.deepcopy(fake_port1)
|
||||
updated_fake_port1.fixed_ips[0].ip_address = '172.9.9.99'
|
||||
self.cache.get_port_by_id.return_value = updated_fake_port1
|
||||
with mock.patch.object(
|
||||
self.dhcp, 'update_isolated_metadata_proxy') as ump:
|
||||
self.dhcp.port_update_end(None, payload)
|
||||
self.cache.assert_has_calls(
|
||||
[mock.call.get_network_by_id(fake_port1.network_id),
|
||||
mock.call.put_port(mock.ANY)])
|
||||
self.call_driver.assert_has_calls(
|
||||
[mock.call.call_driver('reload_allocations', fake_network)])
|
||||
self.assertTrue(ump.called)
|
||||
|
||||
def test_port_update_change_subnet_on_dhcp_agents_port(self):
|
||||
self.cache.get_network_by_id.return_value = fake_network
|
||||
|
@ -1092,6 +1098,8 @@ class TestDhcpAgentEventHandler(base.BaseTestCase):
|
|||
self.cache.get_network_by_id.return_value = fake_network
|
||||
self.cache.get_port_by_id.return_value = fake_port2
|
||||
|
||||
with mock.patch.object(
|
||||
self.dhcp, 'update_isolated_metadata_proxy') as ump:
|
||||
self.dhcp.port_delete_end(None, payload)
|
||||
self.cache.assert_has_calls(
|
||||
[mock.call.get_port_by_id(fake_port2.id),
|
||||
|
@ -1101,6 +1109,7 @@ class TestDhcpAgentEventHandler(base.BaseTestCase):
|
|||
mock.call.remove_port(fake_port2)])
|
||||
self.call_driver.assert_has_calls(
|
||||
[mock.call.call_driver('reload_allocations', fake_network)])
|
||||
self.assertTrue(ump.called)
|
||||
|
||||
def test_port_delete_end_unknown_port(self):
|
||||
payload = dict(port_id='unknown')
|
||||
|
|
Loading…
Reference in New Issue