Merge "Check for hybrid plugging in OVS"
This commit is contained in:
commit
18bd440bbe
@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
feature:
|
||||||
|
- |
|
||||||
|
The unplug() method for VIFOpenVSwitch type now checks for existence of
|
||||||
|
linux bridge used in hybrid plugging mechanism. In case it exists, the
|
||||||
|
interfaces related to the hybrid plugging are deleted too. This is useful
|
||||||
|
in particular for cold migration use case when target node has updated
|
||||||
|
port binding that doesn't use hybrid plugging, while the original plugging
|
||||||
|
was hybrid.
|
@ -371,7 +371,7 @@ class OvsPlugin(plugin.PluginBase):
|
|||||||
vif.id))
|
vif.id))
|
||||||
self._delete_bridge_if_trunk(vif)
|
self._delete_bridge_if_trunk(vif)
|
||||||
|
|
||||||
def _unplug_bridge(self, vif, instance_info):
|
def _unplug_bridge(self, vif, instance_info, linux_bridge_name):
|
||||||
"""UnPlug using hybrid strategy
|
"""UnPlug using hybrid strategy
|
||||||
|
|
||||||
Unhook port from OVS, unhook port from bridge, delete
|
Unhook port from OVS, unhook port from bridge, delete
|
||||||
@ -380,7 +380,7 @@ class OvsPlugin(plugin.PluginBase):
|
|||||||
|
|
||||||
v1_name, v2_name = self.get_veth_pair_names(vif)
|
v1_name, v2_name = self.get_veth_pair_names(vif)
|
||||||
|
|
||||||
linux_net.delete_bridge(vif.bridge_name, v1_name)
|
linux_net.delete_bridge(linux_bridge_name, v1_name)
|
||||||
|
|
||||||
self.ovsdb.delete_ovs_vif_port(vif.network.bridge, v2_name)
|
self.ovsdb.delete_ovs_vif_port(vif.network.bridge, v2_name)
|
||||||
self._delete_bridge_if_trunk(vif)
|
self._delete_bridge_if_trunk(vif)
|
||||||
@ -452,9 +452,13 @@ class OvsPlugin(plugin.PluginBase):
|
|||||||
if self.config.per_port_bridge:
|
if self.config.per_port_bridge:
|
||||||
self._unplug_port_bridge(vif, instance_info)
|
self._unplug_port_bridge(vif, instance_info)
|
||||||
else:
|
else:
|
||||||
self._unplug_vif_generic(vif, instance_info)
|
linux_bridge_name = self.gen_port_name('qbr', vif.id)
|
||||||
|
if ip_lib.exists(linux_bridge_name):
|
||||||
|
self._unplug_bridge(vif, instance_info, linux_bridge_name)
|
||||||
|
else:
|
||||||
|
self._unplug_vif_generic(vif, instance_info)
|
||||||
elif isinstance(vif, objects.vif.VIFBridge):
|
elif isinstance(vif, objects.vif.VIFBridge):
|
||||||
self._unplug_bridge(vif, instance_info)
|
self._unplug_bridge(vif, instance_info, vif.bridge_name)
|
||||||
elif isinstance(vif, objects.vif.VIFVHostUser):
|
elif isinstance(vif, objects.vif.VIFVHostUser):
|
||||||
self._unplug_vhostuser(vif, instance_info)
|
self._unplug_vhostuser(vif, instance_info)
|
||||||
elif isinstance(vif, objects.vif.VIFHostDevice):
|
elif isinstance(vif, objects.vif.VIFHostDevice):
|
||||||
|
@ -640,3 +640,17 @@ class PluginTest(testtools.TestCase):
|
|||||||
]
|
]
|
||||||
delete_ovs_vif_port.assert_has_calls(calls)
|
delete_ovs_vif_port.assert_has_calls(calls)
|
||||||
delete_ovs_bridge.assert_called_once_with('pbb679325f-ca8')
|
delete_ovs_bridge.assert_called_once_with('pbb679325f-ca8')
|
||||||
|
|
||||||
|
@mock.patch.object(ip_lib, 'exists', return_value=True)
|
||||||
|
@mock.patch.object(ovs.OvsPlugin, '_unplug_bridge')
|
||||||
|
def test_unplug_hybrid_bridge(self, m_unplug_bridge, m_ip_lib_exists):
|
||||||
|
plugin = ovs.OvsPlugin.load(constants.PLUGIN_NAME)
|
||||||
|
plugin.unplug(self.vif_ovs, self.instance)
|
||||||
|
m_unplug_bridge.assert_called_once()
|
||||||
|
|
||||||
|
@mock.patch.object(ip_lib, 'exists', return_value=False)
|
||||||
|
@mock.patch.object(ovs.OvsPlugin, '_unplug_vif_generic')
|
||||||
|
def test_unplug_ovs(self, m_unplug_generic, m_ip_lib_exists):
|
||||||
|
plugin = ovs.OvsPlugin.load(constants.PLUGIN_NAME)
|
||||||
|
plugin.unplug(self.vif_ovs, self.instance)
|
||||||
|
m_unplug_generic.assert_called_once()
|
||||||
|
Loading…
Reference in New Issue
Block a user