1#!/usr/bin/env bash 2# 3# Test old-style block migration (migrate -b) 4# 5# Copyright (C) 2017 Red Hat, Inc. 6# 7# This program is free software; you can redistribute it and/or modify 8# it under the terms of the GNU General Public License as published by 9# the Free Software Foundation; either version 2 of the License, or 10# (at your option) any later version. 11# 12# This program is distributed in the hope that it will be useful, 13# but WITHOUT ANY WARRANTY; without even the implied warranty of 14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15# GNU General Public License for more details. 16# 17# You should have received a copy of the GNU General Public License 18# along with this program. If not, see <http://www.gnu.org/licenses/>. 19# 20 21# creator 22owner=kwolf@redhat.com 23 24seq=`basename $0` 25echo "QA output created by $seq" 26 27status=1 # failure is the default! 28 29MIG_SOCKET="${SOCK_DIR}/migrate" 30 31_cleanup() 32{ 33 rm -f "${MIG_SOCKET}" 34 _rm_test_img "${TEST_IMG}.dest" 35 _cleanup_test_img 36 _cleanup_qemu 37} 38trap "_cleanup; exit \$status" 0 1 2 3 15 39 40# get standard environment, filters and checks 41. ./common.rc 42. ./common.filter 43. ./common.qemu 44 45_supported_os Linux FreeBSD NetBSD 46_supported_fmt qcow2 raw qed quorum 47_supported_proto file 48 49size=64M 50_make_test_img $size 51TEST_IMG="${TEST_IMG}.dest" _make_test_img $size 52 53echo 54echo === Starting VMs === 55echo 56 57qemu_comm_method="qmp" 58 59_launch_qemu \ 60 -drive file="${TEST_IMG}",cache=$CACHEMODE,aio=$AIOMODE,driver=$IMGFMT,id=disk 61src=$QEMU_HANDLE 62_send_qemu_cmd $src "{ 'execute': 'qmp_capabilities' }" 'return' 63 64_launch_qemu \ 65 -drive file="${TEST_IMG}.dest",cache=$CACHEMODE,aio=$AIOMODE,driver=$IMGFMT,id=disk \ 66 -incoming "unix:${MIG_SOCKET}" 67dest=$QEMU_HANDLE 68_send_qemu_cmd $dest "{ 'execute': 'qmp_capabilities' }" 'return' 69 70echo 71echo === Write something on the source === 72echo 73 74_send_qemu_cmd $src \ 75 "{ 'execute': 'human-monitor-command', 76 'arguments': { 'command-line': 77 'qemu-io disk \"write -P 0x55 0 64k\"' } }" \ 78 'return' 79_send_qemu_cmd $src \ 80 "{ 'execute': 'human-monitor-command', 81 'arguments': { 'command-line': 82 'qemu-io disk \"read -P 0x55 0 64k\"' } }" \ 83 'return' 84 85echo 86echo === Do block migration to destination === 87echo 88 89reply="$(_send_qemu_cmd $src \ 90 "{ 'execute': 'migrate', 91 'arguments': { 'uri': 'unix:${MIG_SOCKET}', 'blk': true } }" \ 92 'return\|error')" 93echo "$reply" 94if echo "$reply" | grep "compiled without old-style" > /dev/null; then 95 _notrun "migrate -b support not compiled in" 96fi 97 98timeout_comm=$QEMU_COMM_TIMEOUT 99if [ "${VALGRIND_QEMU}" == "y" ]; then 100 QEMU_COMM_TIMEOUT=4 101else 102 QEMU_COMM_TIMEOUT=0.1 103fi 104qemu_cmd_repeat=50 silent=yes \ 105 _send_qemu_cmd $src "{ 'execute': 'query-migrate' }" '"status": "completed"' 106QEMU_COMM_TIMEOUT=$timeout_comm 107_send_qemu_cmd $src "{ 'execute': 'query-status' }" "return" 108 109echo 110echo === Do some I/O on the destination === 111echo 112 113# It is important that we use the BlockBackend of the guest device here instead 114# of the node name, which would create a new BlockBackend and not test whether 115# the guest has the necessary permissions to access the image now 116silent=yes _send_qemu_cmd $dest "" "100 %" 117_send_qemu_cmd $dest "{ 'execute': 'query-status' }" "return" 118_send_qemu_cmd $dest \ 119 "{ 'execute': 'human-monitor-command', 120 'arguments': { 'command-line': 121 'qemu-io disk \"read -P 0x55 0 64k\"' } }" \ 122 'return' 123_send_qemu_cmd $dest \ 124 "{ 'execute': 'human-monitor-command', 125 'arguments': { 'command-line': 126 'qemu-io disk \"write -P 0x66 1M 64k\"' } }" \ 127 'return' 128 129echo 130echo === Shut down and check image === 131echo 132 133_send_qemu_cmd $src '{"execute":"quit"}' 'return' 134_send_qemu_cmd $dest '{"execute":"quit"}' 'return' 135wait=1 _cleanup_qemu 136 137_check_test_img 138TEST_IMG="${TEST_IMG}.dest" _check_test_img 139 140$QEMU_IO -c 'write -P 0x66 1M 64k' "$TEST_IMG" | _filter_qemu_io 141$QEMU_IMG compare "$TEST_IMG.dest" "$TEST_IMG" 142 143# success, all done 144echo "*** done" 145rm -f $seq.full 146status=0 147