Antoni Segura Puimedon has uploaded a new change for review. Change subject: change the device state monitor to use iproute2 monitor ......................................................................
change the device state monitor to use iproute2 monitor Change-Id: I26f70adb9f2ccb1bd4b8653ed5ad20297785284d Signed-off-by: Antoni S. Puimedon <[email protected]> --- M tests/functional/networkTests.py 1 file changed, 42 insertions(+), 27 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/55/20255/1 diff --git a/tests/functional/networkTests.py b/tests/functional/networkTests.py index 7cb87ad..09a9b7c 100644 --- a/tests/functional/networkTests.py +++ b/tests/functional/networkTests.py @@ -17,8 +17,9 @@ # Refer to the README and COPYING files for full details of the license # from contextlib import contextmanager -from threading import Thread +from threading import Event, Thread import os.path +import subprocess import time import neterrors @@ -34,7 +35,7 @@ from vdsm.ipwrapper import (ruleAdd, ruleDel, routeAdd, routeDel, routeExists, ruleExists, Route, Rule, addrFlush) -from vdsm.netinfo import operstate, prefix2netmask +from vdsm.netinfo import prefix2netmask NETWORK_NAME = 'test-network' @@ -83,39 +84,53 @@ pass +class MonitoringThread(Thread): + def __init__(self, dev): + Thread.__init__(self) + self.dev = dev + self.changes = [] + self.monitoring = Event() + self.done = False + self.process = None + + def _procLines(self): + while not self.done: + line = self.process.stdout.readline() + if not line: + time.sleep(0.1) + continue + yield line + + def run(self): + self.process = subprocess.Popen(['ip', 'monitor', 'link'], + stdout=subprocess.PIPE, close_fds=True) + self.monitoring.set() + try: + for line in self._procLines(): + if '%s:' % self.dev in line: + self.changes.append(line.split()[-1]) + finally: + self.process.kill() + + def finish(self): + self.process.kill() + self.done = True + + @contextmanager def nonChangingOperstate(device): """Raises an exception if it detects that the device operstate changes.""" - # The current implementation is raceful (but empirically tested to work) - # due to the fact that two changes could happen between iterations and no - # exception would be raised. - def changed(dev, changes): - status = operstate(dev) - while not done: - try: - newState = operstate(dev) - time.sleep(0.1) - except IOError as ioe: - _, message = ioe.args - changes.append(message) - break - if status != newState: - changes.append(newState) - status = newState - try: - done = False - changes = [] - monitoring_t = Thread(target=changed, name='operstate_mon', - args=(device, changes)) + monitoring_t = MonitoringThread(device) monitoring_t.start() + monitoring_t.monitoring.wait() yield finally: - time.sleep(3) # So that the last action in yield gets to kernel - done = True - if changes: + monitoring_t.finish() + monitoring_t.join() + if monitoring_t.changes: raise OperStateChangedError('%s operstate changed: %r' % - (device, changes)) + (device, monitoring_t.changes)) @expandPermutations -- To view, visit http://gerrit.ovirt.org/20255 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I26f70adb9f2ccb1bd4b8653ed5ad20297785284d Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Antoni Segura Puimedon <[email protected]> _______________________________________________ vdsm-patches mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches
