mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
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
4 changed files with 100 additions and 0 deletions
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
|
||||
190 rw auto quick
|
||||
192 rw auto quick
|
||||
194 rw auto migration quick
|
||||
|
|
|
@ -133,6 +133,14 @@ def filter_qemu_io(msg):
|
|||
def filter_chown(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=[]):
|
||||
for flt in filters:
|
||||
msg = flt(msg)
|
||||
|
@ -200,6 +208,11 @@ def add_blockdev(self, opts):
|
|||
self._args.append(','.join(opts))
|
||||
return self
|
||||
|
||||
def add_incoming(self, addr):
|
||||
self._args.append('-incoming')
|
||||
self._args.append(addr)
|
||||
return self
|
||||
|
||||
def pause_drive(self, drive, event=None):
|
||||
'''Pause drive r/w operations'''
|
||||
if not event:
|
||||
|
|
Loading…
Reference in a new issue