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