From b4f68ff211d0ebeba0355539ef01e7c00b178aa6 Mon Sep 17 00:00:00 2001 From: Brian Haley Date: Fri, 16 Mar 2018 11:25:13 -0400 Subject: [PATCH] Have LB agent use ip_lib.ensure_device_is_ready() The linuxbridge agent was using its own version of ensure_device_is_ready() called _bridge_exists_and_ensure_up(), just use the one in ip_lib since it does an additional MAC address check. Trivialfix Change-Id: I02cdbe40fddb220623e341b94edb3d8c96099581 --- .../agent/linuxbridge_neutron_agent.py | 15 ++------------- .../agent/test_linuxbridge_neutron_agent.py | 14 ++------------ 2 files changed, 4 insertions(+), 25 deletions(-) diff --git a/neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py b/neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py index fa577d8a068..48a83ec8d03 100644 --- a/neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py +++ b/neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py @@ -420,21 +420,10 @@ class LinuxBridgeManager(amb.CommonAgentManagerBase): return updated - def _bridge_exists_and_ensure_up(self, bridge_name): - """Check if the bridge exists and make sure it is up.""" - br = ip_lib.IPDevice(bridge_name) - br.set_log_fail_as_error(False) - try: - # If the device doesn't exist this will throw a RuntimeError - br.link.set_up() - except RuntimeError: - return False - return True - def ensure_bridge(self, bridge_name, interface=None, update_interface=True): """Create a bridge unless it already exists.""" - # _bridge_exists_and_ensure_up instead of device_exists is used here + # ensure_device_is_ready instead of device_exists is used here # because there are cases where the bridge exists but it's not UP, # for example: # 1) A greenthread was executing this function and had not yet executed @@ -442,7 +431,7 @@ class LinuxBridgeManager(amb.CommonAgentManagerBase): # thread running the same function # 2) The Nova VIF driver was running concurrently and had just created # the bridge, but had not yet put it UP - if not self._bridge_exists_and_ensure_up(bridge_name): + if not ip_lib.ensure_device_is_ready(bridge_name): LOG.debug("Starting bridge %(bridge_name)s for subinterface " "%(interface)s", {'bridge_name': bridge_name, 'interface': interface}) diff --git a/neutron/tests/unit/plugins/ml2/drivers/linuxbridge/agent/test_linuxbridge_neutron_agent.py b/neutron/tests/unit/plugins/ml2/drivers/linuxbridge/agent/test_linuxbridge_neutron_agent.py index 842046d76e7..2f9417aa643 100644 --- a/neutron/tests/unit/plugins/ml2/drivers/linuxbridge/agent/test_linuxbridge_neutron_agent.py +++ b/neutron/tests/unit/plugins/ml2/drivers/linuxbridge/agent/test_linuxbridge_neutron_agent.py @@ -495,21 +495,11 @@ class TestLinuxBridgeManager(base.BaseTestCase): self.assertTrue(addgw_fn.called) self.assertTrue(delgw_fn.called) - def test_bridge_exists_and_ensure_up(self): - ip_lib_mock = mock.Mock() - with mock.patch.object(ip_lib, 'IPDevice', return_value=ip_lib_mock): - # device exists - self.assertTrue(self.lbm._bridge_exists_and_ensure_up("br0")) - self.assertTrue(ip_lib_mock.link.set_up.called) - # device doesn't exists - ip_lib_mock.link.set_up.side_effect = RuntimeError - self.assertFalse(self.lbm._bridge_exists_and_ensure_up("br0")) - def test_ensure_bridge(self): bridge_device = mock.Mock() bridge_device_old = mock.Mock() - with mock.patch.object(self.lbm, - '_bridge_exists_and_ensure_up') as de_fn,\ + with mock.patch.object(ip_lib, + 'ensure_device_is_ready') as de_fn,\ mock.patch.object(bridge_lib, "BridgeDevice", return_value=bridge_device) as br_fn,\ mock.patch.object(self.lbm,