Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
iotests: Add test for oVirt-like storage migration
Signed-off-by: Max Reitz <mreitz@redhat.com> Message-id: 20160610185750.30956-6-mreitz@redhat.com Reviewed-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Signed-off-by: Max Reitz <mreitz@redhat.com>
- Loading branch information
Showing
3 changed files
with
223 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,174 @@ | ||
#!/bin/bash | ||
# | ||
# Tests oVirt-like storage migration: | ||
# - Create snapshot | ||
# - Create target image with (not yet existing) target backing chain | ||
# (i.e. just write the name of a soon-to-be-copied-over backing file into it) | ||
# - drive-mirror the snapshot to the target with mode=existing and sync=top | ||
# - In the meantime, copy the original source files to the destination via | ||
# conventional means (i.e. outside of qemu) | ||
# - Complete the drive-mirror job | ||
# - Delete all source images | ||
# | ||
# Copyright (C) 2016 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=mreitz@redhat.com | ||
|
||
seq="$(basename $0)" | ||
echo "QA output created by $seq" | ||
|
||
here="$PWD" | ||
status=1 # failure is the default! | ||
|
||
_cleanup() | ||
{ | ||
rm -f "$TEST_IMG{,.target}{,.backing,.overlay}" | ||
} | ||
trap "_cleanup; exit \$status" 0 1 2 3 15 | ||
|
||
# get standard environment, filters and checks | ||
. ./common.rc | ||
. ./common.filter | ||
. ./common.qemu | ||
|
||
_supported_fmt qcow2 qed | ||
_supported_proto generic | ||
_supported_os Linux | ||
|
||
# Create source disk | ||
TEST_IMG="$TEST_IMG.backing" _make_test_img 1M | ||
_make_test_img -b "$TEST_IMG.backing" 1M | ||
|
||
$QEMU_IO -c 'write -P 1 0 256k' "$TEST_IMG.backing" | _filter_qemu_io | ||
$QEMU_IO -c 'write -P 2 64k 192k' "$TEST_IMG" | _filter_qemu_io | ||
|
||
_launch_qemu -drive if=none,id=source,file="$TEST_IMG" | ||
|
||
_send_qemu_cmd $QEMU_HANDLE \ | ||
"{ 'execute': 'qmp_capabilities' }" \ | ||
'return' | ||
|
||
# Create snapshot | ||
TEST_IMG="$TEST_IMG.overlay" _make_test_img -b "$TEST_IMG" 1M | ||
_send_qemu_cmd $QEMU_HANDLE \ | ||
"{ 'execute': 'blockdev-snapshot-sync', | ||
'arguments': { 'device': 'source', | ||
'snapshot-file': '$TEST_IMG.overlay', | ||
'format': '$IMGFMT', | ||
'mode': 'existing' } }" \ | ||
'return' | ||
|
||
# Write something to the snapshot | ||
_send_qemu_cmd $QEMU_HANDLE \ | ||
"{ 'execute': 'human-monitor-command', | ||
'arguments': { 'command-line': | ||
'qemu-io source \"write -P 3 128k 128k\"' } }" \ | ||
'return' | ||
|
||
# Create target image | ||
TEST_IMG="$TEST_IMG.target.overlay" _make_test_img -b "$TEST_IMG.target" 1M | ||
|
||
# Mirror snapshot | ||
_send_qemu_cmd $QEMU_HANDLE \ | ||
"{ 'execute': 'drive-mirror', | ||
'arguments': { 'device': 'source', | ||
'target': '$TEST_IMG.target.overlay', | ||
'mode': 'existing', | ||
'sync': 'top' } }" \ | ||
'return' | ||
|
||
# Wait for convergence | ||
_send_qemu_cmd $QEMU_HANDLE \ | ||
'' \ | ||
'BLOCK_JOB_READY' | ||
|
||
# Write some more | ||
_send_qemu_cmd $QEMU_HANDLE \ | ||
"{ 'execute': 'human-monitor-command', | ||
'arguments': { 'command-line': | ||
'qemu-io source \"write -P 4 192k 64k\"' } }" \ | ||
'return' | ||
|
||
# Copy source backing chain to the target before completing the job | ||
cp "$TEST_IMG.backing" "$TEST_IMG.target.backing" | ||
cp "$TEST_IMG" "$TEST_IMG.target" | ||
$QEMU_IMG rebase -u -b "$TEST_IMG.target.backing" "$TEST_IMG.target" | ||
|
||
# Complete block job | ||
_send_qemu_cmd $QEMU_HANDLE \ | ||
"{ 'execute': 'block-job-complete', | ||
'arguments': { 'device': 'source' } }" \ | ||
'' | ||
|
||
_send_qemu_cmd $QEMU_HANDLE \ | ||
'' \ | ||
'BLOCK_JOB_COMPLETED' | ||
|
||
# Remove the source images | ||
rm -f "$TEST_IMG{,.backing,.overlay}" | ||
|
||
echo | ||
|
||
# Check online disk contents | ||
_send_qemu_cmd $QEMU_HANDLE \ | ||
"{ 'execute': 'human-monitor-command', | ||
'arguments': { 'command-line': | ||
'qemu-io source \"read -P 1 0k 64k\"' } }" \ | ||
'return' | ||
|
||
_send_qemu_cmd $QEMU_HANDLE \ | ||
"{ 'execute': 'human-monitor-command', | ||
'arguments': { 'command-line': | ||
'qemu-io source \"read -P 2 64k 64k\"' } }" \ | ||
'return' | ||
|
||
_send_qemu_cmd $QEMU_HANDLE \ | ||
"{ 'execute': 'human-monitor-command', | ||
'arguments': { 'command-line': | ||
'qemu-io source \"read -P 3 128k 64k\"' } }" \ | ||
'return' | ||
|
||
_send_qemu_cmd $QEMU_HANDLE \ | ||
"{ 'execute': 'human-monitor-command', | ||
'arguments': { 'command-line': | ||
'qemu-io source \"read -P 4 192k 64k\"' } }" \ | ||
'return' | ||
|
||
echo | ||
|
||
_send_qemu_cmd $QEMU_HANDLE \ | ||
"{ 'execute': 'quit' }" \ | ||
'return' | ||
|
||
wait=1 _cleanup_qemu | ||
|
||
echo | ||
|
||
# Check offline disk contents | ||
$QEMU_IO -c 'read -P 1 0k 64k' \ | ||
-c 'read -P 2 64k 64k' \ | ||
-c 'read -P 3 128k 64k' \ | ||
-c 'read -P 4 192k 64k' \ | ||
"$TEST_IMG.target.overlay" | _filter_qemu_io | ||
|
||
echo | ||
|
||
# success, all done | ||
echo '*** done' | ||
rm -f $seq.full | ||
status=0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
QA output created by 156 | ||
Formatting 'TEST_DIR/t.IMGFMT.backing', fmt=IMGFMT size=1048576 | ||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 backing_file=TEST_DIR/t.IMGFMT.backing | ||
wrote 262144/262144 bytes at offset 0 | ||
256 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||
wrote 196608/196608 bytes at offset 65536 | ||
192 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||
{"return": {}} | ||
Formatting 'TEST_DIR/t.IMGFMT.overlay', fmt=IMGFMT size=1048576 backing_file=TEST_DIR/t.IMGFMT | ||
{"return": {}} | ||
wrote 131072/131072 bytes at offset 131072 | ||
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||
{"return": ""} | ||
Formatting 'TEST_DIR/t.IMGFMT.target.overlay', fmt=IMGFMT size=1048576 backing_file=TEST_DIR/t.IMGFMT.target | ||
{"return": {}} | ||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "source", "len": 131072, "offset": 131072, "speed": 0, "type": "mirror"}} | ||
wrote 65536/65536 bytes at offset 196608 | ||
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||
{"return": ""} | ||
{"return": {}} | ||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "source", "len": 196608, "offset": 196608, "speed": 0, "type": "mirror"}} | ||
|
||
read 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 65536 | ||
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||
{"return": ""} | ||
read 65536/65536 bytes at offset 131072 | ||
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||
{"return": ""} | ||
read 65536/65536 bytes at offset 196608 | ||
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||
{"return": ""} | ||
|
||
{"return": {}} | ||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN"} | ||
|
||
read 65536/65536 bytes at offset 0 | ||
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||
read 65536/65536 bytes at offset 65536 | ||
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||
read 65536/65536 bytes at offset 131072 | ||
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||
read 65536/65536 bytes at offset 196608 | ||
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) | ||
|
||
*** done |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -155,3 +155,4 @@ | |
152 rw auto quick | ||
154 rw auto backing quick | ||
155 rw auto | ||
156 rw auto quick |