From 5bd76c52844ffcfb2bd0ce1753b5159ef510b323 Mon Sep 17 00:00:00 2001 From: Shih-Hao Li Date: Wed, 30 Dec 2015 11:43:23 -0800 Subject: [PATCH] Fix uuid passing in disable_isolated_metadata_proxy In DhcpAgent, when enable_isolated_metadata_proxy() spawns a metadata proxy agent for a network, it will pass router_id instead of network_id if metadata network is enabled and a router port is connected to this network. Later, MetadataDriver will register this uuid (i.e. router_id) with monitor for the new metadata proxy process. But when disable_isolated_metadata_proxy() destroys a metadata proxy agent for a network, it always passes network_id as the uuid. Thus MetadataDriver can not find the matching process. So the corresponding metadata proxy agent can not be destroyed. Closes-bug: #1526084 Change-Id: Icab94f4e09e95fa6729c458522a3fe50e850a4be --- neutron/agent/dhcp/agent.py | 15 ++++++++++- neutron/tests/unit/agent/dhcp/test_agent.py | 28 ++++++++++++++++++--- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/neutron/agent/dhcp/agent.py b/neutron/agent/dhcp/agent.py index 2fde2e473..7b00de5b4 100644 --- a/neutron/agent/dhcp/agent.py +++ b/neutron/agent/dhcp/agent.py @@ -64,6 +64,9 @@ class DhcpAgent(manager.Manager): utils.ensure_dir(dhcp_dir) self.dhcp_version = self.dhcp_driver_cls.check_version() self._populate_networks_cache() + # keep track of mappings between networks and routers for + # metadata processing + self._metadata_routers = {} # {network_id: router_id} self._process_monitor = external_process.ProcessMonitor( config=self.conf, resource_type='dhcp') @@ -375,14 +378,24 @@ class DhcpAgent(manager.Manager): 'port_id': router_ports[0].id, 'router_id': router_ports[0].device_id}) kwargs = {'router_id': router_ports[0].device_id} + self._metadata_routers[network.id] = router_ports[0].device_id metadata_driver.MetadataDriver.spawn_monitored_metadata_proxy( self._process_monitor, network.namespace, dhcp.METADATA_PORT, self.conf, **kwargs) def disable_isolated_metadata_proxy(self, network): + if (self.conf.enable_metadata_network and + network.id in self._metadata_routers): + uuid = self._metadata_routers[network.id] + is_router_id = True + else: + uuid = network.id + is_router_id = False metadata_driver.MetadataDriver.destroy_monitored_metadata_proxy( - self._process_monitor, network.id, self.conf) + self._process_monitor, uuid, self.conf) + if is_router_id: + del self._metadata_routers[network.id] class DhcpPluginApi(object): diff --git a/neutron/tests/unit/agent/dhcp/test_agent.py b/neutron/tests/unit/agent/dhcp/test_agent.py index deb6fe564..322c9f161 100644 --- a/neutron/tests/unit/agent/dhcp/test_agent.py +++ b/neutron/tests/unit/agent/dhcp/test_agent.py @@ -805,7 +805,7 @@ class TestDhcpAgentEventHandler(base.BaseTestCase): fake_network.id, cfg.CONF) - def _test_metadata_network(self, network): + def _test_enable_isolated_metadata_proxy(self, network): cfg.CONF.set_override('enable_metadata_network', True) cfg.CONF.set_override('debug', True) cfg.CONF.set_override('verbose', False) @@ -821,13 +821,33 @@ class TestDhcpAgentEventHandler(base.BaseTestCase): router_id='forzanapoli') def test_enable_isolated_metadata_proxy_with_metadata_network(self): - self._test_metadata_network(fake_meta_network) + self._test_enable_isolated_metadata_proxy(fake_meta_network) def test_enable_isolated_metadata_proxy_with_metadata_network_dvr(self): - self._test_metadata_network(fake_meta_dvr_network) + self._test_enable_isolated_metadata_proxy(fake_meta_dvr_network) def test_enable_isolated_metadata_proxy_with_dist_network(self): - self._test_metadata_network(fake_dist_network) + self._test_enable_isolated_metadata_proxy(fake_dist_network) + + def _test_disable_isolated_metadata_proxy(self, network): + cfg.CONF.set_override('enable_metadata_network', True) + method_path = ('neutron.agent.metadata.driver.MetadataDriver' + '.destroy_monitored_metadata_proxy') + with mock.patch(method_path) as destroy: + self.dhcp.enable_isolated_metadata_proxy(network) + self.dhcp.disable_isolated_metadata_proxy(network) + destroy.assert_called_once_with(self.dhcp._process_monitor, + 'forzanapoli', + cfg.CONF) + + def test_disable_isolated_metadata_proxy_with_metadata_network(self): + self._test_disable_isolated_metadata_proxy(fake_meta_network) + + def test_disable_isolated_metadata_proxy_with_metadata_network_dvr(self): + self._test_disable_isolated_metadata_proxy(fake_meta_dvr_network) + + def test_disable_isolated_metadata_proxy_with_dist_network(self): + self._test_disable_isolated_metadata_proxy(fake_dist_network) def test_network_create_end(self): payload = dict(network=dict(id=fake_network.id)) -- 2.45.2