From: Kahou Lei Date: Sun, 13 Sep 2015 01:48:04 +0000 (-0700) Subject: Fix adding tap failure if bridge mapping is not provided X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=7bde637eac621b90adebc26434e9924fd7ca64e5;p=openstack-build%2Fneutron-build.git Fix adding tap failure if bridge mapping is not provided When bridge mapping option is not provided, tap interface cannot be added properly. The root cause is that linux bridge agent is expecting bridge mapping option is provided if physical network is presented. However it is not always the case as Kilo was working fine without existing bridge mapping Change-Id: Ie43905887a9bc60858e3edae7fc339a7e0485716 Closes-bug: #1495161 --- 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 175a81c83..30280a384 100644 --- a/neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py +++ b/neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py @@ -453,9 +453,8 @@ class LinuxBridgeManager(object): "this host, skipped", tap_device_name) return False - if physical_network: - bridge_name = self.get_existing_bridge_name(physical_network) - else: + bridge_name = self.get_existing_bridge_name(physical_network) + if not bridge_name: bridge_name = self.get_bridge_name(network_id) if network_type == p_const.TYPE_LOCAL: @@ -936,10 +935,8 @@ class LinuxBridgeNeutronAgentRPC(service.Service): self.br_mgr = LinuxBridgeManager(bridge_mappings, interface_mappings) def remove_port_binding(self, network_id, physical_network, interface_id): - if physical_network: - bridge_name = self.br_mgr.get_existing_bridge_name( - physical_network) - else: + bridge_name = self.br_mgr.get_existing_bridge_name(physical_network) + if not bridge_name: bridge_name = self.br_mgr.get_bridge_name(network_id) tap_device_name = self.br_mgr.get_tap_device_name(interface_id) return self.br_mgr.remove_interface(bridge_name, tap_device_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 2ac4b3870..e6a0e2320 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 @@ -739,7 +739,14 @@ class TestLinuxBridgeManager(base.BaseTestCase): p_const.TYPE_LOCAL, "physnet1", None, "tap1")) - en_fn.assert_called_with("123", None) + en_fn.assert_called_with("123", "brq123") + + self.lbm.bridge_mappings = {"physnet1": "brq999"} + self.assertTrue(self.lbm.add_tap_interface("123", + p_const.TYPE_LOCAL, + "physnet1", None, + "tap1")) + en_fn.assert_called_with("123", "brq999") get_br.return_value = False bridge_device.addif.retun_value = True @@ -765,6 +772,7 @@ class TestLinuxBridgeManager(base.BaseTestCase): self.lbm.add_tap_interface("123", p_const.TYPE_VLAN, "physnet1", "1", "tap1") en_mtu_fn.assert_called_once_with("tap1", "eth0.1") + bridge_device.addif.assert_called_once_with("tap1") def test_add_interface(self): with mock.patch.object(self.lbm, "add_tap_interface") as add_tap: