Change in vdsm[master]: netinfo: Retrieve bonding options differing from defaults (WIP)

osvoboda at redhat.com osvoboda at redhat.com
Thu Feb 13 14:13:46 UTC 2014


Ondřej Svoboda has uploaded a new change for review.

Change subject: netinfo: Retrieve bonding options differing from defaults (WIP)
......................................................................

netinfo: Retrieve bonding options differing from defaults (WIP)

On failure, an empty dictionary is returned.
Tests are yet to be created.

Change-Id: Ief6d366b1b761627c7203cf236b75ef538af3e26
Bug-Url: https://bugzilla.redhat.com/987813
Signed-off-by: Ondřej Svoboda <osvoboda at redhat.com>
---
M lib/vdsm/netinfo.py
M tests/functional/networkTests.py
M tests/functional/supervdsmFuncTests.py
M vdsm/supervdsmServer
4 files changed, 53 insertions(+), 4 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/56/24456/1

diff --git a/lib/vdsm/netinfo.py b/lib/vdsm/netinfo.py
index dbacb2f..fe48f81 100644
--- a/lib/vdsm/netinfo.py
+++ b/lib/vdsm/netinfo.py
@@ -41,7 +41,7 @@
 from .ipwrapper import routeShowGateways, routeShowAllDefaultGateways
 from . import libvirtconnection
 from .ipwrapper import linkShowDev
-from .utils import anyFnmatch
+from .utils import anyFnmatch, execCmd, memoized, CommandPath
 from .netconfpersistence import RunningConfig
 
 
@@ -68,9 +68,11 @@
 _BONDING_LOADBALANCE_MODES = frozenset(('0', '2', '4', '5', '6'))
 _IFCFG_ZERO_SUFFIXED = frozenset(
     ('IPADDR0', 'GATEWAY0', 'PREFIX0', 'NETMASK0'))
+_TEE_BINARY = CommandPath('tee', '/usr/bin/tee')
 
 LIBVIRT_NET_PREFIX = 'vdsm-'
 DUMMY_BRIDGE = ';vdsmdummy;'
+DUMMY_BOND = ';vdsmdummybond;'
 DEFAULT_MTU = '1500'
 
 REQUIRED_BONDINGS = frozenset(('bond0', 'bond1', 'bond2', 'bond3', 'bond4'))
@@ -531,9 +533,44 @@
     return info
 
 
+ at memoized
+def _getDefaultBondingOptions():
+    teeCmd = _TEE_BINARY.cmd
+
+    rc, _, err = execCmd([teeCmd, BONDING_MASTERS],
+                         data='+' + DUMMY_BOND, sudo=True)
+    if rc:
+        raise OSError('Creating a reference bond failed: %s.', err)
+
+    try:
+        opts = bondOpts(DUMMY_BOND)
+    finally:
+        rc, _, _ = execCmd([teeCmd, BONDING_MASTERS],
+                           data='-' + DUMMY_BOND, sudo=True)
+
+    return opts
+
+
+def _getBondingOptions(bond):
+    try:
+        defaults = _getDefaultBondingOptions()
+        opts = bondOpts(bond)
+
+    except Exception as e:
+        logging.exception('Reading bonding options failed.')
+        return {}
+
+    for key, val in dict(opts).iteritems():
+        if key in defaults and val == defaults[key]:
+            del opts[key]
+
+    return opts
+
+
 def _bondinfo(link):
     info = _devinfo(link)
-    info.update({'hwaddr': link.address, 'slaves': slaves(link.name)})
+    info.update({'hwaddr': link.address, 'slaves': slaves(link.name),
+                 'options': _getBondingOptions(bond)})
     return info
 
 
diff --git a/tests/functional/networkTests.py b/tests/functional/networkTests.py
index 695a29f..f2a785d 100644
--- a/tests/functional/networkTests.py
+++ b/tests/functional/networkTests.py
@@ -41,7 +41,7 @@
 
 from vdsm.utils import RollbackContext
 from vdsm.netinfo import (operstate, prefix2netmask, getRouteDeviceTo,
-                          getDhclientIfaces)
+                          getDhclientIfaces, _getBondingOptions)
 from vdsm import ipwrapper
 from vdsm.utils import pgrep
 
@@ -1728,3 +1728,9 @@
                                                       NOCHK)
             self.assertEqual(status, SUCCESS, msg)
             self.assertNetworkDoesntExist(NETWORK_NAME)
+
+    def testGetBondingOptions(self):
+        # TODO: Create a bond with mode and miimon options set and check
+        # that no other options are returned.
+
+        _getBondingOptions('bond0')
diff --git a/tests/functional/supervdsmFuncTests.py b/tests/functional/supervdsmFuncTests.py
index 4596306..fa94291 100644
--- a/tests/functional/supervdsmFuncTests.py
+++ b/tests/functional/supervdsmFuncTests.py
@@ -37,3 +37,9 @@
         self.dropPrivileges()
         proxy = supervdsm.getProxy()
         self.assertTrue(proxy.ping())
+
+    @testValidation.ValidateRunningAsRoot
+    def testDefaultBondingOptions(self):
+        proxy = supervdsm.getProxy()
+        print proxy.defaultBondingOptions()
+        raise Exception()
diff --git a/vdsm/supervdsmServer b/vdsm/supervdsmServer
index 21351c3..ce07dea 100755
--- a/vdsm/supervdsmServer
+++ b/vdsm/supervdsmServer
@@ -49,7 +49,7 @@
 except ImportError:
     _glusterEnabled = False
 
-from vdsm import utils
+from vdsm import netinfo, utils
 from vdsm.tool import restore_nets
 from parted_utils import getDevicePartedInfo as _getDevicePartedInfo
 from md_utils import getMdDeviceUuidMap as _getMdDeviceUuidMap


-- 
To view, visit http://gerrit.ovirt.org/24456
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ief6d366b1b761627c7203cf236b75ef538af3e26
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Ondřej Svoboda <osvoboda at redhat.com>


More information about the vdsm-patches mailing list