Change in vdsm[master]: netlink: replace old ipwrapper event monitor

phoracek at redhat.com phoracek at redhat.com
Fri Nov 7 11:36:41 UTC 2014


Petr Horáček has uploaded a new change for review.

Change subject: netlink: replace old ipwrapper event monitor
......................................................................

netlink: replace old ipwrapper event monitor

Change-Id: Ie7a9765e59a8392fff9b3fd556133159aeb60b1c
Signed-off-by: Petr Horáček <phoracek at redhat.com>
---
M lib/vdsm/ipwrapper.py
M tests/functional/networkTests.py
2 files changed, 8 insertions(+), 81 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/29/34929/1

diff --git a/lib/vdsm/ipwrapper.py b/lib/vdsm/ipwrapper.py
index 89280e7..f7c518d 100644
--- a/lib/vdsm/ipwrapper.py
+++ b/lib/vdsm/ipwrapper.py
@@ -17,7 +17,6 @@
 # Refer to the README and COPYING files for full details of the license
 #
 
-from collections import namedtuple
 from contextlib import closing
 from glob import iglob
 import array
@@ -25,7 +24,6 @@
 import errno
 import fcntl
 import os
-import signal
 import socket
 import struct
 
@@ -622,69 +620,3 @@
 def linkDel(dev):
     command = [_IP_BINARY.cmd, 'link', 'del', 'dev', dev]
     _execCmd(command)
-
-
-MonitorEvent = namedtuple('MonitorEvent', ['index', 'device', 'flags',
-                                           'state'])
-
-
-class Monitor(object):
-    """Wrapper over `ip monitor link`. Usage:
-    Get events collected while the monitor was running:
-
-        mon = Monitor()
-        mon.start()
-        ....
-        mon.stop()
-        for event in mon:
-            handle event
-
-    Monitoring events forever:
-        mon = Monitor()
-        mon.start()
-        for event in mon:
-            handle event
-
-    Note that the underlying `ip monitor` process is killed when its controlled
-    thread dies, so as not to leave stray processes when Vdsm crahsed.
-    """
-    _DELETED_TEXT = 'Deleted'
-    LINK_STATE_DELETED = 'DELETED'
-
-    def __init__(self):
-        self.proc = None
-
-    def __iter__(self):
-        if self.proc is None:
-            raise MonitorError('The monitor has not run yet')
-        for line in self.proc.stdout:
-            yield self._parseLine(line)
-
-    def start(self):
-        self.proc = execCmd([_IP_BINARY.cmd, '-d', '-o', 'monitor', 'link'],
-                            deathSignal=signal.SIGKILL,
-                            sync=False)
-        self.proc.blocking = True
-
-    def stop(self):
-        self.proc.kill()
-        self.proc.wait()
-
-    @classmethod
-    def _parseLine(cls, line):
-        state = None
-        if line.startswith(cls._DELETED_TEXT):
-            state = cls.LINK_STATE_DELETED
-            line = line[len(cls._DELETED_TEXT):]
-
-        data = _parseLinkLine(line)
-        # Consider everything with an '@' symbol a vlan/macvlan/macvtap
-        # since that's how iproute2 reports it and there is currently no
-        # disambiguation (iproute bug https://bugzilla.redhat.com/1042799
-        data['name'] = data['name'].split('@', 1)[0]
-        state = state if state or 'state' not in data else data['state']
-        return MonitorEvent(data['index'], data['name'], data['flags'], state)
-
-    @classmethod
-    def _parse(cls, text):
-        return [cls._parseLine(line) for line in text.splitlines()]
diff --git a/tests/functional/networkTests.py b/tests/functional/networkTests.py
index f7c6893..d38c1f6 100644
--- a/tests/functional/networkTests.py
+++ b/tests/functional/networkTests.py
@@ -20,7 +20,6 @@
 from functools import wraps
 import os.path
 import json
-import signal
 import netaddr
 
 from hookValidation import ValidatesHook
@@ -46,6 +45,7 @@
 from vdsm.utils import RollbackContext, execCmd
 from vdsm.netinfo import (bridges, operstate, prefix2netmask, getRouteDeviceTo,
                           getDhclientIfaces)
+from vdsm.netlink import Monitor
 from vdsm import ipwrapper
 from vdsm.utils import pgrep
 
@@ -165,20 +165,15 @@
 
 def _waitForKnownOperstate(device, timeout=1):
 
-    def _alarmHandler(signum, frame):
-        raise Alarm
-
-    monitor = ipwrapper.Monitor()
+    monitor = Monitor(groups=['link'], timeout=1)
     monitor.start()
+
     try:
-        state = operstate(device).upper()
-        if state == 'UNKNOWN':
-            signal.signal(signal.SIGALRM, _alarmHandler)
-            signal.alarm(timeout)
+        state = operstate(device).lower()
+        if state == 'unknown':
             for event in monitor:
-                if event.device == device and event.state != 'UNKNOWN':
+                if event.device == device and event.state != 'unknown':
                     break
-            signal.alarm(0)
     finally:
         monitor.stop()
 
@@ -190,8 +185,8 @@
 @contextmanager
 def nonChangingOperstate(device):
     """Raises an exception if it detects that the device link state changes."""
-    originalState = operstate(device).upper()
-    monitor = ipwrapper.Monitor()
+    originalState = operstate(device).lower()
+    monitor = Monitor()
     monitor.start()
     try:
         yield


-- 
To view, visit http://gerrit.ovirt.org/34929
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie7a9765e59a8392fff9b3fd556133159aeb60b1c
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Petr Horáček <phoracek at redhat.com>


More information about the vdsm-patches mailing list