1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
#!/usr/bin/env bash
#
# Test NBD client unexpected disconnect
#
# Copyright Red Hat, Inc. 2014
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# creator
owner=stefanha@redhat.com
seq=`basename $0`
echo "QA output created by $seq"
status=1 # failure is the default!
_cleanup()
{
rm -f "$SOCK_DIR/nbd.sock"
rm -f nbd-fault-injector.out
rm -f nbd-fault-injector.conf
}
trap "_cleanup; exit \$status" 0 1 2 3 15
# get standard environment, filters and checks
. ./common.rc
. ./common.filter
_supported_fmt raw
_supported_proto nbd
_supported_os Linux
check_disconnect() {
local event export_name=foo extra_args nbd_addr nbd_url proto when
while true; do
case $1 in
--classic-negotiation)
shift
extra_args=--classic-negotiation
export_name=
;;
--tcp)
shift
proto=tcp
;;
--unix)
shift
proto=unix
;;
*)
break
;;
esac
done
event=$1
when=$2
echo "=== Check disconnect $when $event ==="
echo
cat > "$TEST_DIR/nbd-fault-injector.conf" <<EOF
[inject-error]
event=$event
when=$when
EOF
if [ "$proto" = "tcp" ]; then
nbd_addr="127.0.0.1:0"
else
nbd_addr="$SOCK_DIR/nbd.sock"
fi
rm -f "$SOCK_DIR/nbd.sock"
echo > "$TEST_DIR/nbd-fault-injector.out"
$PYTHON nbd-fault-injector.py $extra_args "$nbd_addr" "$TEST_DIR/nbd-fault-injector.conf" >"$TEST_DIR/nbd-fault-injector.out" 2>&1 &
# Wait for server to be ready
while ! grep -q 'Listening on ' "$TEST_DIR/nbd-fault-injector.out"; do
sleep 0.1
done
# Extract the final address (port number has now been assigned in tcp case)
nbd_addr=$(sed -n 's/^Listening on //p' \
"$TEST_DIR/nbd-fault-injector.out")
if [ "$proto" = "tcp" ]; then
nbd_url="nbd+tcp://$nbd_addr/$export_name"
else
nbd_url="nbd+unix:///$export_name?socket=$nbd_addr"
fi
$QEMU_IO -c "read 0 512" "$nbd_url" 2>&1 | _filter_qemu_io | _filter_nbd
echo
}
for proto in tcp unix; do
for event in neg1 "export" neg2 request reply data; do
for when in before after; do
check_disconnect "--$proto" "$event" "$when"
done
# Also inject short replies from the NBD server
case "$event" in
neg1)
for when in 8 16; do
check_disconnect "--$proto" "$event" "$when"
done
;;
"export")
for when in 4 12 16; do
check_disconnect "--$proto" "$event" "$when"
done
;;
neg2)
for when in 8 10; do
check_disconnect "--$proto" "$event" "$when"
done
;;
reply)
for when in 4 8; do
check_disconnect "--$proto" "$event" "$when"
done
;;
esac
done
# Also check classic negotiation without export information
for when in before 8 16 24 28 after; do
check_disconnect "--$proto" --classic-negotiation "neg-classic" "$when"
done
done
# success, all done
echo "*** done"
rm -f $seq.full
status=0
|