qemu-iotests: add 194 non-shared storage migration test
Non-shared storage migration with NBD and drive-mirror is currently not tested by qemu-iotests. This test case covers the basic migration scenario. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Based-on: <20170823134242.12080-1-famz@redhat.com> Message-Id: <20170823140506.28723-1-stefanha@redhat.com> Tested-by: Eric Blake <eblake@redhat.com> Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
		
							parent
							
								
									7d5b526110
								
							
						
					
					
						commit
						12314f2d14
					
				
							
								
								
									
										73
									
								
								tests/qemu-iotests/194
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										73
									
								
								tests/qemu-iotests/194
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,73 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env python
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Copyright (C) 2017 Red Hat, Inc.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
 | 
					# it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					# the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
 | 
					# (at your option) any later version.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					# GNU General Public License for more details.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Creator/Owner: Stefan Hajnoczi <stefanha@redhat.com>
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Non-shared storage migration test using NBD server and drive-mirror
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					import atexit
 | 
				
			||||||
 | 
					import iotests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					iotests.verify_platform(['linux'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					img_size = '1G'
 | 
				
			||||||
 | 
					source_img_path = os.path.join(iotests.test_dir, 'source.img')
 | 
				
			||||||
 | 
					dest_img_path = os.path.join(iotests.test_dir, 'dest.img')
 | 
				
			||||||
 | 
					iotests.qemu_img_pipe('create', '-f', iotests.imgfmt, source_img_path, img_size)
 | 
				
			||||||
 | 
					iotests.qemu_img_pipe('create', '-f', iotests.imgfmt, dest_img_path, img_size)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					iotests.log('Launching VMs...')
 | 
				
			||||||
 | 
					migration_sock_path = os.path.join(iotests.test_dir, 'migration.sock')
 | 
				
			||||||
 | 
					nbd_sock_path = os.path.join(iotests.test_dir, 'nbd.sock')
 | 
				
			||||||
 | 
					source_vm = iotests.VM('source').add_drive(source_img_path)
 | 
				
			||||||
 | 
					dest_vm = (iotests.VM('dest').add_drive(dest_img_path)
 | 
				
			||||||
 | 
					                             .add_incoming('unix:{0}'.format(migration_sock_path)))
 | 
				
			||||||
 | 
					source_vm.launch()
 | 
				
			||||||
 | 
					atexit.register(source_vm.shutdown)
 | 
				
			||||||
 | 
					dest_vm.launch()
 | 
				
			||||||
 | 
					atexit.register(dest_vm.shutdown)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					iotests.log('Launching NBD server on destination...')
 | 
				
			||||||
 | 
					iotests.log(dest_vm.qmp('nbd-server-start', addr={'type': 'unix', 'data': {'path': nbd_sock_path}}))
 | 
				
			||||||
 | 
					iotests.log(dest_vm.qmp('nbd-server-add', device='drive0', writable=True))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					iotests.log('Starting drive-mirror on source...')
 | 
				
			||||||
 | 
					iotests.log(source_vm.qmp(
 | 
				
			||||||
 | 
					              'drive-mirror',
 | 
				
			||||||
 | 
					              device='drive0',
 | 
				
			||||||
 | 
					              target='nbd+unix:///drive0?socket={0}'.format(nbd_sock_path),
 | 
				
			||||||
 | 
					              sync='full',
 | 
				
			||||||
 | 
					              format='raw', # always raw, the server handles the format
 | 
				
			||||||
 | 
					              mode='existing'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					iotests.log('Waiting for drive-mirror to complete...')
 | 
				
			||||||
 | 
					iotests.log(source_vm.event_wait('BLOCK_JOB_READY'),
 | 
				
			||||||
 | 
					            filters=[iotests.filter_qmp_event])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					iotests.log('Starting migration...')
 | 
				
			||||||
 | 
					source_vm.qmp('migrate-set-capabilities',
 | 
				
			||||||
 | 
					              capabilities=[{'capability': 'events', 'state': True}])
 | 
				
			||||||
 | 
					dest_vm.qmp('migrate-set-capabilities',
 | 
				
			||||||
 | 
					            capabilities=[{'capability': 'events', 'state': True}])
 | 
				
			||||||
 | 
					iotests.log(source_vm.qmp('migrate', uri='unix:{0}'.format(migration_sock_path)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					while True:
 | 
				
			||||||
 | 
					    event = source_vm.event_wait('MIGRATION')
 | 
				
			||||||
 | 
					    iotests.log(event, filters=[iotests.filter_qmp_event])
 | 
				
			||||||
 | 
					    if event['data']['status'] in ('completed', 'failed'):
 | 
				
			||||||
 | 
					        break
 | 
				
			||||||
							
								
								
									
										13
									
								
								tests/qemu-iotests/194.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								tests/qemu-iotests/194.out
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					Launching VMs...
 | 
				
			||||||
 | 
					Launching NBD server on destination...
 | 
				
			||||||
 | 
					{u'return': {}}
 | 
				
			||||||
 | 
					{u'return': {}}
 | 
				
			||||||
 | 
					Starting drive-mirror on source...
 | 
				
			||||||
 | 
					{u'return': {}}
 | 
				
			||||||
 | 
					Waiting for drive-mirror to complete...
 | 
				
			||||||
 | 
					{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'device': u'drive0', u'type': u'mirror', u'speed': 0, u'len': 1073741824, u'offset': 1073741824}, u'event': u'BLOCK_JOB_READY'}
 | 
				
			||||||
 | 
					Starting migration...
 | 
				
			||||||
 | 
					{u'return': {}}
 | 
				
			||||||
 | 
					{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'setup'}, u'event': u'MIGRATION'}
 | 
				
			||||||
 | 
					{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'active'}, u'event': u'MIGRATION'}
 | 
				
			||||||
 | 
					{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'completed'}, u'event': u'MIGRATION'}
 | 
				
			||||||
@ -187,3 +187,4 @@
 | 
				
			|||||||
189 rw auto
 | 
					189 rw auto
 | 
				
			||||||
190 rw auto quick
 | 
					190 rw auto quick
 | 
				
			||||||
192 rw auto quick
 | 
					192 rw auto quick
 | 
				
			||||||
 | 
					194 rw auto migration quick
 | 
				
			||||||
 | 
				
			|||||||
@ -133,6 +133,14 @@ chown_re = re.compile(r"chown [0-9]+:[0-9]+")
 | 
				
			|||||||
def filter_chown(msg):
 | 
					def filter_chown(msg):
 | 
				
			||||||
    return chown_re.sub("chown UID:GID", msg)
 | 
					    return chown_re.sub("chown UID:GID", msg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def filter_qmp_event(event):
 | 
				
			||||||
 | 
					    '''Filter a QMP event dict'''
 | 
				
			||||||
 | 
					    event = dict(event)
 | 
				
			||||||
 | 
					    if 'timestamp' in event:
 | 
				
			||||||
 | 
					        event['timestamp']['seconds'] = 'SECS'
 | 
				
			||||||
 | 
					        event['timestamp']['microseconds'] = 'USECS'
 | 
				
			||||||
 | 
					    return event
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def log(msg, filters=[]):
 | 
					def log(msg, filters=[]):
 | 
				
			||||||
    for flt in filters:
 | 
					    for flt in filters:
 | 
				
			||||||
        msg = flt(msg)
 | 
					        msg = flt(msg)
 | 
				
			||||||
@ -200,6 +208,11 @@ class VM(qtest.QEMUQtestMachine):
 | 
				
			|||||||
            self._args.append(','.join(opts))
 | 
					            self._args.append(','.join(opts))
 | 
				
			||||||
        return self
 | 
					        return self
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def add_incoming(self, addr):
 | 
				
			||||||
 | 
					        self._args.append('-incoming')
 | 
				
			||||||
 | 
					        self._args.append(addr)
 | 
				
			||||||
 | 
					        return self
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def pause_drive(self, drive, event=None):
 | 
					    def pause_drive(self, drive, event=None):
 | 
				
			||||||
        '''Pause drive r/w operations'''
 | 
					        '''Pause drive r/w operations'''
 | 
				
			||||||
        if not event:
 | 
					        if not event:
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user