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