Tue, Jul 19, 2016 at 10:46:53AM CEST, olichtne(a)redhat.com wrote:
On Fri, Jul 15, 2016 at 02:06:36PM +0200, Jiri Pirko wrote:
> From: Jiri Pirko <jiri(a)mellanox.com>
>
> Use pyroute2 to get list of devlink ports.
>
> Signed-off-by: Jiri Pirko <jiri(a)mellanox.com>
> ---
> v1->v2:
> - Fixed self._devices loop
> - Added devlink info update to handle_netlink_msgs
> ---
> lnst/Slave/DevlinkManager.py | 63 ++++++++++++++++++++++++++++++++++++++++++
> lnst/Slave/InterfaceManager.py | 20 +++++++++++++-
> 2 files changed, 82 insertions(+), 1 deletion(-)
> create mode 100644 lnst/Slave/DevlinkManager.py
>
> diff --git a/lnst/Slave/DevlinkManager.py b/lnst/Slave/DevlinkManager.py
> new file mode 100644
> index 0000000..13662bc
> --- /dev/null
> +++ b/lnst/Slave/DevlinkManager.py
> @@ -0,0 +1,63 @@
> +"""
> +This module defines the DevlinkManager class that contains a database of
> +the available devlink devices, handles netlink messages updating these devices.
> +
> +Copyright 2016 Mellanox Technologies. All rights reserved.
> +Licensed under the GNU General Public License, version 2 as
> +published by the Free Software Foundation; see COPYING for details.
> +"""
> +
> +__author__ = """
> +jiri(a)mellanox.com (Jiri Pirko)
> +"""
> +
> +try:
> + from pyroute2 import DL
> + from pyroute2.netlink.exceptions import NetlinkError
> +
> + def dl_open():
> + try:
> + return DL()
> + except NetlinkError:
> + return None
> +
> +except ImportError:
> + class DL(object):
> + def port_list(self):
> + return []
> +
> + def close(self):
> + return
> +
> + def dl_open():
> + return DL()
> +
> +class DevlinkManager(object):
> + def __init__(self):
> + self.rescan_ports()
> +
> + def rescan_ports(self):
> + self._ports = []
> +
> + dl = dl_open()
> + if not dl:
> + return
> +
> + try:
> + for q in dl.port_list():
> + dl_port = {}
> + dl_port["bus_name"] =
q.get_attr('DEVLINK_ATTR_BUS_NAME')
> + dl_port["dev_name"] =
q.get_attr('DEVLINK_ATTR_DEV_NAME')
> + dl_port["port_index"] =
q.get_attr('DEVLINK_ATTR_PORT_INDEX')
> + dl_port["port_netdev_name"] =
q.get_attr('DEVLINK_ATTR_PORT_NETDEV_NAME')
> + self._ports.append(dl_port)
> + except:
> + raise
> + finally:
> + dl.close()
> +
> + def get_port(self, ifname):
> + for dl_port in self._ports:
> + if dl_port["port_netdev_name"] == ifname:
> + return dl_port
> + return None
> diff --git a/lnst/Slave/InterfaceManager.py b/lnst/Slave/InterfaceManager.py
> index 5852254..4fb0919 100644
> --- a/lnst/Slave/InterfaceManager.py
> +++ b/lnst/Slave/InterfaceManager.py
> @@ -21,6 +21,7 @@ from lnst.Common.NetUtils import normalize_hwaddr
> from lnst.Common.NetUtils import scan_netdevs
> from lnst.Common.ExecCmd import exec_cmd
> from lnst.Common.ConnectionHandler import recv_data
> +from lnst.Slave.DevlinkManager import DevlinkManager
> from pyroute2 import IPRSocket
> from pyroute2.netlink.rtnl import RTNLGRP_IPV4_IFADDR
> from pyroute2.netlink.rtnl import RTNLGRP_IPV6_IFADDR
> @@ -50,6 +51,8 @@ class InterfaceManager(object):
> self._nl_socket = IPRSocket()
> self._nl_socket.bind(groups=NL_GROUPS)
>
> + self._dl_manager = DevlinkManager()
> +
> self.rescan_devices()
>
> self._server_handler = server_handler
> @@ -129,9 +132,19 @@ class InterfaceManager(object):
> self._server_handler.send_data_to_ctl(del_msg)
> del self._devices[i]
>
> + self._dl_manager.rescan_ports()
> + for device in self._devices.values():
> + dl_port = self._dl_manager.get_port(device.get_name())
> + device.set_devlink(dl_port)
> +
> def handle_netlink_msgs(self, msgs):
> for msg in msgs:
> self._handle_netlink_msg(msg)
> +
There's trailing whatespaces in the line above. But you can fix that
when pushing.
Will do. Thanks.
>
>> + self._dl_manager.rescan_ports()
>> + for device in self._devices.values():
>> + dl_port = self._dl_manager.get_port(device.get_name())
>> + device.set_devlink(dl_port)
>>
>> def _handle_netlink_msg(self, msg):
>> if msg['header']['type'] in [RTM_NEWLINK, RTM_NEWADDR,
RTM_DELADDR]:
>> @@ -354,9 +367,13 @@ class Device(object):
>> self._peer = None
>> self._mtu = None
>> self._driver = None
>> + self._devlink = None
>>
>> self._if_manager = if_manager
>>
>> + def set_devlink(self, devlink_port_data):
>> + self._devlink = devlink_port_data
>> +
>> def init_netlink(self, nl_msg):
>> self._if_index = nl_msg['index']
>> self._ifi_type = nl_msg['ifi_type']
>> @@ -672,7 +689,8 @@ class Device(object):
>> "netns": self._netns,
>> "peer": self._peer.get_if_index() if self._peer
else None,
>> "mtu": self._mtu,
>> - "driver": self._driver}
>> + "driver": self._driver,
>> + "devlink": self._devlink}
>> return if_data
>>
>> def set_speed(self, speed):
>> --
>> 2.5.5
>> _______________________________________________
>> LNST-developers mailing list
>> lnst-developers(a)lists.fedorahosted.org
>>
https://lists.fedorahosted.org/admin/lists/lnst-developers@lists.fedoraho...
>
>Everything else looks good to me.
>Ack for pushing.
>
>Acked-by: Ondrej Lichtner <olichtne(a)redhat.com>