From d144cb8ff422e16c5917c87471a46fd095fd1856 Mon Sep 17 00:00:00 2001 From: Oleg Bondarev Date: Thu, 18 Sep 2014 18:39:43 +0400 Subject: [PATCH] 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 --- neutron/agent/linux/dhcp.py | 2 +- neutron/tests/unit/test_linux_dhcp.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/neutron/agent/linux/dhcp.py b/neutron/agent/linux/dhcp.py index 36bce4ee2e9..aba75af5716 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 d06a7139e2a..f6f5fc6a23a 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(