iotest: fix python based IO tests
The previous commit refactoring iotests.py:
  commit 66613974468fb6e1609fb3eabf55981b1ee436cf
  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 @@ class QEMUMachine(object): | ||||
|         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 @@ class QEMUMachine(object): | ||||
|     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 @@ class QEMUMachine(object): | ||||
|         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 @@ class QEMUQtestProtocol(object): | ||||
| 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 @@ 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_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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Daniel P. Berrange
						Daniel P. Berrange