Antoni Segura Puimedon has uploaded a new change for review. Change subject: Reduce calling to ethtool. ......................................................................
Reduce calling to ethtool. Currently we do separate ethtool device object retrieval for getaddr, getnetmask and getipv6addrs. This patch unifies it into a single getIpInfo while leaving the api for the separatemethods available. Furthermore, it simplifies the get method by moving the device specific methods to their own methods. As a bonus, this has about 25% perf when creating a netinfo.NetInfo instance. Change-Id: Ic2c161b112865ef5cd4842fe70f26a3eeab1c3dd Signed-off-by: Antoni S. Puimedon <[email protected]> --- M vdsm/netinfo.py 1 file changed, 67 insertions(+), 37 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/66/13166/1 diff --git a/vdsm/netinfo.py b/vdsm/netinfo.py index 5088bd3..d54db50 100644 --- a/vdsm/netinfo.py +++ b/vdsm/netinfo.py @@ -181,6 +181,17 @@ return prefix2netmask(netmask) +def getIpInfo(dev): + dev_info_list = ethtool.get_interfaces_info(dev.encode('utf8')) + addr = dev_info_list[0].ipv4_address + netmask = dev_info_list[0].ipv4_netmask + ipv6addrs = dev_info_list[0].get_ipv6_addresses() + + return (addr if addr else '', + prefix2netmask(netmask) if netmask else '', + [addr6.address + '/' + str(addr6.netmask) for addr6 in ipv6addrs]) + + def getipv6addrs(dev): """Return a list of IPv6 addresses in the format of 'address/prefixlen'.""" dev_info_list = ethtool.get_interfaces_info(dev.encode('utf8')) @@ -328,10 +339,12 @@ # network is bridgeless. Please remove the attribute and this # comment when the version is no longer supported. data['interface'] = iface + + ipv4addr, ipv4netmask, ipv6addrs = getIpInfo(iface) data.update({'iface': iface, 'bridged': bridged, - 'addr': getaddr(iface), 'netmask': getnetmask(iface), + 'addr': ipv4addr, 'netmask': ipv4netmask, 'gateway': routes.get(iface, '0.0.0.0'), - 'ipv6addrs': getipv6addrs(iface), + 'ipv6addrs': ipv6addrs, 'ipv6gateway': ipv6routes.get(iface, '::'), 'mtu': getMtu(iface)}) except OSError as e: @@ -341,6 +354,51 @@ else: raise return data + + +def _bridgeinfo(bridge, routes, ipv6routes): + ipv4addr, ipv4netmask, ipv6addrs = getIpInfo(bridge) + return {'ports': ports(bridge), + 'stp': bridge_stp_state(bridge), + 'addr': ipv4addr, + 'netmask': ipv4netmask, + 'gateway': routes.get(bridge, '0.0.0.0'), + 'ipv6addrs': ipv6addrs, + 'ipv6gateway': ipv6routes.get(bridge, '::'), + 'mtu': getMtu(bridge), + 'cfg': getIfaceCfg(bridge)} + + +def _nicinfo(nic): + ipv4addr, ipv4netmask, ipv6addrs = getIpInfo(nic) + return {'speed': speed(nic), + 'addr': ipv4addr, + 'netmask': ipv4netmask, + 'ipv6addrs': ipv6addrs, + 'hwaddr': gethwaddr(nic), + 'mtu': getMtu(nic), + 'cfg': getIfaceCfg(nic)} + + +def _bondinfo(bond): + ipv4addr, ipv4netmask, ipv6addrs = getIpInfo(bond) + return {'slaves': slaves(bond), + 'addr': ipv4addr, + 'netmask': ipv4netmask, + 'ipv6addrs': ipv6addrs, + 'hwaddr': gethwaddr(bond), + 'cfg': getIfaceCfg(bond), + 'mtu': getMtu(bond)} + + +def _vlaninfo(vlan): + ipv4addr, ipv4netmask, ipv6addrs = getIpInfo(vlan) + return {'iface': vlan.split('.')[0], + 'addr': ipv4addr, + 'netmask': ipv4netmask, + 'ipv6addrs': ipv6addrs, + 'mtu': getMtu(vlan), + 'cfg': getIfaceCfg(vlan)} def get(): @@ -357,47 +415,19 @@ except KeyError: continue # Do not report missing libvirt networks. - d['bridges'] = dict([(bridge, {'ports': ports(bridge), - 'stp': bridge_stp_state(bridge), - 'addr': getaddr(bridge), - 'netmask': getnetmask(bridge), - 'gateway': routes.get(bridge, '0.0.0.0'), - 'ipv6addrs': getipv6addrs(bridge), - 'ipv6gateway': ipv6routes.get(bridge, '::'), - 'mtu': getMtu(bridge), - 'cfg': getIfaceCfg(bridge), - }) + d['bridges'] = dict([(bridge, _bridgeinfo(bridge, routes, ipv6routes)) for bridge in bridges()]) - d['nics'] = dict([(nic, {'speed': speed(nic), - 'addr': getaddr(nic), - 'netmask': getnetmask(nic), - 'ipv6addrs': getipv6addrs(nic), - 'hwaddr': gethwaddr(nic), - 'mtu': getMtu(nic), - 'cfg': getIfaceCfg(nic), - }) - for nic in nics()]) + d['nics'] = dict([(nic, _nicinfo(nic)) for nic in nics()]) + paddr = permAddr() for nic, nd in d['nics'].iteritems(): if paddr.get(nic): nd['permhwaddr'] = paddr[nic] - d['bondings'] = dict([(bond, {'slaves': slaves(bond), - 'addr': getaddr(bond), - 'netmask': getnetmask(bond), - 'ipv6addrs': getipv6addrs(bond), - 'hwaddr': gethwaddr(bond), - 'cfg': getIfaceCfg(bond), - 'mtu': getMtu(bond)}) - for bond in bondings()]) - d['vlans'] = dict([(vlan, {'iface': vlan.split('.')[0], - 'addr': getaddr(vlan), - 'netmask': getnetmask(vlan), - 'ipv6addrs': getipv6addrs(vlan), - 'mtu': getMtu(vlan), - 'cfg': getIfaceCfg(vlan), - }) - for vlan in vlans()]) + + d['bondings'] = dict([(bond, _bondinfo(bond)) for bond in bondings()]) + + d['vlans'] = dict([(vlan, _vlaninfo(vlan)) for vlan in vlans()]) return d -- To view, visit http://gerrit.ovirt.org/13166 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ic2c161b112865ef5cd4842fe70f26a3eeab1c3dd Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Antoni Segura Puimedon <[email protected]> _______________________________________________ vdsm-patches mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches
