from oslo_service import service
from six import moves
+from neutron.agent.linux import bridge_lib
from neutron.agent.linux import ip_lib
from neutron.agent.linux import utils
from neutron.agent import rpc as agent_rpc
LOG.debug("Starting bridge %(bridge_name)s for subinterface "
"%(interface)s",
{'bridge_name': bridge_name, 'interface': interface})
- if utils.execute(['brctl', 'addbr', bridge_name],
- run_as_root=True):
- return
- if utils.execute(['brctl', 'setfd', bridge_name,
- str(0)], run_as_root=True):
+ bridge_device = bridge_lib.BridgeDevice.addbr(bridge_name)
+ if bridge_device.setfd(0):
return
- if utils.execute(['brctl', 'stp', bridge_name,
- 'off'], run_as_root=True):
+ if bridge_device.disable_stp():
return
- if utils.execute(['ip', 'link', 'set', bridge_name,
- 'up'], run_as_root=True):
+ if bridge_device.link.set_up():
return
LOG.debug("Done starting bridge %(bridge_name)s for "
"subinterface %(interface)s",
{'bridge_name': bridge_name, 'interface': interface})
+ else:
+ bridge_device = bridge_lib.BridgeDevice(bridge_name)
if not interface:
return bridge_name
# Check if the interface is not enslaved in another bridge
if self.is_device_on_bridge(interface):
bridge = self.get_bridge_for_tap_device(interface)
- utils.execute(['brctl', 'delif', bridge, interface],
- run_as_root=True)
+ bridge_lib.BridgeDevice(bridge).delif(interface)
- utils.execute(['brctl', 'addif', bridge_name, interface],
- run_as_root=True)
+ bridge_device.addif(interface)
except Exception as e:
LOG.error(_LE("Unable to add %(interface)s to %(bridge_name)s"
"! Exception: %(e)s"),
'bridge_name': bridge_name}
LOG.debug("Adding device %(tap_device_name)s to bridge "
"%(bridge_name)s", data)
- if utils.execute(['brctl', 'addif', bridge_name, tap_device_name],
- run_as_root=True):
+ if bridge_lib.BridgeDevice(bridge_name).addif(tap_device_name):
return False
else:
data = {'tap_device_name': tap_device_name,
self.delete_vlan(interface)
LOG.debug("Deleting bridge %s", bridge_name)
- if utils.execute(['ip', 'link', 'set', bridge_name, 'down'],
- run_as_root=True):
+ bridge_device = bridge_lib.BridgeDevice(bridge_name)
+ if bridge_device.link.set_down():
return
- if utils.execute(['brctl', 'delbr', bridge_name],
- run_as_root=True):
+ if bridge_device.delbr():
return
LOG.debug("Done deleting bridge %s", bridge_name)
"%(bridge_name)s",
{'interface_name': interface_name,
'bridge_name': bridge_name})
- if utils.execute(['brctl', 'delif', bridge_name, interface_name],
- run_as_root=True):
+ if bridge_lib.BridgeDevice(bridge_name).delif(interface_name):
return False
LOG.debug("Done removing device %(interface_name)s from bridge "
"%(bridge_name)s",
import mock
from oslo_config import cfg
+from neutron.agent.linux import bridge_lib
from neutron.agent.linux import ip_lib
from neutron.agent.linux import utils
from neutron.common import constants
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,\
- mock.patch.object(utils, 'execute') as exec_fn,\
+ mock.patch.object(bridge_lib, "BridgeDevice",
+ return_value=bridge_device_old) as br_fn, \
mock.patch.object(self.lbm,
'update_interface_ip_details') as upd_fn,\
mock.patch.object(self.lbm,
mock.patch.object(self.lbm,
'get_bridge_for_tap_device') as get_if_br_fn:
de_fn.return_value = False
- exec_fn.return_value = False
+ br_fn.addbr.return_value = bridge_device
+ bridge_device.setfd.return_value = False
+ bridge_device.disable_stp.return_value = False
+ bridge_device.link.set_up.return_value = False
self.assertEqual(self.lbm.ensure_bridge("br0", None), "br0")
ie_fn.return_Value = False
self.lbm.ensure_bridge("br0", "eth0")
upd_fn.assert_called_with("br0", "eth0", "ips", "gateway")
ie_fn.assert_called_with("br0", "eth0")
- exec_fn.side_effect = Exception()
de_fn.return_value = True
+ bridge_device.delif.side_effect = Exception()
self.lbm.ensure_bridge("br0", "eth0")
ie_fn.assert_called_with("br0", "eth0")
- exec_fn.reset_mock()
- exec_fn.side_effect = None
de_fn.return_value = True
ie_fn.return_value = False
get_if_br_fn.return_value = "br1"
self.lbm.ensure_bridge("br0", "eth0")
- expected = [
- mock.call(['brctl', 'delif', 'br1', 'eth0'],
- run_as_root=True),
- mock.call(['brctl', 'addif', 'br0', 'eth0'],
- run_as_root=True),
- ]
- exec_fn.assert_has_calls(expected)
+ bridge_device_old.delif.assert_called_once_with('eth0')
+ br_fn.return_value.addif.assert_called_once_with('eth0')
def test_ensure_physical_in_bridge(self):
self.assertFalse(
)
de_fn.return_value = True
+ bridge_device = mock.Mock()
with mock.patch.object(self.lbm, "ensure_local_bridge") as en_fn,\
- mock.patch.object(utils, "execute") as exec_fn,\
+ mock.patch.object(bridge_lib, "BridgeDevice",
+ return_value=bridge_device), \
mock.patch.object(self.lbm,
"get_bridge_for_tap_device") as get_br:
- exec_fn.return_value = False
+ bridge_device.addif.retun_value = False
get_br.return_value = True
self.assertTrue(self.lbm.add_tap_interface("123",
p_const.TYPE_LOCAL,
en_fn.assert_called_with("123")
get_br.return_value = False
- exec_fn.return_value = True
+ bridge_device.addif.retun_value = True
self.assertFalse(self.lbm.add_tap_interface("123",
p_const.TYPE_LOCAL,
"physnet1", None,
"1", "tap234")
def test_delete_vlan_bridge(self):
+ bridge_device = mock.Mock()
with mock.patch.object(ip_lib, "device_exists") as de_fn,\
mock.patch.object(self.lbm,
"get_interfaces_on_bridge") as getif_fn,\
mock.patch.object(self.lbm,
"update_interface_ip_details") as updif_fn,\
mock.patch.object(self.lbm, "delete_vxlan") as del_vxlan,\
- mock.patch.object(utils, "execute") as exec_fn:
+ mock.patch.object(bridge_lib, "BridgeDevice",
+ return_value=bridge_device):
de_fn.return_value = False
self.lbm.delete_vlan_bridge("br0")
self.assertFalse(getif_fn.called)
de_fn.return_value = True
getif_fn.return_value = ["eth0", "eth1", "vxlan-1002"]
if_det_fn.return_value = ("ips", "gateway")
- exec_fn.return_value = False
+ bridge_device.link.set_down.return_value = False
self.lbm.delete_vlan_bridge("br0")
updif_fn.assert_called_with("eth1", "br0", "ips", "gateway")
del_vxlan.assert_called_with("vxlan-1002")
def test_delete_vlan_bridge_with_ip(self):
+ bridge_device = mock.Mock()
with mock.patch.object(ip_lib, "device_exists") as de_fn,\
mock.patch.object(self.lbm,
"get_interfaces_on_bridge") as getif_fn,\
mock.patch.object(self.lbm,
"update_interface_ip_details") as updif_fn,\
mock.patch.object(self.lbm, "delete_vlan") as del_vlan,\
- mock.patch.object(utils, "execute") as exec_fn:
+ mock.patch.object(bridge_lib, "BridgeDevice",
+ return_value=bridge_device):
de_fn.return_value = True
getif_fn.return_value = ["eth0", "eth1.1"]
if_det_fn.return_value = ("ips", "gateway")
- exec_fn.return_value = False
+ bridge_device.link.set_down.return_value = False
self.lbm.delete_vlan_bridge("br0")
updif_fn.assert_called_with("eth1.1", "br0", "ips", "gateway")
self.assertFalse(del_vlan.called)
def test_delete_vlan_bridge_no_ip(self):
+ bridge_device = mock.Mock()
with mock.patch.object(ip_lib, "device_exists") as de_fn,\
mock.patch.object(self.lbm,
"get_interfaces_on_bridge") as getif_fn,\
mock.patch.object(self.lbm,
"update_interface_ip_details") as updif_fn,\
mock.patch.object(self.lbm, "delete_vlan") as del_vlan,\
- mock.patch.object(utils, "execute") as exec_fn:
+ mock.patch.object(bridge_lib, "BridgeDevice",
+ return_value=bridge_device):
de_fn.return_value = True
getif_fn.return_value = ["eth0", "eth1.1"]
- exec_fn.return_value = False
+ bridge_device.link.set_down.return_value = False
if_det_fn.return_value = ([], None)
self.lbm.delete_vlan_bridge("br0")
del_vlan.assert_called_with("eth1.1")
lbm = linuxbridge_neutron_agent.LinuxBridgeManager(
interface_mappings)
+ bridge_device = mock.Mock()
with mock.patch.object(ip_lib, "device_exists") as de_fn,\
mock.patch.object(lbm,
"get_interfaces_on_bridge") as getif_fn,\
mock.patch.object(lbm, "remove_interface"),\
mock.patch.object(lbm, "delete_vxlan") as del_vxlan,\
- mock.patch.object(utils, "execute") as exec_fn:
+ mock.patch.object(bridge_lib, "BridgeDevice",
+ return_value=bridge_device):
de_fn.return_value = False
lbm.delete_vlan_bridge("br0")
self.assertFalse(getif_fn.called)
de_fn.return_value = True
getif_fn.return_value = ["vxlan-1002"]
- exec_fn.return_value = False
+ bridge_device.link.set_down.return_value = False
lbm.delete_vlan_bridge("br0")
del_vxlan.assert_called_with("vxlan-1002")
del_br_fn.assert_called_once_with('brqnet1')
def test_remove_interface(self):
+ bridge_device = mock.Mock()
with mock.patch.object(ip_lib, "device_exists") as de_fn,\
mock.patch.object(self.lbm,
"is_device_on_bridge") as isdev_fn,\
- mock.patch.object(utils, "execute") as exec_fn:
+ mock.patch.object(bridge_lib, "BridgeDevice",
+ return_value=bridge_device):
de_fn.return_value = False
self.assertFalse(self.lbm.remove_interface("br0", "eth0"))
self.assertFalse(isdev_fn.called)
self.assertTrue(self.lbm.remove_interface("br0", "eth0"))
isdev_fn.return_value = True
- exec_fn.return_value = True
+ bridge_device.delif.return_value = True
self.assertFalse(self.lbm.remove_interface("br0", "eth0"))
- exec_fn.return_value = False
+ bridge_device.delif.return_value = False
self.assertTrue(self.lbm.remove_interface("br0", "eth0"))
def test_delete_vlan(self):
self.assertFalse(exec_fn.called)
de_fn.return_value = True
- exec_fn.return_value = False
+ exec_fn.return_value = True
self.lbm.delete_vlan("eth1.1")
self.assertTrue(exec_fn.called)