Giuseppe Vallarelli has uploaded a new change for review. Change subject: [WIP]Hidden bonds[2/2]: Refactored and updated nics implementation. ......................................................................
[WIP]Hidden bonds[2/2]: Refactored and updated nics implementation. nics implementation now allows to hide bonds marked as hidden in the config file. Change-Id: Ieab80a3ca6b243ade75e490b7004bebe96248140 Signed-off-by: Giuseppe Vallarelli <[email protected]> --- M lib/vdsm/config.py.in M lib/vdsm/netinfo.py M tests/netinfoTests.py 3 files changed, 76 insertions(+), 18 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/39/16239/1 diff --git a/lib/vdsm/config.py.in b/lib/vdsm/config.py.in index b510669..4bab925 100644 --- a/lib/vdsm/config.py.in +++ b/lib/vdsm/config.py.in @@ -67,6 +67,10 @@ 'Comma-separated list of fnmatch-patterns for host nics to be ' 'hidden from vdsm.'), + ('hidden_bonds', 'bond*', + 'Comma-separated list of fnmatch-patterns for host bonds to be ' + 'hidden from vdsm.'), + ('default_bridge', 'engine', None), ('migration_downtime', '500', diff --git a/lib/vdsm/netinfo.py b/lib/vdsm/netinfo.py index 37cd0b4..075288c 100644 --- a/lib/vdsm/netinfo.py +++ b/lib/vdsm/netinfo.py @@ -42,7 +42,7 @@ NET_CONF_PREF = NET_CONF_DIR + 'ifcfg-' PROC_NET_VLAN = '/proc/net/vlan/' -NET_FN_MATCH = '/sys/class/net/*' +NET_PATH = '/sys/class/net/' BONDING_MASTERS = '/sys/class/net/bonding_masters' BONDING_SLAVES = '/sys/class/net/%s/bonding/slaves' @@ -53,35 +53,77 @@ REQUIRED_BONDINGS = frozenset(('bond0', 'bond1', 'bond2', 'bond3', 'bond4')) -def _match_nic_name(nic, patterns): - return any(map(lambda p: fnmatch(nic, p), patterns)) +def _match_name(name, patterns): + return any(map(lambda p: fnmatch(name, p), patterns)) def nics(): + """ + Returns a list of nics devices available to be used by vdsm. + The list of nics is built by filtering out nics defined + as hidden, fake or hidden bonds (with related nics'slaves). + """ + res = [] hidden_nics = config.get('vars', 'hidden_nics').split(',') fake_nics = config.get('vars', 'fake_nics').split(',') + hidden_bonds = config.get('vars', 'hidden_bonds').split(',') - for b in glob.glob(NET_FN_MATCH): - 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): + def isFakeNic(nic): + if not os.path.exists(os.path.join(NET_PATH, nic, 'device')): + return _match_name(nic, fake_nics) + return False + + def isVisibleNic(nic): + return not _match_name(nic, hidden_nics) + + def isHiddenBond(bond): + return _match_name(bond, hidden_bonds) + + def isFreeNic(nic): + """ + Returns boolean stating if nic is not enslaved + to an hidden bond. + """ + for bond_fn in hidden_bonds: + for bond_path in glob.glob(NET_PATH + bond_fn): + bond = os.path.basename(bond_path) + if nic in slaves(bond): + return False + return True + + for b in glob.glob(NET_PATH + '*'): + nic = os.path.basename(b) + if isFakeNic(nic): res.append(nic) + elif isVisibleNic(nic) and isFreeNic(nic): + if isHiddenBond(nic): + pass + else: + res.append(nic) return res def bondings(): + """ + Returns list of available bonds managed by vdsm. + """ + + hidden_bonds = config.get('vars', 'hidden_bonds').split(',') + res = [] try: - return open(BONDING_MASTERS).readline().split() + for bond in open(BONDING_MASTERS).readline().split(): + if not _match_name(bond, hidden_bonds): + res.append(bond) except IOError as e: if e.errno == os.errno.ENOENT: - return [] + return res else: raise + return res + def vlans(): return [b.split('/')[-1] for b in glob.glob('/sys/class/net/*.*')] diff --git a/tests/netinfoTests.py b/tests/netinfoTests.py index 7f93ce0..d6a4dd8 100644 --- a/tests/netinfoTests.py +++ b/tests/netinfoTests.py @@ -91,7 +91,7 @@ netinfo.get() def testMatchNicName(self): - self.assertTrue(netinfo._match_nic_name('test1', ['test0', 'test1'])) + self.assertTrue(netinfo._match_name('test1', ['test0', 'test1'])) def testIPv4toMapped(self): self.assertEqual('::ffff:127.0.0.1', netinfo.IPv4toMapped('127.0.0.1')) @@ -109,7 +109,9 @@ """ Creates test fixture which is a dir structure: /tmp/net/em/device - /tmp/net/me/device + /tmp/net/jbond/device + /tmp/net/me0/device + /tmp/net/me1/device /tmp/net/fake0 /tmp/net/fake1 /tmp/net/hid0/device @@ -118,10 +120,17 @@ """ dev_dirs = [DEV_DIR_FIXTURE + dev for dev in - ('em/device', 'me/device', 'fake0', 'fake', - 'hid/device', 'hideous/device')] + ('em/device', 'jbond/device', 'me0/device', + 'me1/device', 'fake0', 'fake', 'hid/device', + 'hideous/device')] for dev_dir in dev_dirs: os.makedirs(dev_dir) + + bonding_path = '/tmp/net/jbond/bonding' + os.makedirs(bonding_path) + + with open(os.path.join(bonding_path, 'slaves'), 'w') as f: + f.write('me0 me1') return DEV_DIR_FIXTURE + '*' @@ -133,17 +142,20 @@ def get(self, unused_vars, key): if key == 'hidden_nics': return 'hid*' - else: + elif key == 'fake_nics': return 'fake*' + else: + return 'jb*' return Config() - @MonkeyPatch(netinfo, 'NET_FN_MATCH', _dev_dirs_setup()) + @MonkeyPatch(netinfo, 'BONDING_SLAVES', '/tmp/net/%s/bonding/slaves') + @MonkeyPatch(netinfo, 'NET_PATH', _dev_dirs_setup()) @MonkeyPatch(netinfo, 'config', _config_setup()) def testNics(self): try: self.assertEqual(set(netinfo.nics()), - set(['em', 'me', 'fake0', 'fake'])) + set(['em', 'fake0', 'fake'])) except: # teardown test fixture rmtree(DEV_DIR_FIXTURE) -- To view, visit http://gerrit.ovirt.org/16239 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ieab80a3ca6b243ade75e490b7004bebe96248140 Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Giuseppe Vallarelli <[email protected]> _______________________________________________ vdsm-patches mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches
