]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Fix adding tap failure if bridge mapping is not provided
authorKahou Lei <kahou82@gmail.com>
Sun, 13 Sep 2015 01:48:04 +0000 (18:48 -0700)
committerKahou Lei <kahou82@gmail.com>
Sat, 19 Sep 2015 05:12:03 +0000 (05:12 +0000)
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

neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py
neutron/tests/unit/plugins/ml2/drivers/linuxbridge/agent/test_linuxbridge_neutron_agent.py

index 175a81c83f2e9ef9e320cd5b09ede1c5136f95f5..30280a384daf0c93cfd6ee2d138803744a3d5297 100644 (file)
@@ -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)
index 2ac4b3870ca55c8ff9834bedf2b50456880ba7f5..e6a0e2320ff875fff8b3dc37561d51b8f33ed6e8 100644 (file)
@@ -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: