Change in vdsm[master]: tests: Extract nettestlib module

nsoffer at redhat.com nsoffer at redhat.com
Thu Jul 30 16:34:59 UTC 2015


Nir Soffer has uploaded a new change for review.

Change subject: tests: Extract nettestlib module
......................................................................

tests: Extract nettestlib module

ipwrapperTests was using tcTests as a library. Move the shared code to
new module and use it from both tcTests and ipwrapperTests.

Change-Id: I22b491120eb8be5b7ad0087ce21c489e6c04e24e
Signed-off-by: Nir Soffer <nsoffer at redhat.com>
---
M tests/Makefile.am
M tests/ipwrapperTests.py
A tests/nettestlib.py
M tests/tcTests.py
4 files changed, 182 insertions(+), 159 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/12/44212/1

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 3152735..174982c 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -189,6 +189,7 @@
 	apiData.py \
 	hookValidation.py \
 	monkeypatch.py \
+	nettestlib.py \
 	storagefakelib.py \
 	storagetestlib.py \
 	testlib.py \
diff --git a/tests/ipwrapperTests.py b/tests/ipwrapperTests.py
index bd3007d..bcef590 100644
--- a/tests/ipwrapperTests.py
+++ b/tests/ipwrapperTests.py
@@ -22,8 +22,8 @@
 from vdsm import ipwrapper
 from vdsm.ipwrapper import Route
 from vdsm.ipwrapper import Rule
-import tcTests
 
+from nettestlib import Bridge, checkDependencies
 from testlib import VdsmTestCase as TestCaseBase
 
 
@@ -95,8 +95,8 @@
 
     @ValidateRunningAsRoot
     def setUp(self):
-        tcTests._checkDependencies()
-        self._bridge = tcTests._Bridge()
+        checkDependencies()
+        self._bridge = Bridge()
         self._bridge.addDevice()
 
     def tearDown(self):
@@ -113,8 +113,8 @@
 
     @ValidateRunningAsRoot
     def setUp(self):
-        tcTests._checkDependencies()
-        self._bridge = tcTests._Bridge()
+        checkDependencies()
+        self._bridge = Bridge()
         self._bridge.addDevice()
 
     def tearDown(self):
@@ -140,10 +140,10 @@
 
     @ValidateRunningAsRoot
     def setUp(self):
-        tcTests._checkDependencies()
+        checkDependencies()
         # First 3 Hebrew letters
         # See http://unicode.org/charts/PDF/U0590.pdf
-        self._bridge = tcTests._Bridge("\xd7\x90\xd7\x91\xd7\x92")
+        self._bridge = Bridge("\xd7\x90\xd7\x91\xd7\x92")
         self._bridge.addDevice()
 
     def tearDown(self):
diff --git a/tests/nettestlib.py b/tests/nettestlib.py
new file mode 100644
index 0000000..44a831d
--- /dev/null
+++ b/tests/nettestlib.py
@@ -0,0 +1,166 @@
+# Copyright 2015 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
+#
+# Refer to the README and COPYING files for full details of the license
+#
+
+import errno
+import fcntl
+import os
+import platform
+import random
+import signal
+import struct
+from multiprocessing import Process
+
+from nose.plugins.skip import SkipTest
+
+from vdsm.constants import EXT_BRCTL, EXT_TC
+from vdsm.netlink import monitor
+from vdsm.utils import execCmd, random_iface_name
+
+EXT_IP = "/sbin/ip"
+
+
+class ExecError(RuntimeError):
+    def __init__(self, msg, out, err):
+        super(ExecError, self).__init__(msg)
+        self.out = out
+        self.err = err
+
+
+def check_call(cmd):
+    rc, out, err = execCmd(cmd, raw=True)
+    if rc != 0:
+        raise ExecError(
+            'Command %s returned non-zero exit status %s.' % (cmd, rc),
+            out, err)
+
+
+class Interface():
+
+    def __init__(self, prefix='vdsm-'):
+        self.devName = random_iface_name(prefix)
+
+    def _ifUp(self):
+        check_call([EXT_IP, "link", "set", self.devName, "up"])
+
+    def _ifDown(self):
+        with monitor.Monitor(groups=('link',), timeout=2) as mon:
+            check_call([EXT_IP, "link", "set", self.devName, "down"])
+            for event in mon:
+                if (event.get('name') == self.devName and
+                        event.get('state') == 'down'):
+                    return
+
+    def __str__(self):
+        return "<{1} {2!r}>".format(self.__class__.__name__, self.devName)
+
+
+class Bridge(Interface):
+
+    def addDevice(self):
+        check_call([EXT_BRCTL, 'addbr', self.devName])
+        # learning interval is different on different kernels, so set it
+        # explicit for 2.x kernels
+        if os.uname()[2].startswith("2"):
+            check_call([EXT_BRCTL, 'setfd', self.devName, '0'])
+            check_call([EXT_BRCTL, 'setageing', self.devName, '0'])
+        self._ifUp()
+
+    def delDevice(self):
+        self._ifDown()
+        check_call([EXT_BRCTL, 'delbr', self.devName])
+
+    def addIf(self, dev):
+        check_call([EXT_BRCTL, 'addif', self.devName, dev])
+
+
+def _listenOnDevice(fd, icmp):
+    while True:
+        packet = os.read(fd, 2048)
+        # check if it is an IP packet
+        if (packet[12:14] == chr(0x08) + chr(0x00)):
+            if packet == icmp:
+                return
+
+
+class Tap(Interface):
+
+    _IFF_TAP = 0x0002
+    _IFF_NO_PI = 0x1000
+    arch = platform.machine()
+    if arch == 'x86_64':
+        _TUNSETIFF = 0x400454ca
+    elif arch == 'ppc64':
+        _TUNSETIFF = 0x800454ca
+    else:
+        raise SkipTest("Unsupported Architecture %s" % arch)
+
+    _deviceListener = None
+
+    def addDevice(self):
+        self._cloneDevice = open('/dev/net/tun', 'r+b')
+        ifr = struct.pack('16sH', self.devName, self._IFF_TAP |
+                          self._IFF_NO_PI)
+        fcntl.ioctl(self._cloneDevice, self._TUNSETIFF, ifr)
+        self._ifUp()
+
+    def delDevice(self):
+        self._ifDown()
+        self._cloneDevice.close()
+
+    def startListener(self, icmp):
+        self._deviceListener = Process(target=_listenOnDevice,
+                                       args=(self._cloneDevice.fileno(), icmp))
+        self._deviceListener.start()
+
+    def isListenerAlive(self):
+        if self._deviceListener:
+            return self._deviceListener.is_alive()
+        else:
+            return False
+
+    def stopListener(self):
+        if self._deviceListener:
+            os.kill(self._deviceListener.pid, signal.SIGKILL)
+            self._deviceListener.join()
+
+    def writeToDevice(self, icmp):
+        os.write(self._cloneDevice.fileno(), icmp)
+
+
+def checkDependencies():
+
+    # hack to avoid name collision in concurrently-running mock-based tests
+    random.jumpahead(os.getpid())
+
+    dev = Bridge()
+    try:
+        dev.addDevice()
+    except OSError as e:
+        if e.errno == errno.ENOENT:
+            raise SkipTest("Cannot run %r: %s\nDo you have bridge-utils "
+                           "installed?" % (EXT_BRCTL, e))
+        raise
+
+    try:
+        check_call([EXT_TC, 'qdisc', 'add', 'dev', dev.devName, 'ingress'])
+    except ExecError as e:
+        raise SkipTest("%r has failed: %s\nDo you have Traffic Control kernel "
+                       "modules installed?" % (EXT_TC, e.err))
+    finally:
+        dev.delDevice()
diff --git a/tests/tcTests.py b/tests/tcTests.py
index 942f63f..8c894ba 100644
--- a/tests/tcTests.py
+++ b/tests/tcTests.py
@@ -19,173 +19,29 @@
 # Refer to the README and COPYING files for full details of the license
 #
 
-import errno
-import random
 import time
 import os
-import signal
 import six
 import sys
 
-from multiprocessing import Process
 from binascii import unhexlify
 from itertools import izip_longest
 from subprocess import Popen, PIPE
-import fcntl
-import struct
 
 from testlib import VdsmTestCase as TestCaseBase
 from testValidation import ValidateRunningAsRoot
+from nettestlib import Bridge, Tap, checkDependencies
 
-from vdsm.constants import EXT_BRCTL, EXT_TC
-from vdsm.netlink import monitor
-from vdsm.utils import execCmd, random_iface_name
-
-from nose.plugins.skip import SkipTest
-
+from vdsm.constants import EXT_TC
 from network import tc
-import platform
-
-EXT_IP = "/sbin/ip"
-
-
-class ExecError(RuntimeError):
-    def __init__(self, msg, out, err):
-        super(ExecError, self).__init__(msg)
-        self.out = out
-        self.err = err
-
-
-def check_call(cmd):
-    rc, out, err = execCmd(cmd, raw=True)
-    if rc != 0:
-        raise ExecError(
-            'Command %s returned non-zero exit status %s.' % (cmd, rc),
-            out, err)
-
-
-class _Interface():
-
-    def __init__(self, prefix='vdsm-'):
-        self.devName = random_iface_name(prefix)
-
-    def _ifUp(self):
-        check_call([EXT_IP, "link", "set", self.devName, "up"])
-
-    def _ifDown(self):
-        with monitor.Monitor(groups=('link',), timeout=2) as mon:
-            check_call([EXT_IP, "link", "set", self.devName, "down"])
-            for event in mon:
-                if (event.get('name') == self.devName and
-                        event.get('state') == 'down'):
-                    return
-
-    def __str__(self):
-        return "<{1} {2!r}>".format(self.__class__.__name__, self.devName)
-
-
-class _Bridge(_Interface):
-
-    def addDevice(self):
-        check_call([EXT_BRCTL, 'addbr', self.devName])
-        # learning interval is different on different kernels, so set it
-        # explicit for 2.x kernels
-        if os.uname()[2].startswith("2"):
-            check_call([EXT_BRCTL, 'setfd', self.devName, '0'])
-            check_call([EXT_BRCTL, 'setageing', self.devName, '0'])
-        self._ifUp()
-
-    def delDevice(self):
-        self._ifDown()
-        check_call([EXT_BRCTL, 'delbr', self.devName])
-
-    def addIf(self, dev):
-        check_call([EXT_BRCTL, 'addif', self.devName, dev])
-
-
-def _listenOnDevice(fd, icmp):
-    while True:
-        packet = os.read(fd, 2048)
-        # check if it is an IP packet
-        if (packet[12:14] == chr(0x08) + chr(0x00)):
-            if packet == icmp:
-                return
-
-
-class Tap(_Interface):
-
-    _IFF_TAP = 0x0002
-    _IFF_NO_PI = 0x1000
-    arch = platform.machine()
-    if arch == 'x86_64':
-        _TUNSETIFF = 0x400454ca
-    elif arch == 'ppc64':
-        _TUNSETIFF = 0x800454ca
-    else:
-        raise SkipTest("Unsupported Architecture %s" % arch)
-
-    _deviceListener = None
-
-    def addDevice(self):
-        self._cloneDevice = open('/dev/net/tun', 'r+b')
-        ifr = struct.pack('16sH', self.devName, self._IFF_TAP |
-                          self._IFF_NO_PI)
-        fcntl.ioctl(self._cloneDevice, self._TUNSETIFF, ifr)
-        self._ifUp()
-
-    def delDevice(self):
-        self._ifDown()
-        self._cloneDevice.close()
-
-    def startListener(self, icmp):
-        self._deviceListener = Process(target=_listenOnDevice,
-                                       args=(self._cloneDevice.fileno(), icmp))
-        self._deviceListener.start()
-
-    def isListenerAlive(self):
-        if self._deviceListener:
-            return self._deviceListener.is_alive()
-        else:
-            return False
-
-    def stopListener(self):
-        if self._deviceListener:
-            os.kill(self._deviceListener.pid, signal.SIGKILL)
-            self._deviceListener.join()
-
-    def writeToDevice(self, icmp):
-        os.write(self._cloneDevice.fileno(), icmp)
-
-
-def _checkDependencies():
-
-    # hack to avoid name collision in concurrently-running mock-based tests
-    random.jumpahead(os.getpid())
-
-    dev = _Bridge()
-    try:
-        dev.addDevice()
-    except OSError as e:
-        if e.errno == errno.ENOENT:
-            raise SkipTest("Cannot run %r: %s\nDo you have bridge-utils "
-                           "installed?" % (EXT_BRCTL, e))
-        raise
-
-    try:
-        check_call([EXT_TC, 'qdisc', 'add', 'dev', dev.devName, 'ingress'])
-    except ExecError as e:
-        raise SkipTest("%r has failed: %s\nDo you have Traffic Control kernel "
-                       "modules installed?" % (EXT_TC, e.err))
-    finally:
-        dev.delDevice()
 
 
 class TestQdisc(TestCaseBase):
 
     @ValidateRunningAsRoot
     def setUp(self):
-        _checkDependencies()
-        self._bridge = _Bridge()
+        checkDependencies()
+        self._bridge = Bridge()
         self._bridge.addDevice()
 
     def tearDown(self):
@@ -431,13 +287,13 @@
 
     @ValidateRunningAsRoot
     def setUp(self):
-        _checkDependencies()
+        checkDependencies()
         self._tap0 = Tap()
         self._tap1 = Tap()
         self._tap2 = Tap()
-        self._bridge0 = _Bridge('src-')
-        self._bridge1 = _Bridge('target-')
-        self._bridge2 = _Bridge('target2-')
+        self._bridge0 = Bridge('src-')
+        self._bridge1 = Bridge('target-')
+        self._bridge2 = Bridge('target2-')
         self._devices = [self._tap0, self._tap1, self._tap2,
                          self._bridge0, self._bridge1, self._bridge2]
         # If setUp raise, teardown is not called, so we should either succeed,


-- 
To view, visit https://gerrit.ovirt.org/44212
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I22b491120eb8be5b7ad0087ce21c489e6c04e24e
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Nir Soffer <nsoffer at redhat.com>


More information about the vdsm-patches mailing list