111a82d14SPhilippe Mathieu-Daudé#!/usr/bin/env bash 2c7fc5bc2SBenoît Canet# 3c7fc5bc2SBenoît Canet# Test Quorum block driver 4c7fc5bc2SBenoît Canet# 5c7fc5bc2SBenoît Canet# Copyright (C) 2013 Nodalink, SARL. 6c7fc5bc2SBenoît Canet# 7c7fc5bc2SBenoît Canet# This program is free software; you can redistribute it and/or modify 8c7fc5bc2SBenoît Canet# it under the terms of the GNU General Public License as published by 9c7fc5bc2SBenoît Canet# the Free Software Foundation; either version 2 of the License, or 10c7fc5bc2SBenoît Canet# (at your option) any later version. 11c7fc5bc2SBenoît Canet# 12c7fc5bc2SBenoît Canet# This program is distributed in the hope that it will be useful, 13c7fc5bc2SBenoît Canet# but WITHOUT ANY WARRANTY; without even the implied warranty of 14c7fc5bc2SBenoît Canet# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15c7fc5bc2SBenoît Canet# GNU General Public License for more details. 16c7fc5bc2SBenoît Canet# 17c7fc5bc2SBenoît Canet# You should have received a copy of the GNU General Public License 18c7fc5bc2SBenoît Canet# along with this program. If not, see <http://www.gnu.org/licenses/>. 19c7fc5bc2SBenoît Canet# 20c7fc5bc2SBenoît Canet 21c7fc5bc2SBenoît Canet# creator 22c7fc5bc2SBenoît Canetowner=benoit@irqsave.net 23c7fc5bc2SBenoît Canet 24c7fc5bc2SBenoît Canetseq=`basename $0` 25c7fc5bc2SBenoît Canetecho "QA output created by $seq" 26c7fc5bc2SBenoît Canet 27c7fc5bc2SBenoît Canetstatus=1 # failure is the default! 28c7fc5bc2SBenoît Canet 29c7fc5bc2SBenoît Canet_cleanup() 30c7fc5bc2SBenoît Canet{ 31*f91ecbd7SMax Reitz _rm_test_img "$TEST_DIR/1.raw" 32*f91ecbd7SMax Reitz _rm_test_img "$TEST_DIR/2.raw" 33*f91ecbd7SMax Reitz _rm_test_img "$TEST_DIR/3.raw" 34c7fc5bc2SBenoît Canet} 35c7fc5bc2SBenoît Canettrap "_cleanup; exit \$status" 0 1 2 3 15 36c7fc5bc2SBenoît Canet 37c7fc5bc2SBenoît Canet# get standard environment, filters and checks 38c7fc5bc2SBenoît Canet. ./common.rc 39c7fc5bc2SBenoît Canet. ./common.filter 40c7fc5bc2SBenoît Canet 41c7fc5bc2SBenoît Canet_supported_fmt raw 42c5f7c0afSPeter Lieven_supported_proto file 43c7fc5bc2SBenoît Canet_supported_os Linux 4421b43d00SThomas Huth_require_drivers quorum 45c7fc5bc2SBenoît Canet 468cedcffdSEric Blakedo_run_qemu() 476141f3bdSMax Reitz{ 486141f3bdSMax Reitz echo Testing: "$@" | _filter_imgfmt 496141f3bdSMax Reitz $QEMU -nographic -qmp stdio -serial none "$@" 506141f3bdSMax Reitz echo 516141f3bdSMax Reitz} 526141f3bdSMax Reitz 538cedcffdSEric Blakerun_qemu() 546141f3bdSMax Reitz{ 5515489c76SJeff Cody do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qemu | _filter_qmp\ 5615489c76SJeff Cody | _filter_qemu_io | _filter_generated_node_ids 576141f3bdSMax Reitz} 586141f3bdSMax Reitz 598f9e835fSKevin Wolfquorum="driver=raw,file.driver=quorum,file.vote-threshold=2" 608f9e835fSKevin Wolfquorum="$quorum,file.children.0.file.filename=$TEST_DIR/1.raw" 61c7fc5bc2SBenoît Canetquorum="$quorum,file.children.1.file.filename=$TEST_DIR/2.raw" 628f9e835fSKevin Wolfquorum="$quorum,file.children.2.file.filename=$TEST_DIR/3.raw" 638f9e835fSKevin Wolfquorum="$quorum,file.children.0.driver=raw" 648f9e835fSKevin Wolfquorum="$quorum,file.children.1.driver=raw" 658f9e835fSKevin Wolfquorum="$quorum,file.children.2.driver=raw" 66c7fc5bc2SBenoît Canet 67c7fc5bc2SBenoît Canetecho 68c7fc5bc2SBenoît Canetecho "== creating quorum files ==" 69c7fc5bc2SBenoît Canet 70c7fc5bc2SBenoît Canetsize=10M 71c7fc5bc2SBenoît Canet 72c7fc5bc2SBenoît CanetTEST_IMG="$TEST_DIR/1.raw" _make_test_img $size 73c7fc5bc2SBenoît CanetTEST_IMG="$TEST_DIR/2.raw" _make_test_img $size 74c7fc5bc2SBenoît CanetTEST_IMG="$TEST_DIR/3.raw" _make_test_img $size 75c7fc5bc2SBenoît Canet 76c7fc5bc2SBenoît Canetecho 77c7fc5bc2SBenoît Canetecho "== writing images ==" 78c7fc5bc2SBenoît Canet 79c7fc5bc2SBenoît Canet$QEMU_IO -c "open -o $quorum" -c "write -P 0x32 0 $size" | _filter_qemu_io 80c7fc5bc2SBenoît Canet 81c7fc5bc2SBenoît Canetecho 82c7fc5bc2SBenoît Canetecho "== checking quorum write ==" 83c7fc5bc2SBenoît Canet 84c7fc5bc2SBenoît Canet$QEMU_IO -c "read -P 0x32 0 $size" "$TEST_DIR/1.raw" | _filter_qemu_io 85c7fc5bc2SBenoît Canet$QEMU_IO -c "read -P 0x32 0 $size" "$TEST_DIR/2.raw" | _filter_qemu_io 86c7fc5bc2SBenoît Canet$QEMU_IO -c "read -P 0x32 0 $size" "$TEST_DIR/3.raw" | _filter_qemu_io 87c7fc5bc2SBenoît Canet 88c7fc5bc2SBenoît Canetecho 89c7fc5bc2SBenoît Canetecho "== corrupting image ==" 90c7fc5bc2SBenoît Canet 91c7fc5bc2SBenoît Canet$QEMU_IO -c "write -P 0x42 0 $size" "$TEST_DIR/2.raw" | _filter_qemu_io 92c7fc5bc2SBenoît Canet 93c7fc5bc2SBenoît Canetecho 94c7fc5bc2SBenoît Canetecho "== checking quorum correction ==" 95c7fc5bc2SBenoît Canet 96c7fc5bc2SBenoît Canet$QEMU_IO -c "open -o $quorum" -c "read -P 0x32 0 $size" | _filter_qemu_io 97c7fc5bc2SBenoît Canet 98c7fc5bc2SBenoît Canetecho 996141f3bdSMax Reitzecho "== checking mixed reference/option specification ==" 1006141f3bdSMax Reitz 1018e9e6530SMax Reitzrun_qemu <<EOF 1026141f3bdSMax Reitz{ "execute": "qmp_capabilities" } 1036141f3bdSMax Reitz{ "execute": "blockdev-add", 1046141f3bdSMax Reitz "arguments": { 1058e9e6530SMax Reitz "node-name": "drive2", 1068e9e6530SMax Reitz "driver": "$IMGFMT", 1078e9e6530SMax Reitz "file": { 1088e9e6530SMax Reitz "driver": "file", 1098e9e6530SMax Reitz "filename": "$TEST_DIR/2.raw" 1108e9e6530SMax Reitz } 1118e9e6530SMax Reitz } 1128e9e6530SMax Reitz} 1138e9e6530SMax Reitz{ "execute": "blockdev-add", 1148e9e6530SMax Reitz "arguments": { 1156141f3bdSMax Reitz "driver": "quorum", 11626d5fa10SKevin Wolf "node-name": "drive0-quorum", 1176141f3bdSMax Reitz "vote-threshold": 2, 1186141f3bdSMax Reitz "children": [ 1196141f3bdSMax Reitz { 1208e9e6530SMax Reitz "driver": "$IMGFMT", 1216141f3bdSMax Reitz "file": { 1226141f3bdSMax Reitz "driver": "file", 1236141f3bdSMax Reitz "filename": "$TEST_DIR/1.raw" 1246141f3bdSMax Reitz } 1256141f3bdSMax Reitz }, 1266141f3bdSMax Reitz "drive2", 1276141f3bdSMax Reitz { 1288e9e6530SMax Reitz "driver": "$IMGFMT", 1296141f3bdSMax Reitz "file": { 1306141f3bdSMax Reitz "driver": "file", 1316141f3bdSMax Reitz "filename": "$TEST_DIR/3.raw" 1326141f3bdSMax Reitz } 1336141f3bdSMax Reitz } 1346141f3bdSMax Reitz ] 1356141f3bdSMax Reitz } 1366141f3bdSMax Reitz} 1376141f3bdSMax Reitz{ "execute": "human-monitor-command", 1386141f3bdSMax Reitz "arguments": { 1396141f3bdSMax Reitz "command-line": 'qemu-io drive0-quorum "read -P 0x32 0 $size"' 1406141f3bdSMax Reitz } 1416141f3bdSMax Reitz} 1426141f3bdSMax Reitz{ "execute": "quit" } 1436141f3bdSMax ReitzEOF 1446141f3bdSMax Reitz 1456141f3bdSMax Reitzecho 146cf29a570SBenoît Canetecho "== using quorum rewrite corrupted mode ==" 147cf29a570SBenoît Canet 148cf29a570SBenoît Canetquorum="$quorum,file.rewrite-corrupted=on" 149cf29a570SBenoît Canet 150cf29a570SBenoît Canet$QEMU_IO -c "open -o $quorum" -c "read -P 0x32 0 $size" | _filter_qemu_io 151cf29a570SBenoît Canet 152cf29a570SBenoît Canetecho 153cf29a570SBenoît Canetecho "== checking that quorum has corrected the corrupted file ==" 154cf29a570SBenoît Canet 155cf29a570SBenoît Canet$QEMU_IO -c "read -P 0x32 0 $size" "$TEST_DIR/2.raw" | _filter_qemu_io 156cf29a570SBenoît Canet 157cf29a570SBenoît Canetecho 158c7fc5bc2SBenoît Canetecho "== breaking quorum ==" 159c7fc5bc2SBenoît Canet 160c7fc5bc2SBenoît Canet$QEMU_IO -c "write -P 0x41 0 $size" "$TEST_DIR/1.raw" | _filter_qemu_io 161cf29a570SBenoît Canet$QEMU_IO -c "write -P 0x42 0 $size" "$TEST_DIR/2.raw" | _filter_qemu_io 162cf29a570SBenoît Canet 163c7fc5bc2SBenoît Canetecho 164c7fc5bc2SBenoît Canetecho "== checking that quorum is broken ==" 165c7fc5bc2SBenoît Canet 166c7fc5bc2SBenoît Canet$QEMU_IO -c "open -o $quorum" -c "read -P 0x32 0 $size" | _filter_qemu_io 167c7fc5bc2SBenoît Canet 16882c4c859SAlberto Garciaecho 16982c4c859SAlberto Garciaecho "== checking the blkverify mode with broken content ==" 17082c4c859SAlberto Garcia 17182c4c859SAlberto Garciaquorum="driver=raw,file.driver=quorum,file.vote-threshold=2,file.blkverify=on" 17282c4c859SAlberto Garciaquorum="$quorum,file.children.0.file.filename=$TEST_DIR/1.raw" 17382c4c859SAlberto Garciaquorum="$quorum,file.children.1.file.filename=$TEST_DIR/2.raw" 17482c4c859SAlberto Garciaquorum="$quorum,file.children.0.driver=raw" 17582c4c859SAlberto Garciaquorum="$quorum,file.children.1.driver=raw" 17682c4c859SAlberto Garcia 17782c4c859SAlberto Garcia$QEMU_IO -c "open -o $quorum" -c "read -P 0x32 0 $size" | _filter_qemu_io 17882c4c859SAlberto Garcia 17982c4c859SAlberto Garciaecho 18082c4c859SAlberto Garciaecho "== writing the same data to both files ==" 18182c4c859SAlberto Garcia 18282c4c859SAlberto Garcia$QEMU_IO -c "write -P 0x32 0 $size" "$TEST_DIR/1.raw" | _filter_qemu_io 18382c4c859SAlberto Garcia$QEMU_IO -c "write -P 0x32 0 $size" "$TEST_DIR/2.raw" | _filter_qemu_io 18482c4c859SAlberto Garcia 18582c4c859SAlberto Garciaecho 18682c4c859SAlberto Garciaecho "== checking the blkverify mode with valid content ==" 18782c4c859SAlberto Garcia 18882c4c859SAlberto Garcia$QEMU_IO -c "open -o $quorum" -c "read -P 0x32 0 $size" | _filter_qemu_io 18982c4c859SAlberto Garcia 19082c4c859SAlberto Garciaecho 19182c4c859SAlberto Garciaecho "== checking the blkverify mode with invalid settings ==" 19282c4c859SAlberto Garcia 19382c4c859SAlberto Garciaquorum="$quorum,file.children.2.file.filename=$TEST_DIR/3.raw" 19482c4c859SAlberto Garciaquorum="$quorum,file.children.2.driver=raw" 19582c4c859SAlberto Garcia 19682c4c859SAlberto Garcia$QEMU_IO -c "open -o $quorum" | _filter_qemu_io 19782c4c859SAlberto Garcia 19804f600efSAlberto Garciaecho 19904f600efSAlberto Garciaecho "== dynamically adding a child to a quorum ==" 20004f600efSAlberto Garcia 20104f600efSAlberto Garciafor verify in false true; do 20204f600efSAlberto Garcia run_qemu <<EOF 20304f600efSAlberto Garcia { "execute": "qmp_capabilities" } 20404f600efSAlberto Garcia { "execute": "blockdev-add", 20504f600efSAlberto Garcia "arguments": { 20604f600efSAlberto Garcia "driver": "quorum", 20704f600efSAlberto Garcia "node-name": "drive0-quorum", 20804f600efSAlberto Garcia "vote-threshold": 2, 20904f600efSAlberto Garcia "blkverify": ${verify}, 21004f600efSAlberto Garcia "children": [ 21104f600efSAlberto Garcia { 21204f600efSAlberto Garcia "driver": "$IMGFMT", 21304f600efSAlberto Garcia "file": { 21404f600efSAlberto Garcia "driver": "file", 21504f600efSAlberto Garcia "filename": "$TEST_DIR/1.raw" 21604f600efSAlberto Garcia } 21704f600efSAlberto Garcia }, 21804f600efSAlberto Garcia { 21904f600efSAlberto Garcia "driver": "$IMGFMT", 22004f600efSAlberto Garcia "file": { 22104f600efSAlberto Garcia "driver": "file", 22204f600efSAlberto Garcia "filename": "$TEST_DIR/2.raw" 22304f600efSAlberto Garcia } 22404f600efSAlberto Garcia } 22504f600efSAlberto Garcia ] 22604f600efSAlberto Garcia } 22704f600efSAlberto Garcia } 22804f600efSAlberto Garcia { "execute": "blockdev-add", 22904f600efSAlberto Garcia "arguments": { 23004f600efSAlberto Garcia "node-name": "drive3", 23104f600efSAlberto Garcia "driver": "$IMGFMT", 23204f600efSAlberto Garcia "file": { 23304f600efSAlberto Garcia "driver": "file", 23404f600efSAlberto Garcia "filename": "$TEST_DIR/2.raw" 23504f600efSAlberto Garcia } 23604f600efSAlberto Garcia } 23704f600efSAlberto Garcia } 23804f600efSAlberto Garcia { "execute": "x-blockdev-change", 23904f600efSAlberto Garcia "arguments": { "parent": "drive0-quorum", 24004f600efSAlberto Garcia "node": "drive3" } } 24104f600efSAlberto Garcia { "execute": "quit" } 24204f600efSAlberto GarciaEOF 24304f600efSAlberto Garciadone 24404f600efSAlberto Garcia 24504f600efSAlberto Garciaecho 24604f600efSAlberto Garciaecho "== dynamically removing a child from a quorum ==" 24704f600efSAlberto Garcia 24804f600efSAlberto Garciafor verify in false true; do 24904f600efSAlberto Garcia for vote_threshold in 1 2; do 25004f600efSAlberto Garcia run_qemu <<EOF 25104f600efSAlberto Garcia { "execute": "qmp_capabilities" } 25204f600efSAlberto Garcia { "execute": "blockdev-add", 25304f600efSAlberto Garcia "arguments": { 25404f600efSAlberto Garcia "driver": "quorum", 25504f600efSAlberto Garcia "node-name": "drive0-quorum", 25604f600efSAlberto Garcia "vote-threshold": ${vote_threshold}, 25704f600efSAlberto Garcia "blkverify": ${verify}, 25804f600efSAlberto Garcia "children": [ 25904f600efSAlberto Garcia { 26004f600efSAlberto Garcia "driver": "$IMGFMT", 26104f600efSAlberto Garcia "file": { 26204f600efSAlberto Garcia "driver": "file", 26304f600efSAlberto Garcia "filename": "$TEST_DIR/1.raw" 26404f600efSAlberto Garcia } 26504f600efSAlberto Garcia }, 26604f600efSAlberto Garcia { 26704f600efSAlberto Garcia "driver": "$IMGFMT", 26804f600efSAlberto Garcia "file": { 26904f600efSAlberto Garcia "driver": "file", 27004f600efSAlberto Garcia "filename": "$TEST_DIR/2.raw" 27104f600efSAlberto Garcia } 27204f600efSAlberto Garcia } 27304f600efSAlberto Garcia ] 27404f600efSAlberto Garcia } 27504f600efSAlberto Garcia } 27604f600efSAlberto Garcia { "execute": "x-blockdev-change", 27704f600efSAlberto Garcia "arguments": { "parent": "drive0-quorum", 27804f600efSAlberto Garcia "child": "children.1" } } 27904f600efSAlberto Garcia { "execute": "quit" } 28004f600efSAlberto GarciaEOF 28104f600efSAlberto Garcia done 28204f600efSAlberto Garciadone 28304f600efSAlberto Garcia 284c7fc5bc2SBenoît Canet# success, all done 285c7fc5bc2SBenoît Canetecho "*** done" 286c7fc5bc2SBenoît Canetrm -f $seq.full 287c7fc5bc2SBenoît Canetstatus=0 288