Ondřej Svoboda has uploaded a new change for review. Change subject: veth: introduce a context manager to create and destroy a veth pair ......................................................................
veth: introduce a context manager to create and destroy a veth pair Change-Id: I58688d23ea059ced35c77fd1c4262543582ae53b Signed-off-by: Ondřej Svoboda <[email protected]> --- M tests/functional/networkTests.py M tests/functional/veth.py M tests/netinfoTests.py 3 files changed, 39 insertions(+), 48 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/45/38945/1 diff --git a/tests/functional/networkTests.py b/tests/functional/networkTests.py index 07f5e86..aa2a373 100644 --- a/tests/functional/networkTests.py +++ b/tests/functional/networkTests.py @@ -150,16 +150,6 @@ dummyPool.add(nic) -@contextmanager -def vethIf(): - """ Yields a tuple containing pair of veth devices.""" - (left, right) = veth.create() - try: - yield (left, right) - finally: - veth.remove(left) - - def _waitForKnownOperstate(device, timeout=1): with monitor.Monitor(groups=('link',), timeout=timeout) as mon: state = operstate(device).lower() @@ -421,7 +411,7 @@ <= (ARP_REQUEST_SIZE + DHCP_PACKET_SIZE), '%s is out of range' % diff) - with vethIf() as (left, right): + with veth.pair() as (left, right): # disabling IPv6 on Interface for removal of Router Solicitation sysctl.disable_ipv6(left) sysctl.disable_ipv6(right) @@ -1755,7 +1745,7 @@ if el6 and 6 in families: raise SkipTest("el6's dnsmasq does not support DHCPv6") - with vethIf() as (left, right): + with veth.pair() as (left, right): veth.setIP(left, IP_ADDRESS, IP_CIDR) veth.setIP(left, IPv6_ADDRESS, IPv6_CIDR, 6) veth.setLinkUp(left) @@ -1861,7 +1851,7 @@ ifcfg_bootproto) self.assertEqual(bridges[NETWORK_NAME]['dhcpv4'], dhcp) - with vethIf() as (left, right): + with veth.pair() as (left, right): veth.setIP(left, IP_ADDRESS, IP_CIDR) veth.setLinkUp(left) el6 = _system_is_el6() @@ -1885,7 +1875,7 @@ dhcpv4_ifaces = set() dhcpv6_ifaces = set() - with vethIf() as (server, client): + with veth.pair() as (server, client): veth.setIP(server, IP_ADDRESS, IP_CIDR) veth.setIP(server, IPv6_ADDRESS, IPv6_CIDR, 6) veth.setLinkUp(server) @@ -2170,7 +2160,7 @@ return [open('/proc/%s/cmdline' % pid).read().strip('\0') .split('\0')[-1] for pid in pids] - with vethIf() as (server, client): + with veth.pair() as (server, client): veth.setIP(server, IP_ADDRESS, IP_CIDR) veth.setLinkUp(server) with dnsmasqDhcp(server, _system_is_el6()): diff --git a/tests/functional/veth.py b/tests/functional/veth.py index d28fd6a..3f0b71d 100644 --- a/tests/functional/veth.py +++ b/tests/functional/veth.py @@ -16,32 +16,35 @@ # # Refer to the README and COPYING files for full details of the license # +from contextlib import contextmanager + from nose.plugins.skip import SkipTest -import dummy from vdsm.ipwrapper import linkAdd, IPRoute2Error from vdsm.utils import random_iface_name +import dummy -def create(prefix='veth_', max_length=15): + +@contextmanager +def pair(prefix='veth_', max_length=15): """ - Create a veth interface with a pseudo-random suffix (e.g. veth_m6Lz7uMK9c) - for both endpoints. Use the longest possible name length by default. - This assumes root privileges. + Yield a pair of veth devices. This assumes root privileges (currently + required by all tests anyway). + + Both sides of the pair have a pseudo-random suffix (e.g. veth_m6Lz7uMK9c). """ - leftPoint = random_iface_name(prefix, max_length) - rightPoint = random_iface_name(prefix, max_length) + left_side = random_iface_name(prefix, max_length) + right_side = random_iface_name(prefix, max_length) try: - linkAdd(leftPoint, linkType='veth', args=('peer', 'name', rightPoint)) + linkAdd(left_side, linkType='veth', + args=('peer', 'name', right_side)) + yield left_side, right_side except IPRoute2Error: - raise SkipTest('Failed to create a veth interface') - else: - return (leftPoint, rightPoint) - - -# the peer device is removed by the kernel -remove = dummy.remove -remove + raise SkipTest('Failed to create a veth pair.') + finally: + # the peer device is removed by the kernel + dummy.remove(left_side) setIP = dummy.setIP diff --git a/tests/netinfoTests.py b/tests/netinfoTests.py index d70f92a..fb43089 100644 --- a/tests/netinfoTests.py +++ b/tests/netinfoTests.py @@ -180,24 +180,22 @@ def testFakeNics(self): with MonkeyPatchScope([(ipwrapper.Link, '_fakeNics', ['veth_*', 'dummy_*'])]): - d1 = dummy.create() - d2 = dummy.create(prefix='mehd_') - v1a, v1b = veth.create() - v2a, v2b = veth.create(prefix='mehv_') + with veth.pair() as (v1a, v1b): + d1 = dummy.create() + fakes = set([d1, v1a, v1b]) + nics = netinfo.nics() + dummy.remove(d1) + self.assertTrue(fakes.issubset(nics), 'Fake devices %s are not' + ' listed in nics %s' % (fakes, nics)) - fakes = set([d1, v1a, v1b]) - hiddens = set([d2, v2a, v2b]) - nics = netinfo.nics() - dummy.remove(d1) - dummy.remove(d2) - veth.remove(v1a) - veth.remove(v2a) - - self.assertTrue(fakes.issubset(nics), 'Fake devices %s are not ' - 'listed in nics %s' % (fakes, nics)) - self.assertFalse(hiddens.intersection(nics), 'Some of hidden ' - 'devices %s is shown in nics %s' % (hiddens, - nics)) + with veth.pair(prefix='mehv_') as (v2a, v2b): + d2 = dummy.create(prefix='mehd_') + hiddens = set([d2, v2a, v2b]) + dummy.remove(d2) + nics = netinfo.nics() + self.assertFalse(hiddens.intersection(nics), 'Some of hidden ' + 'devices %s is shown in nics %s' % (hiddens, + nics)) def testGetIfaceCfg(self): deviceName = "___This_could_never_be_a_device_name___" -- To view, visit https://gerrit.ovirt.org/38945 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I58688d23ea059ced35c77fd1c4262543582ae53b Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Ondřej Svoboda <[email protected]> _______________________________________________ vdsm-patches mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches
