1#!/usr/bin/env bash 2# 3# Tests oVirt-like storage migration: 4# - Create snapshot 5# - Create target image with (not yet existing) target backing chain 6# (i.e. just write the name of a soon-to-be-copied-over backing file into it) 7# - drive-mirror the snapshot to the target with mode=existing and sync=top 8# - In the meantime, copy the original source files to the destination via 9# conventional means (i.e. outside of qemu) 10# - Complete the drive-mirror job 11# - Delete all source images 12# 13# Copyright (C) 2016 Red Hat, Inc. 14# 15# This program is free software; you can redistribute it and/or modify 16# it under the terms of the GNU General Public License as published by 17# the Free Software Foundation; either version 2 of the License, or 18# (at your option) any later version. 19# 20# This program is distributed in the hope that it will be useful, 21# but WITHOUT ANY WARRANTY; without even the implied warranty of 22# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 23# GNU General Public License for more details. 24# 25# You should have received a copy of the GNU General Public License 26# along with this program. If not, see <http://www.gnu.org/licenses/>. 27# 28 29# creator 30owner=mreitz@redhat.com 31 32seq="$(basename $0)" 33echo "QA output created by $seq" 34 35status=1 # failure is the default! 36 37_cleanup() 38{ 39 _cleanup_qemu 40 rm -f "$TEST_IMG"{,.target}{,.backing,.overlay} 41} 42trap "_cleanup; exit \$status" 0 1 2 3 15 43 44# get standard environment, filters and checks 45. ./common.rc 46. ./common.filter 47. ./common.qemu 48 49_supported_fmt qcow2 qed 50_supported_proto generic 51_unsupported_proto vxhs 52 53# Create source disk 54TEST_IMG="$TEST_IMG.backing" _make_test_img 1M 55_make_test_img -b "$TEST_IMG.backing" 1M 56 57$QEMU_IO -c 'write -P 1 0 256k' "$TEST_IMG.backing" | _filter_qemu_io 58$QEMU_IO -c 'write -P 2 64k 192k' "$TEST_IMG" | _filter_qemu_io 59 60_launch_qemu -drive if=none,id=source,file="$TEST_IMG" 61 62_send_qemu_cmd $QEMU_HANDLE \ 63 "{ 'execute': 'qmp_capabilities' }" \ 64 'return' 65 66# Create snapshot 67TEST_IMG="$TEST_IMG.overlay" _make_test_img -u -b "$TEST_IMG" 1M 68_send_qemu_cmd $QEMU_HANDLE \ 69 "{ 'execute': 'blockdev-snapshot-sync', 70 'arguments': { 'device': 'source', 71 'snapshot-file': '$TEST_IMG.overlay', 72 'format': '$IMGFMT', 73 'mode': 'existing' } }" \ 74 'return' 75 76# Write something to the snapshot 77_send_qemu_cmd $QEMU_HANDLE \ 78 "{ 'execute': 'human-monitor-command', 79 'arguments': { 'command-line': 80 'qemu-io source \"write -P 3 128k 128k\"' } }" \ 81 'return' 82 83# Create target image 84TEST_IMG="$TEST_IMG.target.overlay" _make_test_img -u -b "$TEST_IMG.target" 1M 85 86# Mirror snapshot 87_send_qemu_cmd $QEMU_HANDLE \ 88 "{ 'execute': 'drive-mirror', 89 'arguments': { 'device': 'source', 90 'target': '$TEST_IMG.target.overlay', 91 'mode': 'existing', 92 'sync': 'top' } }" \ 93 'return' 94 95# Wait for convergence 96_send_qemu_cmd $QEMU_HANDLE \ 97 '' \ 98 'BLOCK_JOB_READY' 99 100# Write some more 101_send_qemu_cmd $QEMU_HANDLE \ 102 "{ 'execute': 'human-monitor-command', 103 'arguments': { 'command-line': 104 'qemu-io source \"write -P 4 192k 64k\"' } }" \ 105 'return' 106 107# Copy source backing chain to the target before completing the job 108cp "$TEST_IMG.backing" "$TEST_IMG.target.backing" 109cp "$TEST_IMG" "$TEST_IMG.target" 110$QEMU_IMG rebase -u -b "$TEST_IMG.target.backing" "$TEST_IMG.target" 111 112# Complete block job 113_send_qemu_cmd $QEMU_HANDLE \ 114 "{ 'execute': 'block-job-complete', 115 'arguments': { 'device': 'source' } }" \ 116 '' 117 118_send_qemu_cmd $QEMU_HANDLE \ 119 '' \ 120 '"status": "null"' 121 122# Remove the source images 123rm -f "$TEST_IMG{,.backing,.overlay}" 124 125echo 126 127# Check online disk contents 128_send_qemu_cmd $QEMU_HANDLE \ 129 "{ 'execute': 'human-monitor-command', 130 'arguments': { 'command-line': 131 'qemu-io source \"read -P 1 0k 64k\"' } }" \ 132 'return' 133 134_send_qemu_cmd $QEMU_HANDLE \ 135 "{ 'execute': 'human-monitor-command', 136 'arguments': { 'command-line': 137 'qemu-io source \"read -P 2 64k 64k\"' } }" \ 138 'return' 139 140_send_qemu_cmd $QEMU_HANDLE \ 141 "{ 'execute': 'human-monitor-command', 142 'arguments': { 'command-line': 143 'qemu-io source \"read -P 3 128k 64k\"' } }" \ 144 'return' 145 146_send_qemu_cmd $QEMU_HANDLE \ 147 "{ 'execute': 'human-monitor-command', 148 'arguments': { 'command-line': 149 'qemu-io source \"read -P 4 192k 64k\"' } }" \ 150 'return' 151 152echo 153 154_send_qemu_cmd $QEMU_HANDLE \ 155 "{ 'execute': 'quit' }" \ 156 'return' 157 158wait=1 _cleanup_qemu 159 160echo 161 162# Check offline disk contents 163$QEMU_IO -c 'read -P 1 0k 64k' \ 164 -c 'read -P 2 64k 64k' \ 165 -c 'read -P 3 128k 64k' \ 166 -c 'read -P 4 192k 64k' \ 167 "$TEST_IMG.target.overlay" | _filter_qemu_io 168 169echo 170 171# success, all done 172echo '*** done' 173rm -f $seq.full 174status=0 175