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

Reply via email to