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

Reply via email to