Change in vdsm[master]: bridge_opts: Add ifcfg configurator support

asegurap at redhat.com asegurap at redhat.com
Fri Apr 11 12:51:33 UTC 2014


Antoni Segura Puimedon has uploaded a new change for review.

Change subject: bridge_opts: Add ifcfg configurator support
......................................................................

bridge_opts: Add ifcfg configurator support

bridge_opts is a new custom network property that allows to tweak
the VM networks bridge behavior by passing a string such as:
    'max_age=2100 forward_delay=300'

This patch makes processing of such options part of vdsm proper by
including its processing in the ifcfg configurator.

A patch will follow up that adds support for other configurators.

Change-Id: I506538384ce4273630cf5fd18c56b07b09bd4376
Signed-off-by: Antoni S. Puimedon <asegurap at redhat.com>
---
M lib/vdsm/netinfo.py
M tests/functional/networkTests.py
M vdsm/network/configurators/ifcfg.py
3 files changed, 34 insertions(+), 4 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/08/26708/1

diff --git a/lib/vdsm/netinfo.py b/lib/vdsm/netinfo.py
index bfc316c..97286f8 100644
--- a/lib/vdsm/netinfo.py
+++ b/lib/vdsm/netinfo.py
@@ -65,6 +65,7 @@
 BONDING_MASTERS = '/sys/class/net/bonding_masters'
 BONDING_SLAVES = '/sys/class/net/%s/bonding/slaves'
 BONDING_OPT = '/sys/class/net/%s/bonding/%s'
+BRIDGING_OPT = '/sys/class/net/%s/bridge/%s'
 _BONDING_FAILOVER_MODES = frozenset(('1', '3'))
 _BONDING_LOADBALANCE_MODES = frozenset(('0', '2', '4', '5', '6'))
 _IFCFG_ZERO_SUFFIXED = frozenset(
@@ -176,6 +177,24 @@
         with open(path) as optFile:
             opts[os.path.basename(path)] = [
                 el for el in optFile.read().rstrip().split(' ') if el]
+    return opts
+
+
+def bridgeOpts(bridge, keys=None):
+    """Returns a dictionary of bridge option name and value. E.g.,
+    {'max_age': '2000', 'gc_timer': '332'}"""
+    BR_KEY_BLACKLIST = ('flush',)
+    if keys is None:
+        paths = iglob(BRIDGING_OPT % (bridge, '*'))
+    else:
+        paths = (BRIDGING_OPT % (bridge, key) for key in keys)
+    opts = {}
+    for path in paths:
+        key = os.path.basename(path)
+        if key in BR_KEY_BLACKLIST:
+            continue
+        with open(path) as optFile:
+            opts[key] = optFile.read().rstrip()
     return opts
 
 
@@ -512,7 +531,8 @@
     info.update({'gateway': getgateway(gateways, link.name),
                  'ipv6gateway': ipv6routes.get(link.name, '::'),
                  'ports': ports(link.name),
-                 'stp': bridge_stp_state(link.name)})
+                 'stp': bridge_stp_state(link.name),
+                 'bridge_opts': bridgeOpts(link.name)})
     return info
 
 
diff --git a/tests/functional/networkTests.py b/tests/functional/networkTests.py
index 20d663c..a73973a 100644
--- a/tests/functional/networkTests.py
+++ b/tests/functional/networkTests.py
@@ -194,12 +194,16 @@
                 func(*args, **kwargs)
         return wrapper
 
-    def assertNetworkExists(self, networkName, bridged=None):
+    def assertNetworkExists(self, networkName, bridged=None, bridgeOpts=None):
         netinfo = self.vdsm_net.netinfo
         config = self.vdsm_net.config
         self.assertIn(networkName, netinfo.networks)
         if bridged is not None:
             self.assertEqual(bridged, netinfo.networks[networkName]['bridged'])
+        if bridgeOpts is not None and netinfo.networks[networkName]['bridged']:
+            appliedOpts = netinfo.bridge[networkName]['bridge_opts']
+            for opt, value in bridgeOpts.iteritems():
+                self.assertEqual(value, appliedOpts[opt])
         if config is not None:
             self.assertIn(networkName, config.networks)
             if bridged is not None:
@@ -672,14 +676,17 @@
     @RequireDummyMod
     @ValidateRunningAsRoot
     def testSetupNetworksAddVlan(self, bridged):
+        BRIDGE_OPTS = {'max_age': '211', 'gc_timer': '333'}
+        frmtd_opts = ' '.join(['='.join(elem) for elem in BRIDGE_OPTS.items()])
         with dummyIf(1) as nics:
             nic, = nics
-            attrs = dict(vlan=VLAN_ID, nic=nic, bridged=bridged)
+            attrs = {'vlan': VLAN_ID, 'nic': nic, 'bridged': bridged,
+                     'custom': {'bridge_opts': frmtd_opts}}
             status, msg = self.vdsm_net.setupNetworks({NETWORK_NAME:
                                                        attrs}, {}, NOCHK)
 
             self.assertEqual(status, SUCCESS, msg)
-            self.assertNetworkExists(NETWORK_NAME)
+            self.assertNetworkExists(NETWORK_NAME, bridgeOpts=BRIDGE_OPTS)
             self.assertVlanExists('%s.%s' % (nic, VLAN_ID))
 
             status, msg = self.vdsm_net.setupNetworks({NETWORK_NAME:
diff --git a/vdsm/network/configurators/ifcfg.py b/vdsm/network/configurators/ifcfg.py
index 352d78e..995bfed 100644
--- a/vdsm/network/configurators/ifcfg.py
+++ b/vdsm/network/configurators/ifcfg.py
@@ -602,6 +602,9 @@
         ipconfig = bridge.ipConfig
         defaultRoute = ConfigWriter._toIfcfgFormat(ipconfig.defaultRoute)
         ipconfig = ipconfig._replace(defaultRoute=defaultRoute)
+
+        if 'custom' in opts and 'bridging_opts' in opts['custom']:
+            opts['bridging_opts'] = opts['custom']['bridging_opts']
         self._createConfFile(conf, bridge.name, ipconfig, bridge.mtu, **opts)
 
     def addVlan(self, vlan, **opts):


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I506538384ce4273630cf5fd18c56b07b09bd4376
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Antoni Segura Puimedon <asegurap at redhat.com>


More information about the vdsm-patches mailing list