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