Mark Wu has uploaded a new change for review. Change subject: Revert "Use 'ip link' to get different kinds of interfaces" ......................................................................
Revert "Use 'ip link' to get different kinds of interfaces" This reverts commit 8febe0e40650983d809abaa10be983bc1953ef1e. The netlink support for bridge is only available on kernel 3.0+. Please see the following commit for details. http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=bb900b27a2f49b37bc38c08e656ea13048fee13b Add netlink support for bond is also added after kernel 2.6.32. So this solution doesn't work on RHEL6 system. We have to revert it. Change-Id: I9d3f037a9e837fd97cb8808b7bf4b72026ec77c5 Signed-off-by: Mark Wu <[email protected]> --- M lib/vdsm/netinfo.py M tests/Makefile.am D tests/ip_details_link.out M tests/netinfoTests.py M vdsm.spec.in M vdsm/clientIF.py M vdsm/neterrors.py 7 files changed, 28 insertions(+), 114 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/57/14157/1 diff --git a/lib/vdsm/netinfo.py b/lib/vdsm/netinfo.py index 3ecc483..3abe601 100644 --- a/lib/vdsm/netinfo.py +++ b/lib/vdsm/netinfo.py @@ -19,7 +19,6 @@ # import os -import re import errno import glob import ethtool @@ -30,14 +29,11 @@ from fnmatch import fnmatch from xml.dom import minidom from itertools import chain -from collections import namedtuple import libvirtconnection import constants -import neterrors as ne from config import config -from storage.misc import execCmd NET_CONF_DIR = '/etc/sysconfig/network-scripts/' NET_CONF_BACK_DIR = constants.P_VDSM_LIB + 'netconfback/' @@ -58,61 +54,33 @@ return any(map(lambda p: fnmatch(nic, p), patterns)) -def _parseIpLinkOutput(links): - interfaces = {'nic': [], 'bond': [], 'vlan': [], 'bridge': [], 'fake': []} - IP_LINK_RE = re.compile(r'^\d+: (?P<name>\S+):.*\n' - ' {4}link/(?P<link>\w+).*\n' - '( {4}(?P<type>\w+))?', re.MULTILINE) - - for match in re.finditer(IP_LINK_RE, links): - name = match.group('name') - ifaceType = match.group('type') - link = match.group('link') - if ifaceType: - if ifaceType in ('tun', 'dummy'): - ifaceType = 'fake' - interfaces[ifaceType].append(name) - elif link == 'ether': - interfaces['nic'].append(name) - - return interfaces - - -def getInterfaces(): - Interfaces = namedtuple('Interfaces', ('nics, bonds, vlans, bridges')) +def nics(): + res = [] hidden_nics = config.get('vars', 'hidden_nics').split(',') fake_nics = config.get('vars', 'fake_nics').split(',') - rc, out, err = execCmd([constants.EXT_IPROUTE, '--details', - 'link', 'show'], raw=True) - if rc != 0: - raise ne.NetInfoError(err) - interfaces = _parseIpLinkOutput(out) + for b in glob.glob('/sys/class/net/*'): + nic = b.split('/')[-1] + if not os.path.exists(os.path.join(b, 'device')): + if _match_nic_name(nic, fake_nics): + res.append(nic) + elif not _match_nic_name(nic, hidden_nics): + res.append(nic) - return Interfaces([nic for nic in interfaces['nic'] - if not _match_nic_name(nic, hidden_nics)] + - [nic for nic in interfaces['fake'] - if _match_nic_name(nic, fake_nics)], - interfaces['bond'], - [vlan.split('@')[0] for vlan in interfaces['vlan']], - [br for br in interfaces['bridge'] - if br != DUMMY_BRIDGE]) - - -def nics(): - return getInterfaces().nics + return res def bondings(): - return getInterfaces().bondings + return [b.split('/')[-2] for b in glob.glob('/sys/class/net/*/bonding')] def vlans(): - return getInterfaces().vlans + return [b.split('/')[-1] for b in glob.glob('/sys/class/net/*.*')] def bridges(): - return getInterfaces().bridges + return [b.split('/')[-2] for b in glob.glob('/sys/class/net/*/bridge') + if b.split('/')[-2] != DUMMY_BRIDGE] def networks(): @@ -239,14 +207,13 @@ def graph(): - _, bondings, vlans, bridges = getInterfaces() - for bridge in bridges: + for bridge in bridges(): print bridge for iface in ports(bridge): print '\t' + iface - if iface in vlans: + if iface in vlans(): iface = iface.split('.')[0] - if iface in bondings: + if iface in bondings(): for slave in slaves(iface): print '\t\t' + slave @@ -254,15 +221,14 @@ def getVlanBondingNic(bridge): """Return the (vlan, bonding, nics) tupple that belongs to bridge.""" - _, bondings, vlans, bridges = getInterfaces() - if bridge not in bridges: + if bridge not in bridges(): raise ValueError('unknown bridge %s' % bridge) vlan = bonding = '' nics = [] for iface in ports(bridge): - if iface in vlans: + if iface in vlans(): iface, vlan = iface.split('.') - if iface in bondings: + if iface in bondings(): bonding = iface nics = slaves(iface) else: @@ -350,9 +316,9 @@ return d -def permAddr(bondings): +def permAddr(): paddr = {} - for b in bondings: + for b in bondings(): slave = '' for line in file('/proc/net/bonding/' + b): if line.startswith('Slave Interface: '): @@ -434,8 +400,7 @@ d = {} routes = getRoutes() ipv6routes = getIPv6Routes() - nics, bondings, vlans, bridges = getInterfaces() - paddr = permAddr(bondings) + paddr = permAddr() d['networks'] = {} for net, netAttr in networks().iteritems(): @@ -447,10 +412,10 @@ continue # Do not report missing libvirt networks. d['bridges'] = dict([_bridgeinfo(bridge, routes, ipv6routes) - for bridge in bridges]) - d['nics'] = dict([_nicinfo(nic, paddr) for nic in nics]) - d['bondings'] = dict([_bondinfo(bond) for bond in bondings]) - d['vlans'] = dict([_vlaninfo(vlan) for vlan in vlans]) + for bridge in bridges()]) + d['nics'] = dict([_nicinfo(nic, paddr) for nic in nics()]) + d['bondings'] = dict([_bondinfo(bond) for bond in bondings()]) + d['vlans'] = dict([_vlaninfo(vlan) for vlan in vlans()]) return d diff --git a/tests/Makefile.am b/tests/Makefile.am index 7a8c204..1038cfb 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -74,7 +74,6 @@ glob_1c60971a-8647-44ac-ae33-6520887f8843.out \ glusterVolumeProfileInfo.xml \ glusterVolumeProfileInfoNfs.xml \ - ip_details_link.out \ lvs_3386c6f2-926f-42c4-839c-38287fac8998.out \ netmaskconversions \ route_info.out \ diff --git a/tests/ip_details_link.out b/tests/ip_details_link.out deleted file mode 100644 index 3145b6b..0000000 --- a/tests/ip_details_link.out +++ /dev/null @@ -1,32 +0,0 @@ -1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN mode DEFAULT - link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 -2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master ovirtmgmt state UP mode DEFAULT qlen 1000 - link/ether 00:16:3e:e3:68:64 brd ff:ff:ff:ff:ff:ff -3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 - link/ether 52:54:00:de:44:dd brd ff:ff:ff:ff:ff:ff -4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 - link/ether 52:54:00:df:89:d9 brd ff:ff:ff:ff:ff:ff -5: ovirtmgmt: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT - link/ether 00:16:3e:e3:68:64 brd ff:ff:ff:ff:ff:ff - bridge -7: ;vdsmdummy;: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT - link/ether 92:63:1c:88:31:ef brd ff:ff:ff:ff:ff:ff - bridge -8: bond0: <NO-CARRIER,BROADCAST,MULTICAST,MASTER,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT - link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff - bond -9: bond4: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN mode DEFAULT - link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff - bond -10: eth0.10@eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT - link/ether 00:16:3e:e3:68:64 brd ff:ff:ff:ff:ff:ff - vlan id 10 <REORDER_HDR> -11: eth2.20@eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT - link/ether 52:54:00:df:89:d9 brd ff:ff:ff:ff:ff:ff - vlan id 20 <REORDER_HDR> -12: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr1 state UNKNOWN mode DEFAULT qlen 500 - link/ether fe:16:3e:e3:68:64 brd ff:ff:ff:ff:ff:ff - tun -13: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT - link/ether 22:f8:79:a7:3d:00 brd ff:ff:ff:ff:ff:ff - dummy diff --git a/tests/netinfoTests.py b/tests/netinfoTests.py index fca9547..5e0716e 100644 --- a/tests/netinfoTests.py +++ b/tests/netinfoTests.py @@ -85,15 +85,3 @@ def testMatchNicName(self): self.assertTrue(netinfo._match_nic_name('test1', ['test0', 'test1'])) - - def testParseIpLinkOutput(self): - outFile = os.path.join(os.path.dirname(os.path.abspath(__file__)), - "ip_details_link.out") - with open(outFile) as f: - links = f.read() - interfaces = netinfo._parseIpLinkOutput(links) - self.assertEqual(interfaces['nic'], ['eth0', 'eth1', 'eth2']) - self.assertEqual(interfaces['bond'], ['bond0', 'bond4']) - self.assertEqual(interfaces['vlan'], ['eth0.10@eth0', 'eth2.20@eth2']) - self.assertEqual(interfaces['bridge'], ['ovirtmgmt', ';vdsmdummy;']) - self.assertEqual(interfaces['fake'], ['vnet0', 'dummy0']) diff --git a/vdsm.spec.in b/vdsm.spec.in index 1966835..644ec59 100644 --- a/vdsm.spec.in +++ b/vdsm.spec.in @@ -955,7 +955,6 @@ %{_datadir}/%{vdsm_name}/tests/caps_libvirt_amd_6274.out %{_datadir}/%{vdsm_name}/tests/caps_libvirt_intel_E31220.out %{_datadir}/%{vdsm_name}/tests/glob_1c60971a-8647-44ac-ae33-6520887f8843.out -%{_datadir}/%{vdsm_name}/tests/ip_details_link.out %{_datadir}/%{vdsm_name}/tests/lvs_3386c6f2-926f-42c4-839c-38287fac8998.out %{_datadir}/%{vdsm_name}/tests/netmaskconversions %{_datadir}/%{vdsm_name}/tests/run_tests.sh diff --git a/vdsm/clientIF.py b/vdsm/clientIF.py index 7b7f5b9..ed7db4b 100644 --- a/vdsm/clientIF.py +++ b/vdsm/clientIF.py @@ -82,8 +82,7 @@ self.gluster = None try: self.vmContainer = {} - nics, bondings, _, _ = netinfo.getInterfaces() - ifids = nics + bondings + ifids = netinfo.nics() + netinfo.bondings() ifrates = map(netinfo.speed, ifids) self._hostStats = sampling.HostStatsThread( cif=self, log=log, ifids=ifids, diff --git a/vdsm/neterrors.py b/vdsm/neterrors.py index c2f98af..034414c 100644 --- a/vdsm/neterrors.py +++ b/vdsm/neterrors.py @@ -36,7 +36,3 @@ self.errCode = errCode self.message = message Exception.__init__(self, self.errCode, self.message) - - -class NetInfoError(Exception): - pass -- To view, visit http://gerrit.ovirt.org/14157 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I9d3f037a9e837fd97cb8808b7bf4b72026ec77c5 Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Mark Wu <[email protected]> _______________________________________________ vdsm-patches mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches
