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