Bridge device can be configured by iproute for quite a long time and brctl
is getting deprecated in recent distributions.
This patch replaces brctl with iproute alternative when creating a bridge
device. For bridge port addition and removal both brctl and iproute method
is provided depending on brctl availability.
Tested on RHEL6, RHEL7 and Fedora28.
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
---
lnst/Slave/NetConfigDevice.py | 26 +++++++++++++++++++++-----
lnst/Slave/NmConfigDevice.py | 2 +-
2 files changed, 22 insertions(+), 6 deletions(-)
diff --git a/lnst/Slave/NetConfigDevice.py b/lnst/Slave/NetConfigDevice.py
index 03efd40..ab28a0f 100644
--- a/lnst/Slave/NetConfigDevice.py
+++ b/lnst/Slave/NetConfigDevice.py
@@ -18,6 +18,7 @@ from lnst.Slave.NetConfigCommon import get_slaves, get_option,
get_slave_option
from lnst.Slave.NetConfigCommon import parse_netem, get_slave_options
from lnst.Common.Utils import bool_it
from lnst.Common.Utils import check_process_running
+from lnst.Common.Utils import is_installed
from lnst.Slave.NmConfigDevice import type_class_mapping as nm_type_class_mapping
from lnst.Slave.NmConfigDevice import is_nm_managed
@@ -267,7 +268,8 @@ class NetConfigDeviceBridge(NetConfigDeviceGeneric):
_modulename = "bridge"
def _add_rm_bridge(self, prefix):
- exec_cmd("brctl %sbr %s " % (prefix,
self._dev_config["name"]))
+ exec_cmd("ip link %s %s type bridge " % (prefix,
+ self._dev_config["name"]))
def _get_bridge_dir(self):
return "/sys/class/net/%s/bridge" % self._dev_config["name"]
@@ -282,14 +284,28 @@ class NetConfigDeviceBridge(NetConfigDeviceGeneric):
self._get_bridge_dir(),
option))
- def _add_rm_port(self, prefix, slave_id):
+ def _add_rm_port_iproute(self, action, slave_id):
port_name = self._if_manager.get_mapped_device(slave_id).get_name()
- exec_cmd("brctl %sif %s %s" % (prefix,
self._dev_config["name"],
+ if action == "add":
+ exec_cmd("ip link set %s master %s" % (port_name,
+ self._dev_config["name"]))
+ elif action == "del":
+ exec_cmd("ip link set %s nomaster" % port_name)
+
+ def _add_rm_port_brctl(self, action, slave_id):
+ port_name = self._if_manager.get_mapped_device(slave_id).get_name()
+ exec_cmd("brctl %sif %s %s" % (action,
self._dev_config["name"],
port_name))
- def _add_rm_ports(self, prefix):
+ def _add_rm_port(self, action, slave_id):
+ if is_installed("brctl"):
+ self._add_rm_port_brctl(action, slave_id)
+ else:
+ self._add_rm_port_iproute(action, slave_id)
+
+ def _add_rm_ports(self, action):
for slave_id in get_slaves(self._dev_config):
- self._add_rm_port(prefix, slave_id)
+ self._add_rm_port(action, slave_id)
def create(self):
self._add_rm_bridge("add")
diff --git a/lnst/Slave/NmConfigDevice.py b/lnst/Slave/NmConfigDevice.py
index 29c2c75..2c04948 100644
--- a/lnst/Slave/NmConfigDevice.py
+++ b/lnst/Slave/NmConfigDevice.py
@@ -614,7 +614,7 @@ class NmConfigDeviceBridge(NmConfigDeviceGeneric):
if get_nm_version() < "0.9.9":
try:
exec_cmd("ip link set %s down" % config["name"])
- exec_cmd("brctl delbr %s " % config["name"])
+ exec_cmd("ip link del %s type bridge" %
config["name"])
except:
pass
--
2.14.4