1#!/usr/bin/env bash 2# 3# Test Quorum block driver 4# 5# Copyright (C) 2013 Nodalink, SARL. 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=benoit@irqsave.net 23 24seq=`basename $0` 25echo "QA output created by $seq" 26 27status=1 # failure is the default! 28 29_cleanup() 30{ 31 rm -rf $TEST_DIR/1.raw 32 rm -rf $TEST_DIR/2.raw 33 rm -rf $TEST_DIR/3.raw 34} 35trap "_cleanup; exit \$status" 0 1 2 3 15 36 37# get standard environment, filters and checks 38. ./common.rc 39. ./common.filter 40 41_supported_fmt raw 42_supported_proto file 43_supported_os Linux 44_require_drivers quorum 45 46do_run_qemu() 47{ 48 echo Testing: "$@" | _filter_imgfmt 49 $QEMU -nographic -qmp stdio -serial none "$@" 50 echo 51} 52 53run_qemu() 54{ 55 do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qemu | _filter_qmp\ 56 | _filter_qemu_io | _filter_generated_node_ids 57} 58 59quorum="driver=raw,file.driver=quorum,file.vote-threshold=2" 60quorum="$quorum,file.children.0.file.filename=$TEST_DIR/1.raw" 61quorum="$quorum,file.children.1.file.filename=$TEST_DIR/2.raw" 62quorum="$quorum,file.children.2.file.filename=$TEST_DIR/3.raw" 63quorum="$quorum,file.children.0.driver=raw" 64quorum="$quorum,file.children.1.driver=raw" 65quorum="$quorum,file.children.2.driver=raw" 66 67echo 68echo "== creating quorum files ==" 69 70size=10M 71 72TEST_IMG="$TEST_DIR/1.raw" _make_test_img $size 73TEST_IMG="$TEST_DIR/2.raw" _make_test_img $size 74TEST_IMG="$TEST_DIR/3.raw" _make_test_img $size 75 76echo 77echo "== writing images ==" 78 79$QEMU_IO -c "open -o $quorum" -c "write -P 0x32 0 $size" | _filter_qemu_io 80 81echo 82echo "== checking quorum write ==" 83 84$QEMU_IO -c "read -P 0x32 0 $size" "$TEST_DIR/1.raw" | _filter_qemu_io 85$QEMU_IO -c "read -P 0x32 0 $size" "$TEST_DIR/2.raw" | _filter_qemu_io 86$QEMU_IO -c "read -P 0x32 0 $size" "$TEST_DIR/3.raw" | _filter_qemu_io 87 88echo 89echo "== corrupting image ==" 90 91$QEMU_IO -c "write -P 0x42 0 $size" "$TEST_DIR/2.raw" | _filter_qemu_io 92 93echo 94echo "== checking quorum correction ==" 95 96$QEMU_IO -c "open -o $quorum" -c "read -P 0x32 0 $size" | _filter_qemu_io 97 98echo 99echo "== checking mixed reference/option specification ==" 100 101run_qemu <<EOF 102{ "execute": "qmp_capabilities" } 103{ "execute": "blockdev-add", 104 "arguments": { 105 "node-name": "drive2", 106 "driver": "$IMGFMT", 107 "file": { 108 "driver": "file", 109 "filename": "$TEST_DIR/2.raw" 110 } 111 } 112} 113{ "execute": "blockdev-add", 114 "arguments": { 115 "driver": "quorum", 116 "node-name": "drive0-quorum", 117 "vote-threshold": 2, 118 "children": [ 119 { 120 "driver": "$IMGFMT", 121 "file": { 122 "driver": "file", 123 "filename": "$TEST_DIR/1.raw" 124 } 125 }, 126 "drive2", 127 { 128 "driver": "$IMGFMT", 129 "file": { 130 "driver": "file", 131 "filename": "$TEST_DIR/3.raw" 132 } 133 } 134 ] 135 } 136} 137{ "execute": "human-monitor-command", 138 "arguments": { 139 "command-line": 'qemu-io drive0-quorum "read -P 0x32 0 $size"' 140 } 141} 142{ "execute": "quit" } 143EOF 144 145echo 146echo "== using quorum rewrite corrupted mode ==" 147 148quorum="$quorum,file.rewrite-corrupted=on" 149 150$QEMU_IO -c "open -o $quorum" -c "read -P 0x32 0 $size" | _filter_qemu_io 151 152echo 153echo "== checking that quorum has corrected the corrupted file ==" 154 155$QEMU_IO -c "read -P 0x32 0 $size" "$TEST_DIR/2.raw" | _filter_qemu_io 156 157echo 158echo "== breaking quorum ==" 159 160$QEMU_IO -c "write -P 0x41 0 $size" "$TEST_DIR/1.raw" | _filter_qemu_io 161$QEMU_IO -c "write -P 0x42 0 $size" "$TEST_DIR/2.raw" | _filter_qemu_io 162 163echo 164echo "== checking that quorum is broken ==" 165 166$QEMU_IO -c "open -o $quorum" -c "read -P 0x32 0 $size" | _filter_qemu_io 167 168echo 169echo "== checking the blkverify mode with broken content ==" 170 171quorum="driver=raw,file.driver=quorum,file.vote-threshold=2,file.blkverify=on" 172quorum="$quorum,file.children.0.file.filename=$TEST_DIR/1.raw" 173quorum="$quorum,file.children.1.file.filename=$TEST_DIR/2.raw" 174quorum="$quorum,file.children.0.driver=raw" 175quorum="$quorum,file.children.1.driver=raw" 176 177$QEMU_IO -c "open -o $quorum" -c "read -P 0x32 0 $size" | _filter_qemu_io 178 179echo 180echo "== writing the same data to both files ==" 181 182$QEMU_IO -c "write -P 0x32 0 $size" "$TEST_DIR/1.raw" | _filter_qemu_io 183$QEMU_IO -c "write -P 0x32 0 $size" "$TEST_DIR/2.raw" | _filter_qemu_io 184 185echo 186echo "== checking the blkverify mode with valid content ==" 187 188$QEMU_IO -c "open -o $quorum" -c "read -P 0x32 0 $size" | _filter_qemu_io 189 190echo 191echo "== checking the blkverify mode with invalid settings ==" 192 193quorum="$quorum,file.children.2.file.filename=$TEST_DIR/3.raw" 194quorum="$quorum,file.children.2.driver=raw" 195 196$QEMU_IO -c "open -o $quorum" | _filter_qemu_io 197 198echo 199echo "== dynamically adding a child to a quorum ==" 200 201for verify in false true; do 202 run_qemu <<EOF 203 { "execute": "qmp_capabilities" } 204 { "execute": "blockdev-add", 205 "arguments": { 206 "driver": "quorum", 207 "node-name": "drive0-quorum", 208 "vote-threshold": 2, 209 "blkverify": ${verify}, 210 "children": [ 211 { 212 "driver": "$IMGFMT", 213 "file": { 214 "driver": "file", 215 "filename": "$TEST_DIR/1.raw" 216 } 217 }, 218 { 219 "driver": "$IMGFMT", 220 "file": { 221 "driver": "file", 222 "filename": "$TEST_DIR/2.raw" 223 } 224 } 225 ] 226 } 227 } 228 { "execute": "blockdev-add", 229 "arguments": { 230 "node-name": "drive3", 231 "driver": "$IMGFMT", 232 "file": { 233 "driver": "file", 234 "filename": "$TEST_DIR/2.raw" 235 } 236 } 237 } 238 { "execute": "x-blockdev-change", 239 "arguments": { "parent": "drive0-quorum", 240 "node": "drive3" } } 241 { "execute": "quit" } 242EOF 243done 244 245echo 246echo "== dynamically removing a child from a quorum ==" 247 248for verify in false true; do 249 for vote_threshold in 1 2; do 250 run_qemu <<EOF 251 { "execute": "qmp_capabilities" } 252 { "execute": "blockdev-add", 253 "arguments": { 254 "driver": "quorum", 255 "node-name": "drive0-quorum", 256 "vote-threshold": ${vote_threshold}, 257 "blkverify": ${verify}, 258 "children": [ 259 { 260 "driver": "$IMGFMT", 261 "file": { 262 "driver": "file", 263 "filename": "$TEST_DIR/1.raw" 264 } 265 }, 266 { 267 "driver": "$IMGFMT", 268 "file": { 269 "driver": "file", 270 "filename": "$TEST_DIR/2.raw" 271 } 272 } 273 ] 274 } 275 } 276 { "execute": "x-blockdev-change", 277 "arguments": { "parent": "drive0-quorum", 278 "child": "children.1" } } 279 { "execute": "quit" } 280EOF 281 done 282done 283 284# success, all done 285echo "*** done" 286rm -f $seq.full 287status=0 288