Skip to content

Commit

Permalink
qemu-iotests: Block migration test
Browse files Browse the repository at this point in the history
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Jeff Cody <jcody@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
  • Loading branch information
kevmw committed Jun 9, 2017
1 parent 362fdf1 commit 49695ee
Show file tree
Hide file tree
Showing 3 changed files with 187 additions and 0 deletions.
140 changes: 140 additions & 0 deletions tests/qemu-iotests/183
@@ -0,0 +1,140 @@
#!/bin/bash
#
# Test old-style block migration (migrate -b)
#
# 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=kwolf@redhat.com

seq=`basename $0`
echo "QA output created by $seq"

here=`pwd`
status=1 # failure is the default!

MIG_SOCKET="${TEST_DIR}/migrate"

_cleanup()
{
rm -f "${MIG_SOCKET}"
rm -f "${TEST_IMG}.dest"
_cleanup_test_img
_cleanup_qemu
}
trap "_cleanup; exit \$status" 0 1 2 3 15

# get standard environment, filters and checks
. ./common.rc
. ./common.filter
. ./common.qemu

_supported_fmt qcow2 raw qed dmg quorum
_supported_proto file
_supported_os Linux

size=64M
_make_test_img $size
TEST_IMG="${TEST_IMG}.dest" _make_test_img $size

echo
echo === Starting VMs ===
echo

qemu_comm_method="qmp"

_launch_qemu \
-drive file="${TEST_IMG}",cache=$CACHEMODE,driver=$IMGFMT,id=disk
src=$QEMU_HANDLE
_send_qemu_cmd $src "{ 'execute': 'qmp_capabilities' }" 'return'

_launch_qemu \
-drive file="${TEST_IMG}.dest",cache=$CACHEMODE,driver=$IMGFMT,id=disk \
-incoming "unix:${MIG_SOCKET}"
dest=$QEMU_HANDLE
_send_qemu_cmd $dest "{ 'execute': 'qmp_capabilities' }" 'return'

echo
echo === Write something on the source ===
echo

_send_qemu_cmd $src \
"{ 'execute': 'human-monitor-command',
'arguments': { 'command-line':
'qemu-io disk \"write -P 0x55 0 64k\"' } }" \
'return'
_send_qemu_cmd $src \
"{ 'execute': 'human-monitor-command',
'arguments': { 'command-line':
'qemu-io disk \"read -P 0x55 0 64k\"' } }" \
'return'

echo
echo === Do block migration to destination ===
echo

reply="$(_send_qemu_cmd $src \
"{ 'execute': 'migrate',
'arguments': { 'uri': 'unix:${MIG_SOCKET}', 'blk': true } }" \
'return\|error')"
echo "$reply"
if echo "$reply" | grep "compiled without old-style" > /dev/null; then
_notrun "migrate -b support not compiled in"
fi

QEMU_COMM_TIMEOUT=0.1 qemu_cmd_repeat=50 silent=yes \
_send_qemu_cmd $src "{ 'execute': 'query-migrate' }" '"status": "completed"'
_send_qemu_cmd $src "{ 'execute': 'query-status' }" "return"

echo
echo === Do some I/O on the destination ===
echo

# It is important that we use the BlockBackend of the guest device here instead
# of the node name, which would create a new BlockBackend and not test whether
# the guest has the necessary permissions to access the image now
silent=yes _send_qemu_cmd $dest "" "100 %"
_send_qemu_cmd $dest "{ 'execute': 'query-status' }" "return"
_send_qemu_cmd $dest \
"{ 'execute': 'human-monitor-command',
'arguments': { 'command-line':
'qemu-io disk \"read -P 0x55 0 64k\"' } }" \
'return'
_send_qemu_cmd $dest \
"{ 'execute': 'human-monitor-command',
'arguments': { 'command-line':
'qemu-io disk \"write -P 0x66 1M 64k\"' } }" \
'return'

echo
echo === Shut down and check image ===
echo

_send_qemu_cmd $src '{"execute":"quit"}' 'return'
_send_qemu_cmd $dest '{"execute":"quit"}' 'return'
wait=1 _cleanup_qemu

_check_test_img
TEST_IMG="${TEST_IMG}.dest" _check_test_img

$QEMU_IO -c 'write -P 0x66 1M 64k' "$TEST_IMG" | _filter_qemu_io
$QEMU_IMG compare "$TEST_IMG.dest" "$TEST_IMG"

# success, all done
echo "*** done"
rm -f $seq.full
status=0
46 changes: 46 additions & 0 deletions tests/qemu-iotests/183.out
@@ -0,0 +1,46 @@
QA output created by 183
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
Formatting 'TEST_DIR/t.IMGFMT.dest', fmt=IMGFMT size=67108864

=== Starting VMs ===

{"return": {}}
{"return": {}}

=== Write something on the source ===

wrote 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
{"return": ""}
read 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
{"return": ""}

=== Do block migration to destination ===

{"return": {}}
{"return": {"status": "postmigrate", "singlestep": false, "running": false}}

=== Do some I/O on the destination ===

{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "RESUME"}
{"return": {"status": "running", "singlestep": false, "running": true}}
read 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
{"return": ""}
wrote 65536/65536 bytes at offset 1048576
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
{"return": ""}

=== Shut down and check image ===

{"return": {}}
{"return": {}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
No errors were found on the image.
No errors were found on the image.
wrote 65536/65536 bytes at offset 1048576
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
Images are identical.
*** done
1 change: 1 addition & 0 deletions tests/qemu-iotests/group
Expand Up @@ -174,3 +174,4 @@
179 rw auto quick
181 rw auto migration
182 rw auto quick
183 rw auto migration

0 comments on commit 49695ee

Please sign in to comment.