From: Oleg Bondarev Date: Thu, 18 Sep 2014 14:39:43 +0000 (+0400) Subject: Only setup dhcp interface if dhcp is not active on network X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=d144cb8ff422e16c5917c87471a46fd095fd1856;p=openstack-build%2Fneutron-build.git Only setup dhcp interface if dhcp is not active on network When enabling (DhcpLocalProcess.enable()) dhcp for a network the agent first sets dhcp interface, then checks if dhcp is curently active and if it's true then the agent restarts dhcp. Restart (DhcpBase.restart()) first disables dhcp and then enables it again by calling DhcpLocalProcess.enable() recursively which in turn sets dhcp interface again (it doesn't see the port created earlier as network is not re-fetched from db). This leads to duplicate dhcp interface for the network. The fix is to only setup dhcp interface if dhcp is not active. Closes-Bug: #1339968 Change-Id: I3a6d2fd5b18a97138ac5b699ecd4d4b30dbdbacb --- diff --git a/neutron/agent/linux/dhcp.py b/neutron/agent/linux/dhcp.py index 36bce4ee2..aba75af57 100644 --- a/neutron/agent/linux/dhcp.py +++ b/neutron/agent/linux/dhcp.py @@ -198,10 +198,10 @@ class DhcpLocalProcess(DhcpBase): def enable(self): """Enables DHCP for this network by spawning a local process.""" - interface_name = self.device_manager.setup(self.network) if self.active: self.restart() elif self._enable_dhcp(): + interface_name = self.device_manager.setup(self.network) self.interface_name = interface_name self.spawn_process() diff --git a/neutron/tests/unit/test_linux_dhcp.py b/neutron/tests/unit/test_linux_dhcp.py index d06a7139e..f6f5fc6a2 100644 --- a/neutron/tests/unit/test_linux_dhcp.py +++ b/neutron/tests/unit/test_linux_dhcp.py @@ -583,6 +583,7 @@ class TestDhcpLocalProcess(TestBase): lp.enable() self.assertEqual(lp.called, ['restart']) + self.assertFalse(self.mock_mgr.return_value.setup.called) def test_enable(self): attrs_to_mock = dict(