diff options
author | Daniel P. Berrange <berrange@redhat.com> | 2016-07-20 14:23:10 +0100 |
---|---|---|
committer | Amit Shah <amit.shah@redhat.com> | 2016-07-22 13:23:24 +0530 |
commit | 66613974468fb6e1609fb3eabf55981b1ee436cf (patch) | |
tree | d810f59a5682890cbbbbc7b3e36b502b6aa98f66 /tests/qemu-iotests | |
parent | 991e7c46504807bd89ba8debeccc5211e0b7f221 (diff) | |
download | qemu-66613974468fb6e1609fb3eabf55981b1ee436cf.zip |
scripts: refactor the VM class in iotests for reuse
The iotests module has a python class for controlling QEMU
processes. Pull the generic functionality out of this file
and create a scripts/qemu.py module containing a QEMUMachine
class. Put the QTest integration support into a subclass
QEMUQtestMachine.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Message-Id: <1469020993-29426-4-git-send-email-berrange@redhat.com>
Signed-off-by: Amit Shah <amit.shah@redhat.com>
Diffstat (limited to 'tests/qemu-iotests')
-rw-r--r-- | tests/qemu-iotests/iotests.py | 135 |
1 files changed, 4 insertions, 131 deletions
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py index 1687c33efd..14427f44f9 100644 --- a/tests/qemu-iotests/iotests.py +++ b/tests/qemu-iotests/iotests.py @@ -24,8 +24,6 @@ import string import unittest import sys sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'scripts')) -sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'scripts', 'qmp')) -import qmp import qtest import struct import json @@ -41,9 +39,8 @@ qemu_io_args = [os.environ.get('QEMU_IO_PROG', 'qemu-io')] if os.environ.get('QEMU_IO_OPTIONS'): qemu_io_args += os.environ['QEMU_IO_OPTIONS'].strip().split(' ') -qemu_args = [os.environ.get('QEMU_PROG', 'qemu')] -if os.environ.get('QEMU_OPTIONS'): - qemu_args += os.environ['QEMU_OPTIONS'].strip().split(' ') +qemu_prog = [os.environ.get('QEMU_PROG', 'qemu')] +qemu_opts = os.environ.get('QEMU_OPTIONS', '').strip().split(' ') imgfmt = os.environ.get('IMGFMT', 'raw') imgproto = os.environ.get('IMGPROTO', 'file') @@ -148,27 +145,12 @@ def event_match(event, match=None): return True -class VM(object): +class VM(qtest.QEMUMachine): '''A QEMU VM''' def __init__(self): - self._monitor_path = os.path.join(test_dir, 'qemu-mon.%d' % os.getpid()) - self._qemu_log_path = os.path.join(test_dir, 'qemu-log.%d' % os.getpid()) - self._qtest_path = os.path.join(test_dir, 'qemu-qtest.%d' % os.getpid()) - self._args = qemu_args + ['-chardev', - 'socket,id=mon,path=' + self._monitor_path, - '-mon', 'chardev=mon,mode=control', - '-qtest', 'unix:path=' + self._qtest_path, - '-machine', 'accel=qtest', - '-display', 'none', '-vga', 'none'] + super(self, VM).__init__(qemu_prog, qemu_opts, test_dir) self._num_drives = 0 - self._events = [] - - # This can be used to add an unused monitor instance. - def add_monitor_telnet(self, ip, port): - args = 'tcp:%s:%d,server,nowait,telnet' % (ip, port) - self._args.append('-monitor') - self._args.append(args) def add_drive_raw(self, opts): self._args.append('-drive') @@ -211,106 +193,6 @@ class VM(object): return self.qmp('human-monitor-command', command_line='qemu-io %s "%s"' % (drive, cmd)) - def add_fd(self, fd, fdset, opaque, opts=''): - '''Pass a file descriptor to the VM''' - options = ['fd=%d' % fd, - 'set=%d' % fdset, - 'opaque=%s' % opaque] - if opts: - options.append(opts) - - self._args.append('-add-fd') - self._args.append(','.join(options)) - return self - - 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 - return -1 - fd_param = ["%s" % bin, - "%d" % self._qmp.get_sock_fd(), - "%s" % fd_file_path] - devnull = open('/dev/null', 'rb') - p = subprocess.Popen(fd_param, stdin=devnull, stdout=sys.stdout, - stderr=sys.stderr) - return p.wait() - - def launch(self): - '''Launch the VM and establish a QMP connection''' - devnull = open('/dev/null', 'rb') - qemulog = open(self._qemu_log_path, 'wb') - try: - self._qmp = qmp.QEMUMonitorProtocol(self._monitor_path, server=True) - self._qtest = qtest.QEMUQtestProtocol(self._qtest_path, server=True) - self._popen = subprocess.Popen(self._args, stdin=devnull, stdout=qemulog, - stderr=subprocess.STDOUT) - self._qmp.accept() - self._qtest.accept() - except: - _remove_if_exists(self._monitor_path) - _remove_if_exists(self._qtest_path) - raise - - def shutdown(self): - '''Terminate the VM and clean up''' - if not self._popen is None: - self._qmp.cmd('quit') - exitcode = self._popen.wait() - if exitcode < 0: - sys.stderr.write('qemu received signal %i: %s\n' % (-exitcode, ' '.join(self._args))) - os.remove(self._monitor_path) - os.remove(self._qtest_path) - os.remove(self._qemu_log_path) - self._popen = None - - underscore_to_dash = string.maketrans('_', '-') - def qmp(self, cmd, conv_keys=True, **args): - '''Invoke a QMP command and return the result dict''' - qmp_args = dict() - for k in args.keys(): - if conv_keys: - qmp_args[k.translate(self.underscore_to_dash)] = args[k] - else: - qmp_args[k] = args[k] - - return self._qmp.cmd(cmd, args=qmp_args) - - def qtest(self, cmd): - '''Send a qtest command to guest''' - return self._qtest.cmd(cmd) - - def get_qmp_event(self, wait=False): - '''Poll for one queued QMP events and return it''' - if len(self._events) > 0: - return self._events.pop(0) - return self._qmp.pull_event(wait=wait) - - def get_qmp_events(self, wait=False): - '''Poll for queued QMP events and return a list of dicts''' - events = self._qmp.get_events(wait=wait) - events.extend(self._events) - del self._events[:] - self._qmp.clear_events() - return events - - def event_wait(self, name='BLOCK_JOB_COMPLETED', timeout=60.0, match=None): - # Search cached events - for event in self._events: - if (event['event'] == name) and event_match(event, match): - self._events.remove(event) - return event - - # Poll for new events - while True: - event = self._qmp.pull_event(wait=timeout) - if (event['event'] == name) and event_match(event, match): - return event - self._events.append(event) - - return None index_re = re.compile(r'([^\[]+)\[([^\]]+)\]') @@ -427,15 +309,6 @@ class QMPTestCase(unittest.TestCase): event = self.wait_until_completed(drive=drive) self.assert_qmp(event, 'data/type', 'mirror') -def _remove_if_exists(path): - '''Remove file object at path if it exists''' - try: - os.remove(path) - except OSError as exception: - if exception.errno == errno.ENOENT: - return - raise - def notrun(reason): '''Skip this test suite''' # Each test in qemu-iotests has a number ("seq") |