]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Fix uuid passing in disable_isolated_metadata_proxy
authorShih-Hao Li <shihli@vmware.com>
Wed, 30 Dec 2015 19:43:23 +0000 (11:43 -0800)
committerShih-Hao Li <shihli@vmware.com>
Fri, 8 Jan 2016 00:25:27 +0000 (00:25 +0000)
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
neutron/tests/unit/agent/dhcp/test_agent.py

index 2fde2e473859c65fe46f82c21c2760d5d1392ef9..7b00de5b48d9b6ea4a9844222dc793c478b6e0cb 100644 (file)
@@ -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):
index deb6fe56446f135342d30c78fea19de36d64a7d7..322c9f161717f4b245af93980b221edf2eb814ac 100644 (file)
@@ -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))