Ido Barkan has uploaded a new change for review.
Change subject: relax the validation multiple networks on the same interface
......................................................................
relax the validation multiple networks on the same interface
the only validation that is now left on the vdsm side is that there are
no 2 networks using the same vlan tag that are connected to the same
interface concurrently. Also, no 2 untagged networks can be connected to
the same interface.
Change-Id: I0030433ef519ae6699ee8a921b95c0a67f7b2eae
Signed-off-by: ibarkan <ibarkan(a)redhat.com>
---
M lib/vdsm/netinfo.py
M tests/functional/networkTests.py
M vdsm/network/api.py
3 files changed, 55 insertions(+), 261 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/38/34538/1
diff --git a/lib/vdsm/netinfo.py b/lib/vdsm/netinfo.py
index d818249..f2409a8 100644
--- a/lib/vdsm/netinfo.py
+++ b/lib/vdsm/netinfo.py
@@ -774,6 +774,11 @@
self.bondings = _netinfo['bondings']
self.bridges = _netinfo['bridges']
+ def getNetsByVlans(self, iface):
+ return dict((vlan, net)
+ for (net, vlan)
+ in self.getNetworksAndVlansForIface(iface))
+
def getNetworksAndVlansForIface(self, iface):
""" Returns tuples of (bridge/network, vlan) connected to
nic/bond """
return chain(self.getBridgedNetworksAndVlansForIface(iface),
@@ -787,7 +792,7 @@
if iface == interface:
yield (network, None)
elif interface.startswith(iface + '.'):
- yield (network, interface.split('.', 1)[1])
+ yield (network, int(interface.split('.', 1)[1]))
def getBridgelessNetworksAndVlansForIface(self, iface):
""" Returns tuples of (network, vlan) connected to nic/bond
"""
diff --git a/tests/functional/networkTests.py b/tests/functional/networkTests.py
index 34741ab..313a317 100644
--- a/tests/functional/networkTests.py
+++ b/tests/functional/networkTests.py
@@ -913,247 +913,59 @@
self.assertVlanDoesntExist(nic + '.' + tag)
@cleanupNet
+ @permutations([[True], [False]])
@RequireDummyMod
@ValidateRunningAsRoot
- def testSetupNetworksNetCompatibilityBondSingleBridge(self):
- with dummyIf(1) as nics:
- # Only single non-VLANed bridged network allowed
- d = dict(bonding=BONDING_NAME, bridged=True)
- status, msg = self.vdsm_net.setupNetworks({NETWORK_NAME: d},
- {BONDING_NAME:
- dict(nics=nics)},
- NOCHK)
- self.assertEqual(status, SUCCESS, msg)
- self.assertNetworkExists(NETWORK_NAME, bridged=True)
+ def testSetupNetworksNetCompatibilityMultipleNetsSameNic(self, bridged):
+ with dummyIf(2) as (nic, another_nic):
- # Try to add additional bridgeless network, should fail
- netNameBridgeless = NETWORK_NAME + '-2'
- d['bridged'] = False
- status, msg = self.vdsm_net.setupNetworks({netNameBridgeless:
- d}, {}, NOCHK)
- self.assertTrue(status != SUCCESS, msg)
+ net_untagged = NETWORK_NAME
+ networks = {net_untagged: dict(nic=nic, bridged=bridged)}
+ status, msg = self.vdsm_net.setupNetworks(networks, {}, NOCHK)
+ self.assertEquals(status, SUCCESS, msg)
+ self.assertNetworkExists(net_untagged, bridged=bridged)
- # Try to add additional bridged network, should fail
- netNameBridged = NETWORK_NAME + '-3'
- d['bridged'] = True
- status, msg = self.vdsm_net.setupNetworks({netNameBridged: d},
- {}, NOCHK)
- self.assertTrue(status != SUCCESS, msg)
-
- # Try to add additional VLANed bridgeless network, should fail
- netNameVlanBridgeless = NETWORK_NAME + '-4'
- networks = dict(netNameVlanBridgeless={'bonding': BONDING_NAME,
- 'vlan': '100',
- 'bridged': False})
+ other_net_untagged = NETWORK_NAME + '2'
+ networks = {other_net_untagged: dict(nic=nic, bridged=bridged)}
status, msg = self.vdsm_net.setupNetworks(networks, {}, NOCHK)
self.assertTrue(status != SUCCESS, msg)
+ self.assertNetworkDoesntExist(other_net_untagged)
- # Try to add additional VLANed bridged network, should fail
- netNameVlanBridged = NETWORK_NAME + '-5'
- networks['vlan'] = '200'
- networks['bridged'] = True
- status, msg = self.vdsm_net.setupNetworks({netNameVlanBridged:
- networks}, {}, NOCHK)
+ net_tagged = NETWORK_NAME + '3'
+ networks = {net_tagged: dict(nic=nic, bridged=bridged, vlan='100')}
+ status, msg = self.vdsm_net.setupNetworks(networks, {}, NOCHK)
+ self.assertEquals(status, SUCCESS, msg)
+ self.assertNetworkExists(net_tagged, bridged=bridged)
+
+ other_net_same_tag = NETWORK_NAME + '4'
+ networks = {other_net_same_tag: dict(nic=nic, bridged=bridged,
+ vlan='100')}
+ status, msg = self.vdsm_net.setupNetworks(networks, {}, NOCHK)
self.assertTrue(status != SUCCESS, msg)
+ self.assertNetworkDoesntExist(other_net_same_tag)
- self.assertNetworkDoesntExist(netNameBridgeless)
- self.assertNetworkDoesntExist(netNameBridged)
- self.assertNetworkDoesntExist(netNameVlanBridgeless)
- self.assertNetworkDoesntExist(netNameVlanBridged)
+ networks = {other_net_same_tag: dict(nic=another_nic,
+ bridged=bridged, vlan='100')}
+ status, msg = self.vdsm_net.setupNetworks(networks, {}, NOCHK)
+ self.assertEquals(status, SUCCESS, msg)
+ self.assertNetworkExists(other_net_same_tag)
+
+ other_net_different_tag = NETWORK_NAME + '5'
+ networks = {other_net_different_tag: dict(nic=nic, bridged=bridged,
+ vlan='200')}
+ status, msg = self.vdsm_net.setupNetworks(networks, {}, NOCHK)
+ self.assertEquals(status, SUCCESS, msg)
+ self.assertNetworkExists(other_net_different_tag, bridged=bridged)
# Clean all
- status, msg = self.vdsm_net.setupNetworks({NETWORK_NAME:
- dict(remove=True)},
- {BONDING_NAME:
- dict(remove=True)},
- NOCHK)
- self.assertEquals(status, SUCCESS, msg)
-
- self.assertNetworkDoesntExist(NETWORK_NAME)
- self.assertBondDoesntExist(BONDING_NAME, nics)
-
- @cleanupNet
- @RequireDummyMod
- @ValidateRunningAsRoot
- def testSetupNetworksNetCompatibilityBondSingleBridgeless(self):
- with dummyIf(1) as nics:
- # Multiple VLANed networks (bridged/bridgeless) with only one
- # non-VLANed bridgeless network permited
- d = dict(bonding=BONDING_NAME, bridged=False)
- status, msg = self.vdsm_net.setupNetworks({NETWORK_NAME: d},
- {BONDING_NAME:
- dict(nics=nics)},
- NOCHK)
- self.assertEqual(status, SUCCESS, msg)
- self.assertNetworkExists(NETWORK_NAME, bridged=False)
-
- # Try to add additional bridgeless network, should fail
- netNameBridgeless = NETWORK_NAME + '-2'
- status, msg = self.vdsm_net.setupNetworks({netNameBridgeless:
- d}, {}, NOCHK)
- self.assertTrue(status != SUCCESS, msg)
-
- # Try to add additional bridged network, should fail
- netNameBridged = NETWORK_NAME + '-3'
- d['bridged'] = True
- status, msg = self.vdsm_net.setupNetworks({netNameBridged: d},
- {}, NOCHK)
- self.assertTrue(status != SUCCESS, msg)
-
- # Try to add additional VLANed bridgeless network,
- # should succeed
- netNameVlanBridgeless = NETWORK_NAME + '-4'
- d['vlan'], d['bridged'] = '100', False
- networks = {netNameVlanBridgeless: d}
+ nets_to_clean = [net_untagged, net_tagged, other_net_same_tag,
+ other_net_different_tag]
+ networks = dict((net, dict(remove=True)) for net in nets_to_clean)
status, msg = self.vdsm_net.setupNetworks(networks, {}, NOCHK)
-
self.assertEqual(status, SUCCESS, msg)
- # Try to add additional VLANed bridged network, should succeed
- netNameVlanBridged = NETWORK_NAME + '-5'
- d['vlan'], d['bridged'] = '200', True
- status, msg = self.vdsm_net.setupNetworks({netNameVlanBridged:
- d}, {}, NOCHK)
- self.assertEqual(status, SUCCESS, msg)
-
- self.assertNetworkDoesntExist(netNameBridgeless)
- self.assertNetworkDoesntExist(netNameBridged)
-
- self.assertNetworkExists(netNameVlanBridgeless)
- self.assertNetworkExists(netNameVlanBridged)
-
- # Clean all
- r = dict(remove=True)
- networks = {NETWORK_NAME: r,
- netNameVlanBridgeless: r,
- netNameVlanBridged: r}
- status, msg = self.vdsm_net.setupNetworks(networks,
- {BONDING_NAME: r},
- NOCHK)
-
- self.assertEqual(status, SUCCESS, msg)
-
- self.assertNetworkDoesntExist(NETWORK_NAME)
- self.assertNetworkDoesntExist(netNameVlanBridgeless)
- self.assertNetworkDoesntExist(netNameVlanBridged)
- self.assertBondDoesntExist(BONDING_NAME, nics)
-
- @cleanupNet
- @RequireDummyMod
- @ValidateRunningAsRoot
- def testSetupNetworksNetCompatibilityNicSingleBridge(self):
- with dummyIf(1) as nics:
- nic, = nics
- # Only single non-VLANed bridged network allowed
- networks = {NETWORK_NAME: dict(nic=nic, bridged=True)}
- status, msg = self.vdsm_net.setupNetworks(networks, {}, NOCHK)
-
- self.assertEquals(status, SUCCESS, msg)
- self.assertNetworkExists(NETWORK_NAME, bridged=True)
-
- # Try to add additional bridgeless network, should fail
- netNameBridgeless = NETWORK_NAME + '-2'
- networks = {netNameBridgeless: dict(nic=nic, bridged=False)}
- status, msg = self.vdsm_net.setupNetworks(networks, {}, NOCHK)
-
- self.assertTrue(status != SUCCESS, msg)
-
- # Try to add additional bridged network, should fail
- netNameBridged = NETWORK_NAME + '-3'
- networks = {netNameBridged: dict(nic=nic, bridged=True)}
- status, msg = self.vdsm_net.setupNetworks(networks, {}, NOCHK)
-
- self.assertTrue(status != SUCCESS, msg)
-
- # Try to add additional VLANed bridgeless network, should fail
- netNameVlanBridgeless = NETWORK_NAME + '-4'
- networks = {netNameVlanBridgeless: dict(nic=nic, vlan='100',
- bridged=False)}
- status, msg = self.vdsm_net.setupNetworks(networks, {}, NOCHK)
-
- self.assertTrue(status != SUCCESS, msg)
-
- # Try to add additional VLANed bridged network, should fail
- netNameVlanBridged = NETWORK_NAME + '-5'
- networks = {netNameVlanBridged: dict(nic=nic, vlan='200',
- bridged=True)}
- status, msg = self.vdsm_net.setupNetworks(networks, {}, NOCHK)
-
- self.assertTrue(status != SUCCESS, msg)
-
- self.assertNetworkDoesntExist(netNameBridgeless)
- self.assertNetworkDoesntExist(netNameBridged)
- self.assertNetworkDoesntExist(netNameVlanBridgeless)
- self.assertNetworkDoesntExist(netNameBridged)
-
- # Clean all
- status, msg = self.vdsm_net.setupNetworks({NETWORK_NAME:
- dict(remove=True)},
- {}, NOCHK)
- self.assertEquals(status, SUCCESS, msg)
- self.assertNetworkDoesntExist(NETWORK_NAME)
-
- @cleanupNet
- @RequireDummyMod
- @ValidateRunningAsRoot
- def testSetupNetworksNetCompatibilityNicSingleBridgeless(self):
- with dummyIf(1) as nics:
- nic, = nics
- # Multiple VLANed networks (bridged/bridgeless) with only one
- # non-VLANed bridgeless network permited
- networks = {NETWORK_NAME: dict(nic=nic, bridged=False)}
- status, msg = self.vdsm_net.setupNetworks(networks, {}, NOCHK)
-
- self.assertEquals(status, SUCCESS, msg)
- self.assertNetworkExists(NETWORK_NAME, bridged=False)
-
- # Try to add additional bridgeless network, should fail
- netNameBridgeless = NETWORK_NAME + '-2'
- networks = {netNameBridgeless: dict(nic=nic, bridged=False)}
- status, msg = self.vdsm_net.setupNetworks(networks, {}, NOCHK)
-
- self.assertTrue(status != SUCCESS, msg)
-
- # Try to add additional bridged network, should fail
- netNameBridged = NETWORK_NAME + '-3'
- networks = {netNameBridged: dict(nic=nic, bridged=True)}
- status, msg = self.vdsm_net.setupNetworks(networks, {}, NOCHK)
-
- self.assertTrue(status != SUCCESS, msg)
-
- # Try to add additional VLANed bridgeless network,
- # should succeed
- netNameVlanBridgeless = NETWORK_NAME + '-4'
- networks = {netNameVlanBridgeless: dict(nic=nic, vlan='100',
- bridged=False)}
- status, msg = self.vdsm_net.setupNetworks(networks, {}, NOCHK)
-
- self.assertEquals(status, SUCCESS, msg)
-
- # Try to add additional VLANed bridged network, should succeed
- netNameVlanBridged = NETWORK_NAME + '-5'
- networks = {netNameVlanBridged: dict(nic=nic, vlan='200',
- bridged=True)}
- status, msg = self.vdsm_net.setupNetworks(networks, {}, NOCHK)
-
- self.assertEquals(status, SUCCESS, msg)
-
- self.assertNetworkDoesntExist(netNameBridgeless)
- self.assertNetworkDoesntExist(netNameBridged)
- self.assertNetworkExists(netNameVlanBridgeless)
- self.assertNetworkExists(netNameVlanBridged, bridged=True)
-
- # Clean all
- networks = {NETWORK_NAME: dict(remove=True),
- netNameVlanBridgeless: dict(remove=True),
- netNameVlanBridged: dict(remove=True)}
- status, msg = self.vdsm_net.setupNetworks(networks, {}, NOCHK)
-
- self.assertEqual(status, SUCCESS, msg)
-
- self.assertNetworkDoesntExist(NETWORK_NAME)
- self.assertNetworkDoesntExist(netNameVlanBridgeless)
- self.assertNetworkDoesntExist(netNameVlanBridged)
+ for net in nets_to_clean:
+ self.assertNetworkDoesntExist(net)
@cleanupNet
@permutations([[True], [False]])
diff --git a/vdsm/network/api.py b/vdsm/network/api.py
index 302deb9..72fe038 100755
--- a/vdsm/network/api.py
+++ b/vdsm/network/api.py
@@ -180,7 +180,7 @@
raise ValueError('Invalid value for bridge stp')
-def _validateInterNetworkCompatibility(ni, vlan, iface, bridged, qosOutbound):
+def _validateInterNetworkCompatibility(ni, vlan, iface):
"""
Verify network compatibility with other networks on iface (bond/nic).
@@ -190,35 +190,14 @@
non-VLANed bridgeless network
- QoSed networks can't coexist with non-QoSed nets
"""
- def _validateNoDirectNet(ifaces):
- # validate that none of the ifaces
- # is a non-VLANed network over our iface
- for (iface_net, iface_vlan) in ifaces:
- if iface_vlan is None:
- raise ConfigNetworkError(ne.ERR_BAD_PARAMS, 'interface %r '
- 'already member of network %r' %
- (iface, iface_net))
+ iface_nets_by_vlans = ni.getNetsByVlans(iface)
- ifaces_bridgeless = tuple(ni.getBridgelessNetworksAndVlansForIface(iface))
- ifaces_bridged = tuple(ni.getBridgedNetworksAndVlansForIface(iface))
-
- # If non-VLANed bridged network exists
- # we can't add nothing else
- _validateNoDirectNet(ifaces_bridged)
-
- # Multiple VLANed networks (bridged/bridgeless) with only one
- # non-VLANed bridgeless network permited
- if vlan is None:
- # Want to add non-VLANed bridgeless network,
- # check whether interface already has such network.
- # Only one non-VLANed bridgeless network permited
- if not bridged:
- _validateNoDirectNet(ifaces_bridgeless)
- # Want to add non-VLANed bridged network,
- # check whether interface is empty
- elif ifaces_bridged or ifaces_bridgeless:
- raise ConfigNetworkError(ne.ERR_BAD_PARAMS, 'interface %r already '
- 'has networks' % (iface))
+ if vlan in iface_nets_by_vlans:
+ raise ConfigNetworkError(ne.ERR_BAD_PARAMS,
+ 'interface %r cannot be define with this '
+ 'network since it is already defined with '
+ 'network %s' % (iface,
+ iface_nets_by_vlans[vlan]))
def _alterRunningConfig(func):
@@ -305,12 +284,10 @@
raise ConfigNetworkError(ne.ERR_USED_BRIDGE,
'Network already exists')
if bonding:
- _validateInterNetworkCompatibility(_netinfo, vlan, bonding,
- bridged, qosOutbound)
+ _validateInterNetworkCompatibility(_netinfo, vlan, bonding)
else:
for nic in nics:
- _validateInterNetworkCompatibility(_netinfo, vlan, nic,
- bridged, qosOutbound)
+ _validateInterNetworkCompatibility(_netinfo, vlan, nic)
# defaultRoute is set either explicitly by the client, OR if we're adding
# the management network.
--
To view, visit
http://gerrit.ovirt.org/34538
To unsubscribe, visit
http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I0030433ef519ae6699ee8a921b95c0a67f7b2eae
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Ido Barkan <ibarkan(a)redhat.com>