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 50505af0bdd..db050b7428b 100644 --- a/neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py +++ b/neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py @@ -475,15 +475,25 @@ class LinuxBridgeManager(amb.CommonAgentManagerBase): physical_network, segmentation_id): return False - # Check if device needs to be added to bridge - if not bridge_lib.BridgeDevice.get_interface_bridge( - tap_device_name): + # Avoid messing with plugging devices into a bridge that the agent + # does not own + if not device_owner.startswith(constants.DEVICE_OWNER_COMPUTE_PREFIX): + # Check if device needs to be added to bridge + if not bridge_lib.BridgeDevice.get_interface_bridge( + tap_device_name): + data = {'tap_device_name': tap_device_name, + 'bridge_name': bridge_name} + LOG.debug("Adding device %(tap_device_name)s to bridge " + "%(bridge_name)s", data) + if bridge_lib.BridgeDevice(bridge_name).addif(tap_device_name): + return False + else: data = {'tap_device_name': tap_device_name, + 'device_owner': device_owner, 'bridge_name': bridge_name} - LOG.debug("Adding device %(tap_device_name)s to bridge " - "%(bridge_name)s", data) - if bridge_lib.BridgeDevice(bridge_name).addif(tap_device_name): - return False + LOG.debug("Skip adding device %(tap_device_name)s to " + "%(bridge_name)s. It is owned by %(device_owner)s and " + "thus added elsewhere.", data) return True def plug_interface(self, network_id, network_segment, tap_name, 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 3d9fdefc05f..e3eadc37e96 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 @@ -510,6 +510,15 @@ class TestLinuxBridgeManager(base.BaseTestCase): p_const.TYPE_VLAN, "physnet1", None, "tap1", "foo") + def test_add_tap_interface_owner_compute(self): + with mock.patch.object(ip_lib, "device_exists"): + with mock.patch.object(self.lbm, "ensure_local_bridge"): + self.assertTrue(self.lbm.add_tap_interface("123", + p_const.TYPE_LOCAL, + "physnet1", None, + "tap1", + "compute:1")) + def _test_add_tap_interface(self, dev_owner_prefix): with mock.patch.object(ip_lib, "device_exists") as de_fn: de_fn.return_value = False