From: Ondrej Lichtner <olichtne(a)redhat.com>
Created a new _ipr_wrapper method that wraps any kind of IPRoute()
object use that we need in the Device classes.
Renamed the _nl_sync method to _nl_link_sync to indicate that this
method handles IPRoute().link methods specifically. This differentiates
it a little better from the related IPRoute().addr methods used for
manipulating IPs of a device.
Centralized error handling into the new _ipr_wrapper method to improve
consistency of the logs.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst/Devices/BondDevice.py | 52 +++++++++----------
lnst/Devices/BridgeDevice.py | 6 +--
lnst/Devices/Device.py | 95 ++++++++++++++---------------------
lnst/Devices/MacvlanDevice.py | 4 +-
lnst/Devices/SoftDevice.py | 2 +-
lnst/Devices/VethDevice.py | 2 +-
lnst/Devices/VlanDevice.py | 4 +-
lnst/Devices/VtiDevice.py | 10 ++--
lnst/Devices/VxlanDevice.py | 10 ++--
9 files changed, 83 insertions(+), 102 deletions(-)
diff --git a/lnst/Devices/BondDevice.py b/lnst/Devices/BondDevice.py
index 07fd124..ce01427 100644
--- a/lnst/Devices/BondDevice.py
+++ b/lnst/Devices/BondDevice.py
@@ -34,7 +34,7 @@ def active_slave(self, val):
raise DeviceConfigError("Invalid value, must be Device.")
self._set_linkinfo_data_attr("IFLA_BOND_ACTIVE_SLAVE", val.ifindex)
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def ad_actor_sys_prio(self):
@@ -50,7 +50,7 @@ def ad_actor_sys_prio(self, val):
raise DeviceConfigError("Invalid value, must be 1-65535.")
self._set_linkinfo_data_attr("IFLA_BOND_AD_ACTOR_SYS_PRIO", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def ad_actor_system(self):
@@ -64,7 +64,7 @@ def ad_actor_system(self):
def ad_actor_system(self, val):
val = hwaddress(val)
self._set_linkinfo_data_attr("IFLA_BOND_AD_ACTOR_SYSTEM", val)
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def ad_select(self):
@@ -84,7 +84,7 @@ def ad_select(self, val):
raise DeviceConfigError("Invalid value, must be in {} or {}.".
format(list(m.keys()), list(m.values())))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def ad_user_port_key(self):
@@ -96,7 +96,7 @@ def ad_user_port_key(self):
@ad_user_port_key.setter
def ad_user_port_key(self, val):
self._set_linkinfo_data_attr("IFLA_BOND_AD_PORT_KEY", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def all_slaves_active(self):
@@ -105,7 +105,7 @@ def all_slaves_active(self):
@all_slaves_active.setter
def all_slaves_active(self, val):
self._set_linkinfo_data_attr("IFLA_BOND_ALL_SLAVES_ACTIVE", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def arp_interval(self):
@@ -114,7 +114,7 @@ def arp_interval(self):
@arp_interval.setter
def arp_interval(self, val):
self._set_linkinfo_data_attr("IFLA_BOND_ARP_INTERVAL", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def arp_ip_target(self):
@@ -142,7 +142,7 @@ def arp_ip_target(self, val):
ip_str = ",".join(new)
self._set_linkinfo_data_attr("IFLA_BOND_ARP_IP_TARGET", ip_str)
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def arp_validate(self):
@@ -161,7 +161,7 @@ def arp_validate(self, val):
raise DeviceConfigError("Invalid value, must be in {} or {}.".
format(list(m.keys()), list(m.values())))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def arp_all_targets(self):
@@ -179,7 +179,7 @@ def arp_all_targets(self, val):
raise DeviceConfigError("Invalid value, must be in {} or {}.".
format(list(m.keys()), list(m.values())))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def downdelay(self):
@@ -188,7 +188,7 @@ def downdelay(self):
@downdelay.setter
def downdelay(self, val):
self._set_linkinfo_data_attr("IFLA_BOND_DOWNDELAY", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def fail_over_mac(self):
@@ -206,7 +206,7 @@ def fail_over_mac(self, val):
raise DeviceConfigError("Invalid value, must be in {} or {}.".
format(list(m.keys()), list(m.values())))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def lacp_rate(self):
@@ -224,7 +224,7 @@ def lacp_rate(self, val):
raise DeviceConfigError("Invalid value, must be in {} or {}.".
format(list(m.keys()), list(m.values())))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def miimon(self):
@@ -233,7 +233,7 @@ def miimon(self):
@miimon.setter
def miimon(self, val):
self._set_linkinfo_data_attr("IFLA_BOND_LACP_RATE", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def min_links(self):
@@ -242,7 +242,7 @@ def min_links(self):
@min_links.setter
def min_links(self, val):
self._set_linkinfo_data_attr("IFLA_BOND_MIN_LINKS", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def mode(self):
@@ -261,7 +261,7 @@ def mode(self, val):
raise DeviceConfigError("Invalid value, must be in {} or {}.".
format(list(m.keys()), list(m.values())))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def num_peer_notif(self):
@@ -273,7 +273,7 @@ def num_peer_notif(self, val):
raise DeviceConfigError("Invalid value, must be 0-255.")
self._set_linkinfo_data_attr("IFLA_BOND_NUM_PEER_NOTIF", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def packets_per_slave(self):
@@ -285,7 +285,7 @@ def packets_per_slave(self, val):
raise DeviceConfigError("Invalid value, must be 0-65535.")
self._set_linkinfo_data_attr("IFLA_BOND_PACKETS_PER_SLAVE", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def primary(self):
@@ -301,7 +301,7 @@ def primary(self, val):
raise DeviceConfigError("Invalid value, must be Device.")
self._set_linkinfo_data_attr("IFLA_BOND_PRIMARY", val.ifindex)
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def primary_reselect(self):
@@ -319,7 +319,7 @@ def primary_reselect(self, val):
raise DeviceConfigError("Invalid value, must be in {} or {}.".
format(list(m.keys()), list(m.values())))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def tlb_dynamic_lb(self):
@@ -328,7 +328,7 @@ def tlb_dynamic_lb(self):
@tlb_dynamic_lb.setter
def tlb_dynamic_lb(self, val):
self._set_linkinfo_data_attr("IFLA_BOND_TLB_DYNAMIC_LB", bool(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def updelay(self):
@@ -337,7 +337,7 @@ def updelay(self):
@updelay.setter
def updelay(self, val):
self._set_linkinfo_data_attr("IFLA_BOND_UPDELAY", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def use_carrier(self):
@@ -346,7 +346,7 @@ def use_carrier(self):
@use_carrier.setter
def use_carrier(self, val):
self._set_linkinfo_data_attr("IFLA_BOND_USE_CARRIER", bool(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def xmit_hash_policy(self):
@@ -360,7 +360,7 @@ def xmit_hash_policy(self, val):
self._set_linkinfo_data_attr("IFLA_BOND_XMIT_HASH_POLICY", val)
else:
raise DeviceConfigError("Invalid value, must be in
{}}.".format(m))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def resend_igmp(self):
@@ -372,7 +372,7 @@ def resend_igmp(self, val):
raise DeviceConfigError("Invalid value, must be 0-255.")
self._set_linkinfo_data_attr("IFLA_BOND_RESEND_IGMP", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def lp_interval(self):
@@ -384,4 +384,4 @@ def lp_interval(self, val):
raise DeviceConfigError("Invalid value, must be 1-0x7fffffff.")
self._set_linkinfo_data_attr("IFLA_BOND_LP_INTERVAL", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
diff --git a/lnst/Devices/BridgeDevice.py b/lnst/Devices/BridgeDevice.py
index 817235b..364ffac 100644
--- a/lnst/Devices/BridgeDevice.py
+++ b/lnst/Devices/BridgeDevice.py
@@ -24,7 +24,7 @@ def ageing_time(self):
@ageing_time.setter
def ageing_time(self, val):
self._set_linkinfo_data_attr("IFLA_BR_AGEING_TIME", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def stp_state(self):
@@ -33,7 +33,7 @@ def stp_state(self):
@stp_state.setter
def stp_state(self, val):
self._set_linkinfo_data_attr("IFLA_BR_STP_STATE", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def vlan_filtering(self):
@@ -42,4 +42,4 @@ def vlan_filtering(self):
@vlan_filtering.setter
def vlan_filtering(self, val):
self._set_linkinfo_data_attr("IFLA_BR_VLAN_FILTERING", bool(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
diff --git a/lnst/Devices/Device.py b/lnst/Devices/Device.py
index 39d1dd2..e10aa95 100644
--- a/lnst/Devices/Device.py
+++ b/lnst/Devices/Device.py
@@ -60,7 +60,7 @@ def __init__(self, if_manager):
self._ip_addrs = []
- self._nl_update = {}
+ self._nl_link_update = {}
self._bulk_enabled = False
self._cleanup_data = None
@@ -83,7 +83,7 @@ def _set_nested_nl_attr(self, msg, value, *args):
raise DeviceError("Error constructing nested nl msg.")
def _update_attr(self, value, *args):
- self._set_nested_nl_attr(self._nl_update, value, *args)
+ self._set_nested_nl_attr(self._nl_link_update, value, *args)
def _process_nested_nl_attrs(self, msg):
ret = {}
@@ -95,33 +95,42 @@ def _process_nested_nl_attrs(self, msg):
ret[k] = v
return ret
- def _nl_sync(self, op, ipr_attrs=None, bulk=False):
+ def _nl_link_sync(self, op, ipr_attrs=None, bulk=False):
if self._bulk_enabled and not bulk:
return
if ipr_attrs is None:
- attrs = self._process_nested_nl_attrs(self._nl_update)
+ attrs = self._process_nested_nl_attrs(self._nl_link_update)
else:
attrs = self._process_nested_nl_attrs(ipr_attrs)
+ if op == "add":
+ self._ipr_wrapper("link", op, **attrs)
+ else:
+ self._ipr_wrapper("link", op, index=self.ifindex, **attrs)
+
+ if ipr_attrs is None:
+ self._nl_link_update = {}
+
+ def _ipr_wrapper(self, obj_name, op_name, *args, **kwargs):
+ pretty_attrs = pprint.pformat({"args": args, "kwargs":
kwargs})
+ logging.debug("Performing pyroute.IPRoute().{}({}, *args,
**kwargs)".format(obj_name, op_name))
+ logging.debug("{}".format(pretty_attrs))
+
+ ret_val = None
with pyroute2.IPRoute() as ipr:
try:
- pretty_attrs = pprint.pformat(attrs)
- logging.debug("Performing Netlink operation {},
data:".format(op))
- logging.debug("{}".format(pretty_attrs))
-
- if op == "add":
- ipr.link(op, **attrs)
+ obj = getattr(ipr, obj_name)
+ if op_name is not None:
+ ret_val = obj(op_name, *args, **kwargs)
else:
- ipr.link(op, index=self.ifindex, **attrs)
+ ret_val = obj(*args, **kwargs)
self._if_manager.rescan_devices()
except Exception as e:
log_exc_traceback()
- raise DeviceConfigError("Operation {} on link {} failed: {}"
- .format(op, self.name, str(e)))
-
- if ipr_attrs is None:
- self._nl_update = {}
+ raise DeviceConfigError("Object {} operation {} on link {} failed:
{}"
+ .format(obj_name, op_name, self.name, str(e)))
+ return ret_val
def _enable(self):
"""Enables the Device object"""
@@ -351,7 +360,7 @@ def name(self, new_name):
new_name -- the new name of the interface.
"""
self._update_attr(new_name, "IFLA_IFNAME")
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def hwaddr(self):
@@ -371,7 +380,7 @@ def hwaddr(self, addr):
"""
addr = hwaddress(addr)
self._update_attr(str(addr), "IFLA_ADDRESS")
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def adaptive_rx_coalescing(self):
@@ -431,7 +440,7 @@ def mtu(self, value):
Args:
value -- the new MTU."""
self._update_attr(int(value), "IFLA_MTU")
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def master(self):
@@ -461,7 +470,7 @@ def master(self, dev):
raise DeviceError("Invalid dev argument.")
self._update_attr(master_idx, "IFLA_MASTER")
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def driver(self):
@@ -515,14 +524,8 @@ def _clear_ips(self):
def _ip_add_one(self, addr):
ip = ipaddress(addr)
if ip not in self.ips:
- with pyroute2.IPRoute() as ipr:
- try:
- ipr.addr("add", index=self.ifindex, address=str(ip),
- mask=ip.prefixlen)
- self._if_manager.handle_netlink_msgs()
- except pyroute2.netlink.NetlinkError:
- log_exc_traceback()
- raise DeviceConfigValueError("Invalid IP address")
+ self._ipr_wrapper("addr", "add", index=self.ifindex,
+ address=str(ip), mask=ip.prefixlen)
def ip_add(self, addr):
"""add an ip address or a list of ip addresses
@@ -542,14 +545,8 @@ def ip_add(self, addr):
def _ip_del_one(self, addr):
ip = ipaddress(addr)
if ip in self.ips:
- with pyroute2.IPRoute() as ipr:
- try:
- ipr.addr("del", index=self.ifindex, address=str(ip),
- mask=ip.prefixlen)
- self._if_manager.handle_netlink_msgs()
- except pyroute2.netlink.NetlinkError:
- log_exc_traceback()
- raise DeviceConfigValueError("Invalid IP address")
+ self._ipr_wrapper("addr", "del", index=self.ifindex,
+ address=str(ip), mask=ip.prefixlen)
def ip_del(self, addr):
"""remove an ip address or a list of ip addresses
@@ -567,13 +564,7 @@ def ip_del(self, addr):
def ip_flush(self, scope=0):
"""flush all ip addresses of the device"""
- with pyroute2.IPRoute() as ipr:
- try:
- ipr.flush_addr(index=self.ifindex, scope=scope)
- self._if_manager.handle_netlink_msgs()
- except pyroute2.netlink.NetlinkError:
- log_exc_traceback()
- raise DeviceConfigError("IP address flush failed")
+ self._ipr_wrapper("flush_addr", None, index=self.ifindex, scope=scope)
def ips_filter(self, **selectors):
result = []
@@ -592,23 +583,13 @@ def ips_filter(self, **selectors):
def up(self):
"""set device up"""
- with pyroute2.IPRoute() as ipr:
- try:
- ipr.link("set", index=self.ifindex, state="up")
- self._if_manager.handle_netlink_msgs()
- except pyroute2.netlink.NetlinkError:
- log_exc_traceback()
- raise DeviceConfigError("Setting link up failed.")
+ self._nl_link_update["state"] = "up"
+ self._nl_link_sync("set")
def down(self):
"""set device down"""
- with pyroute2.IPRoute() as ipr:
- try:
- ipr.link("set", index=self.ifindex, state="down")
- self._if_manager.handle_netlink_msgs()
- except pyroute2.netlink.NetlinkError:
- log_exc_traceback()
- raise DeviceConfigError("Setting link down failed.")
+ self._nl_link_update["state"] = "down"
+ self._nl_link_sync("set")
#TODO looks like python ethtool module doesn't support these so we'll keep
#exec_cmd for now...
diff --git a/lnst/Devices/MacvlanDevice.py b/lnst/Devices/MacvlanDevice.py
index 8408efa..be163bb 100644
--- a/lnst/Devices/MacvlanDevice.py
+++ b/lnst/Devices/MacvlanDevice.py
@@ -33,7 +33,7 @@ def realdev(self, val):
raise DeviceConfigError("Value must be a Device object.")
self._update_attr(val.ifindex, "IFLA_LINK")
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def mode(self):
@@ -42,4 +42,4 @@ def mode(self):
@mode.setter
def mode(self, val):
self._set_linkinfo_data_attr("IFLA_MACVLAN_MODE", str(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
diff --git a/lnst/Devices/SoftDevice.py b/lnst/Devices/SoftDevice.py
index c5a1219..7a92c24 100644
--- a/lnst/Devices/SoftDevice.py
+++ b/lnst/Devices/SoftDevice.py
@@ -62,7 +62,7 @@ def _get_linkinfo_data_attr(self, attr_name):
def _create(self):
self._update_attr(self._link_type, "IFLA_LINKINFO",
"IFLA_INFO_KIND")
try:
- self._nl_sync("add", bulk=True)
+ self._nl_link_sync("add", bulk=True)
except Exception as e:
log_exc_traceback()
raise DeviceConfigError("Creating link {} failed: {}".format(
diff --git a/lnst/Devices/VethDevice.py b/lnst/Devices/VethDevice.py
index 7538202..af16f64 100644
--- a/lnst/Devices/VethDevice.py
+++ b/lnst/Devices/VethDevice.py
@@ -52,7 +52,7 @@ def peer_name(self, val):
else:
self._update_attr(str(val), "IFLA_LINKINFO",
"IFLA_INFO_DATA",
"VETH_INFO_PEER", "IFLA_IFNAME")
- self._nl_sync("set")
+ self._nl_link_sync("set")
class PairedVethDevice(VethDevice):
def __init__(self, ifmanager, *args, **kwargs):
diff --git a/lnst/Devices/VlanDevice.py b/lnst/Devices/VlanDevice.py
index b1224c9..a5652fb 100644
--- a/lnst/Devices/VlanDevice.py
+++ b/lnst/Devices/VlanDevice.py
@@ -36,7 +36,7 @@ def realdev(self, val):
raise DeviceConfigError("realdev value must be a Device object.")
self._update_attr(val.ifindex, "IFLA_LINK")
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def vlan_id(self):
@@ -51,4 +51,4 @@ def vlan_id(self, val):
raise DeviceConfigError("Invalid value, must be 1-4095.")
self._set_linkinfo_data_attr("IFLA_VLAN_ID", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
diff --git a/lnst/Devices/VtiDevice.py b/lnst/Devices/VtiDevice.py
index 2c0fb91..cf568e8 100644
--- a/lnst/Devices/VtiDevice.py
+++ b/lnst/Devices/VtiDevice.py
@@ -46,7 +46,7 @@ def ikey(self):
@ikey.setter
def ikey(self, val):
self._set_linkinfo_data_attr("IFLA_VTI_IKEY", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def okey(self):
@@ -58,7 +58,7 @@ def okey(self):
@okey.setter
def okey(self, val):
self._set_linkinfo_data_attr("IFLA_VTI_OKEY", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def local(self):
@@ -70,7 +70,7 @@ def local(self):
@local.setter
def local(self, val):
self._set_linkinfo_data_attr("IFLA_VTI_LOCAL", str(ipaddress(val)))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def remote(self):
@@ -82,7 +82,7 @@ def remote(self):
@remote.setter
def remote(self, val):
self._set_linkinfo_data_attr("IFLA_VTI_REMOTE", str(ipaddress(val)))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def realdev(self):
@@ -98,7 +98,7 @@ def realdev(self, val):
raise DeviceConfigError("realdev value must be a Device object.")
self._set_linkinfo_data_attr("IFLA_VTI_LINK", val.ifindex)
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def vti_type(self):
diff --git a/lnst/Devices/VxlanDevice.py b/lnst/Devices/VxlanDevice.py
index 780d1b2..c317913 100644
--- a/lnst/Devices/VxlanDevice.py
+++ b/lnst/Devices/VxlanDevice.py
@@ -53,7 +53,7 @@ def realdev(self, val):
raise DeviceConfigError("realdev value must be a Device object.")
self._set_linkinfo_data_attr("IFLA_VXLAN_LINK", val.ifindex)
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def vxlan_id(self):
@@ -68,7 +68,7 @@ def vxlan_id(self, val):
raise DeviceConfigError("Invalid value, must be 0-16777215.")
self._set_linkinfo_data_attr("IFLA_VXLAN_ID", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def group(self):
@@ -80,7 +80,7 @@ def group(self):
@group.setter
def group(self, val):
self._set_linkinfo_data_attr("IFLA_VXLAN_GROUP", str(ipaddress(val)))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def remote(self):
@@ -92,7 +92,7 @@ def remote(self):
@remote.setter
def remote(self, val):
self._set_linkinfo_data_attr("IFLA_VXLAN_GROUP", str(ipaddress(val)))
- self._nl_sync("set")
+ self._nl_link_sync("set")
@property
def dst_port(self):
@@ -101,4 +101,4 @@ def dst_port(self):
@dst_port.setter
def dst_port(self, val):
self._set_linkinfo_data_attr("IFLA_VXLAN_PORT", int(val))
- self._nl_sync("set")
+ self._nl_link_sync("set")
--
2.22.0