mirror of https://gitee.com/openkylin/qemu.git
iotest: fix python based IO tests
The previous commit refactoring iotests.py:
commit 6661397446
Author: Daniel P. Berrange <berrange@redhat.com>
Date: Wed Jul 20 14:23:10 2016 +0100
scripts: refactor the VM class in iotests for reuse
was not properly tested and included a number of broken
bits.
- The 'event_match' method was not moved into qemu.py
- The 'self._args' list parameter in QEMUMachine needs
to be copied otherwise modifications will affect the
global 'qemu_opts' variable in iotests.py
- The QEMUQtestMachine class methods had inverted
parameter order for the super() calls
- The QEMUQtestMachine class forgot to add
'-machine accel=qtest'
- The QEMUQtestMachine class constructor needs to set
a default 'name' value before using it as it may
be None
- The QEMUQtestMachine class constructor needs to use
named parameters when calling the super constructor
as it is leaving out some positional parameters.
- The 'qemu_prog' variable should be a string not a
list in iotests.py
- The VM classs constructor needs to use named
parameters when calling the super constructor
as it is leaving out some positional parameters.
- The path to the socket-scm-helper needs to be
passed into the QEMUMachine class
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Message-id: 1469549767-27249-1-git-send-email-berrange@redhat.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
c7c4cf498f
commit
4c44b4a4c8
|
@ -24,7 +24,7 @@ class QEMUMachine(object):
|
|||
'''A QEMU VM'''
|
||||
|
||||
def __init__(self, binary, args=[], wrapper=[], name=None, test_dir="/var/tmp",
|
||||
monitor_address=None, debug=False):
|
||||
monitor_address=None, socket_scm_helper=None, debug=False):
|
||||
if name is None:
|
||||
name = "qemu-%d" % os.getpid()
|
||||
if monitor_address is None:
|
||||
|
@ -33,10 +33,11 @@ def __init__(self, binary, args=[], wrapper=[], name=None, test_dir="/var/tmp",
|
|||
self._qemu_log_path = os.path.join(test_dir, name + ".log")
|
||||
self._popen = None
|
||||
self._binary = binary
|
||||
self._args = args
|
||||
self._args = list(args) # Force copy args in case we modify them
|
||||
self._wrapper = wrapper
|
||||
self._events = []
|
||||
self._iolog = None
|
||||
self._socket_scm_helper = socket_scm_helper
|
||||
self._debug = debug
|
||||
|
||||
# This can be used to add an unused monitor instance.
|
||||
|
@ -60,11 +61,13 @@ def add_fd(self, fd, fdset, opaque, opts=''):
|
|||
def send_fd_scm(self, fd_file_path):
|
||||
# In iotest.py, the qmp should always use unix socket.
|
||||
assert self._qmp.is_scm_available()
|
||||
bin = socket_scm_helper
|
||||
if os.path.exists(bin) == False:
|
||||
print "Scm help program does not present, path '%s'." % bin
|
||||
if self._socket_scm_helper is None:
|
||||
print >>sys.stderr, "No path to socket_scm_helper set"
|
||||
return -1
|
||||
fd_param = ["%s" % bin,
|
||||
if os.path.exists(self._socket_scm_helper) == False:
|
||||
print >>sys.stderr, "%s does not exist" % self._socket_scm_helper
|
||||
return -1
|
||||
fd_param = ["%s" % self._socket_scm_helper,
|
||||
"%d" % self._qmp.get_sock_fd(),
|
||||
"%s" % fd_file_path]
|
||||
devnull = open('/dev/null', 'rb')
|
||||
|
@ -183,6 +186,23 @@ def get_qmp_events(self, wait=False):
|
|||
return events
|
||||
|
||||
def event_wait(self, name, timeout=60.0, match=None):
|
||||
# Test if 'match' is a recursive subset of 'event'
|
||||
def event_match(event, match=None):
|
||||
if match is None:
|
||||
return True
|
||||
|
||||
for key in match:
|
||||
if key in event:
|
||||
if isinstance(event[key], dict):
|
||||
if not event_match(event[key], match[key]):
|
||||
return False
|
||||
elif event[key] != match[key]:
|
||||
return False
|
||||
else:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
# Search cached events
|
||||
for event in self._events:
|
||||
if (event['event'] == name) and event_match(event, match):
|
||||
|
|
|
@ -79,25 +79,30 @@ def settimeout(self, timeout):
|
|||
class QEMUQtestMachine(qemu.QEMUMachine):
|
||||
'''A QEMU VM'''
|
||||
|
||||
def __init__(self, binary, args=[], name=None, test_dir="/var/tmp"):
|
||||
super(self, QEMUQtestMachine).__init__(binary, args, name, test_dir)
|
||||
def __init__(self, binary, args=[], name=None, test_dir="/var/tmp",
|
||||
socket_scm_helper=None):
|
||||
if name is None:
|
||||
name = "qemu-%d" % os.getpid()
|
||||
super(QEMUQtestMachine, self).__init__(binary, args, name=name, test_dir=test_dir,
|
||||
socket_scm_helper=socket_scm_helper)
|
||||
self._qtest_path = os.path.join(test_dir, name + "-qtest.sock")
|
||||
|
||||
def _base_args(self):
|
||||
args = super(self, QEMUQtestMachine)._base_args()
|
||||
args.extend(['-qtest', 'unix:path=' + self._qtest_path])
|
||||
args = super(QEMUQtestMachine, self)._base_args()
|
||||
args.extend(['-qtest', 'unix:path=' + self._qtest_path,
|
||||
'-machine', 'accel=qtest'])
|
||||
return args
|
||||
|
||||
def _pre_launch(self):
|
||||
super(self, QEMUQtestMachine)._pre_launch()
|
||||
super(QEMUQtestMachine, self)._pre_launch()
|
||||
self._qtest = QEMUQtestProtocol(self._qtest_path, server=True)
|
||||
|
||||
def _post_launch(self):
|
||||
super(self, QEMUQtestMachine)._post_launch()
|
||||
super(QEMUQtestMachine, self)._post_launch()
|
||||
self._qtest.accept()
|
||||
|
||||
def _post_shutdown(self):
|
||||
super(self, QEMUQtestMachine)._post_shutdown()
|
||||
super(QEMUQtestMachine, self)._post_shutdown()
|
||||
self._remove_if_exists(self._qtest_path)
|
||||
|
||||
def qtest(self, cmd):
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
if os.environ.get('QEMU_IO_OPTIONS'):
|
||||
qemu_io_args += os.environ['QEMU_IO_OPTIONS'].strip().split(' ')
|
||||
|
||||
qemu_prog = [os.environ.get('QEMU_PROG', 'qemu')]
|
||||
qemu_prog = os.environ.get('QEMU_PROG', 'qemu')
|
||||
qemu_opts = os.environ.get('QEMU_OPTIONS', '').strip().split(' ')
|
||||
|
||||
imgfmt = os.environ.get('IMGFMT', 'raw')
|
||||
|
@ -128,28 +128,12 @@ def log(msg, filters=[]):
|
|||
msg = flt(msg)
|
||||
print msg
|
||||
|
||||
# Test if 'match' is a recursive subset of 'event'
|
||||
def event_match(event, match=None):
|
||||
if match is None:
|
||||
return True
|
||||
|
||||
for key in match:
|
||||
if key in event:
|
||||
if isinstance(event[key], dict):
|
||||
if not event_match(event[key], match[key]):
|
||||
return False
|
||||
elif event[key] != match[key]:
|
||||
return False
|
||||
else:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
class VM(qtest.QEMUMachine):
|
||||
class VM(qtest.QEMUQtestMachine):
|
||||
'''A QEMU VM'''
|
||||
|
||||
def __init__(self):
|
||||
super(self, VM).__init__(qemu_prog, qemu_opts, test_dir)
|
||||
super(VM, self).__init__(qemu_prog, qemu_opts, test_dir=test_dir,
|
||||
socket_scm_helper=socket_scm_helper)
|
||||
self._num_drives = 0
|
||||
|
||||
def add_drive_raw(self, opts):
|
||||
|
|
Loading…
Reference in New Issue