|
Packit |
eace71 |
#!/bin/bash
|
|
Packit |
eace71 |
#
|
|
Packit |
eace71 |
# Open-iSCSI Regression Test Utility
|
|
Packit |
eace71 |
# Copyright (C) 2004 Dmitry Yusupov
|
|
Packit |
eace71 |
# maintained by open-iscsi@googlegroups.com
|
|
Packit |
eace71 |
#
|
|
Packit |
eace71 |
# This program is free software; you can redistribute it and/or modify
|
|
Packit |
eace71 |
# it under the terms of the GNU General Public License as published
|
|
Packit |
eace71 |
# by the Free Software Foundation; either version 2 of the License, or
|
|
Packit |
eace71 |
# (at your option) any later version.
|
|
Packit |
eace71 |
#
|
|
Packit |
eace71 |
# This program is distributed in the hope that it will be useful, but
|
|
Packit |
eace71 |
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
eace71 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
eace71 |
# General Public License for more details.
|
|
Packit |
eace71 |
#
|
|
Packit |
eace71 |
# See the file COPYING included with this distribution for more details.
|
|
Packit |
eace71 |
#
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
PATH=".:${PATH}"
|
|
Packit |
eace71 |
FSTYPE="${FSTYPE:-ext3}"
|
|
Packit |
eace71 |
DEFAULTMOUNTOPTS='-o _netdev'
|
|
Packit |
eace71 |
[ -z "${MOUNTOPTS}" ] && MOUNTOPTS="${DEFAULTMOUNTOPTS}"
|
|
Packit |
eace71 |
# to avoid mount looking for fstype
|
|
Packit |
eace71 |
MOUNTOPTIONS="${MOUNTOPTIONS} -t ${FSTYPE}"
|
|
Packit |
eace71 |
MKFSCMD="${MKFSCMD:-mkfs.${FSTYPE}} ${MKFSOPTS}"
|
|
Packit |
eace71 |
PARTITIONSUFFIX="1"
|
|
Packit |
eace71 |
BONNIEPARAMS="${BONNIEPARAMS:--r0 -n10:0:0 -s16 -uroot -f -q}"
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
trap regress_signal INT QUIT TERM
|
|
Packit |
eace71 |
regress_signal() {
|
|
Packit |
eace71 |
printf "\nterminating, restore defaults: "
|
|
Packit |
eace71 |
# use the other function to clean up
|
|
Packit |
eace71 |
imm_data_en="Yes"
|
|
Packit |
eace71 |
initial_r2t_en="No"
|
|
Packit |
eace71 |
hdrdgst_en="None,CRC32C"
|
|
Packit |
eace71 |
datdgst_en="None,CRC32C"
|
|
Packit |
eace71 |
c="${iscsiadm} -m node -T $target -p $ipnr -o update"
|
|
Packit |
eace71 |
first_burst="$((256*1024))"
|
|
Packit |
eace71 |
max_burst="$((16*1024*1024-1024))"
|
|
Packit |
eace71 |
max_recv_dlength="$((128*1024))"
|
|
Packit |
eace71 |
max_r2t="1"
|
|
Packit |
eace71 |
update_cfg
|
|
Packit |
eace71 |
${iscsiadm} -m node -T $target -p $ipnr --logout 2>/dev/null >/dev/null
|
|
Packit |
eace71 |
printf "done\n"
|
|
Packit |
eace71 |
exit 0
|
|
Packit |
eace71 |
}
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
function update_cfg() {
|
|
Packit |
eace71 |
c="${iscsiadm} -m node -T $target -p $ipnr -o update"
|
|
Packit |
eace71 |
$c -n node.session.iscsi.ImmediateData -v $imm_data_en
|
|
Packit |
eace71 |
$c -n node.session.iscsi.InitialR2T -v $initial_r2t_en
|
|
Packit |
eace71 |
$c -n node.conn[0].iscsi.HeaderDigest -v $hdrdgst_en
|
|
Packit |
eace71 |
$c -n node.conn[0].iscsi.DataDigest -v $datdgst_en
|
|
Packit |
eace71 |
$c -n node.session.iscsi.FirstBurstLength -v $first_burst
|
|
Packit |
eace71 |
$c -n node.session.iscsi.MaxBurstLength -v $max_burst
|
|
Packit |
eace71 |
$c -n node.conn[0].iscsi.MaxRecvDataSegmentLength -v $max_recv_dlength
|
|
Packit |
eace71 |
$c -n node.session.iscsi.MaxOutstandingR2T -v $max_r2t
|
|
Packit |
eace71 |
}
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
function disktest_run() {
|
|
Packit |
eace71 |
bsizes="512 1024 2048 4096 8192 16384 32768 65536 131072 1000000"
|
|
Packit |
eace71 |
test "x$bsize" != x && bsizes=$bsize
|
|
Packit |
eace71 |
test "x$bsize" = xbonnie && return 0;
|
|
Packit |
eace71 |
for bs in $bsizes; do
|
|
Packit |
eace71 |
echo -n "disktest -T2 -K8 -B$bs -r -ID $device: "
|
|
Packit |
eace71 |
if ! ${disktest} -T2 -K8 -B$bs -r -ID $device >/dev/null; then
|
|
Packit |
eace71 |
echo "FAILED"
|
|
Packit |
eace71 |
return 1;
|
|
Packit |
eace71 |
fi
|
|
Packit |
eace71 |
echo "PASSED"
|
|
Packit |
eace71 |
echo -n "disktest -T2 -K8 -B$bs -E16 -w -ID $device: "
|
|
Packit |
eace71 |
if ! ${disktest} -T2 -K8 -B$bs -E16 -w -ID $device >/dev/null;then
|
|
Packit |
eace71 |
echo "FAILED"
|
|
Packit |
eace71 |
return 1;
|
|
Packit |
eace71 |
fi
|
|
Packit |
eace71 |
echo "PASSED"
|
|
Packit |
eace71 |
done
|
|
Packit |
eace71 |
return 0;
|
|
Packit |
eace71 |
}
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
function fdisk_run() {
|
|
Packit |
eace71 |
echo -n "sfdisk -Lqf $device: "
|
|
Packit |
eace71 |
sfdisk -Lqf $device >/dev/null 2>/dev/null <<-EOF
|
|
Packit |
eace71 |
0,
|
|
Packit |
eace71 |
;
|
|
Packit |
eace71 |
;
|
|
Packit |
eace71 |
;
|
|
Packit |
eace71 |
EOF
|
|
Packit |
eace71 |
rc=$?
|
|
Packit |
eace71 |
if [ $rc -ne 0 ]; then
|
|
Packit |
eace71 |
echo "FAILED"
|
|
Packit |
eace71 |
return 1;
|
|
Packit |
eace71 |
fi
|
|
Packit |
eace71 |
echo "PASSED"
|
|
Packit |
eace71 |
return 0;
|
|
Packit |
eace71 |
}
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
function mkfs_run() {
|
|
Packit |
eace71 |
echo -n "${MKFSCMD} $device_partition: "
|
|
Packit |
eace71 |
if ! ${MKFSCMD} $device_partition 2>/dev/null >/dev/null; then
|
|
Packit |
eace71 |
echo "FAILED"
|
|
Packit |
eace71 |
return 1;
|
|
Packit |
eace71 |
fi
|
|
Packit |
eace71 |
echo "PASSED"
|
|
Packit |
eace71 |
return 0;
|
|
Packit |
eace71 |
}
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
function bonnie_run() {
|
|
Packit |
eace71 |
dir="/tmp/iscsi.bonnie.regression.$record.$RANDOM"
|
|
Packit |
eace71 |
umount $dir 2>/dev/null >/dev/null
|
|
Packit |
eace71 |
rm -rf $dir; mkdir $dir
|
|
Packit |
eace71 |
echo -n "mount $dir: "
|
|
Packit |
eace71 |
if ! mount ${MOUNTOPTIONS} $device_partition $dir; then
|
|
Packit |
eace71 |
echo "FAILED"
|
|
Packit |
eace71 |
return 1;
|
|
Packit |
eace71 |
fi
|
|
Packit |
eace71 |
echo "PASSED"
|
|
Packit |
eace71 |
echo -n "bonnie++ ${BONNIEPARAMS}: "
|
|
Packit |
eace71 |
pushd $dir >/dev/null
|
|
Packit |
eace71 |
${bonnie} ${BONNIEPARAMS} 2>/dev/null >/dev/null
|
|
Packit |
eace71 |
rc=$?
|
|
Packit |
eace71 |
popd >/dev/null
|
|
Packit |
eace71 |
umount $dir 2>/dev/null >/dev/null
|
|
Packit |
eace71 |
rmdir ${dir}
|
|
Packit |
eace71 |
if [ $rc -ne 0 ]; then
|
|
Packit |
eace71 |
echo "FAILED"
|
|
Packit |
eace71 |
return 1;
|
|
Packit |
eace71 |
fi
|
|
Packit |
eace71 |
echo "PASSED"
|
|
Packit |
eace71 |
return 0;
|
|
Packit |
eace71 |
}
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
function fatal() {
|
|
Packit |
eace71 |
echo "regression.sh: $1"
|
|
Packit |
eace71 |
echo "Usage: regression.sh [-f | <targetname> <ipnumber#> ] <device> [test#[:#]] [bsize]"
|
|
Packit |
eace71 |
exit 1
|
|
Packit |
eace71 |
}
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
############################ main ###################################
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
disktest=`which disktest`
|
|
Packit |
eace71 |
iscsiadm=`which iscsiadm`
|
|
Packit |
eace71 |
bonnie=`which bonnie++`
|
|
Packit |
eace71 |
datfile=`dirname $0`"/regression.dat"
|
|
Packit |
eace71 |
test ! -e ${datfile} && fatal "can not find regression.dat"
|
|
Packit |
eace71 |
test ! -e ${disktest} && fatal "can not find disktest"
|
|
Packit |
eace71 |
test ! -e ${iscsiadm} && fatal "can not find iscsiadm"
|
|
Packit |
eace71 |
test ! -e ${bonnie} && fatal "can not find bonnie++"
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
if test x$1 = "x-f" -o x$1 = "x--format"; then
|
|
Packit |
eace71 |
test x$2 = x && fatal "SCSI device parameter error"
|
|
Packit |
eace71 |
device=$2
|
|
Packit |
eace71 |
else
|
|
Packit |
eace71 |
test x$1 = x && fatal "target name parameter error"
|
|
Packit |
eace71 |
test x$2 = x && fatal "ipnumber parameter error"
|
|
Packit |
eace71 |
test x$3 = x && fatal "SCSI device parameter error"
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
target="$1"
|
|
Packit |
eace71 |
ipnr="$2"
|
|
Packit |
eace71 |
device=$3
|
|
Packit |
eace71 |
fi
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
device_dir="$(dirname ${device})"
|
|
Packit |
eace71 |
device_partition=''
|
|
Packit |
eace71 |
case "${device_dir}" in
|
|
Packit |
eace71 |
# /dev/sdaX
|
|
Packit |
eace71 |
/dev) device_partition="${device}1" ;;
|
|
Packit |
eace71 |
# /dev/disk/by-id/scsi-${ID_SERIAL}-part1
|
|
Packit |
eace71 |
# where ID_SERIAL is SCSI disk SERIAL from scsi_id
|
|
Packit |
eace71 |
/dev/disk/by-id|/dev/disk/by-path) device_partition="${device}-part1" ;;
|
|
Packit |
eace71 |
# upcoming stuff
|
|
Packit |
eace71 |
/dev/iscsi/*) device_partition="${device}-part1" ;;
|
|
Packit |
eace71 |
esac
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
if test x$1 = "x-f" -o x$1 = "x--format"; then
|
|
Packit |
eace71 |
mkfs_run
|
|
Packit |
eace71 |
exit
|
|
Packit |
eace71 |
fi
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
if [ -z "${device_partition}" ]; then
|
|
Packit |
eace71 |
echo 'Unable to find device name for first partition.' >&2
|
|
Packit |
eace71 |
exit 1
|
|
Packit |
eace71 |
fi
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
test "x$4" != x && begin="$4"
|
|
Packit |
eace71 |
test "x$5" != x && bsize="$5"
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
if test "x$begin" != "x"; then
|
|
Packit |
eace71 |
end="${begin/*:}"
|
|
Packit |
eace71 |
begin="${begin/:*}"
|
|
Packit |
eace71 |
fi
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
# don't say we didn't warn you
|
|
Packit |
eace71 |
if [ -z "${SKIP_WARNING}" ]; then
|
|
Packit |
eace71 |
cat <<-EOF
|
|
Packit |
eace71 |
BIG FAT WARNING!
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
Open-iSCSI Regression Test Suite is about to start. It is going
|
|
Packit |
eace71 |
to use "$device" for its testing. iSCSI session could be re-opened
|
|
Packit |
eace71 |
during the tests several times and as the result device name could
|
|
Packit |
eace71 |
not match provided device name if some other SCSI activity happened
|
|
Packit |
eace71 |
during the test.
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
Are you sure you want to continue? [y/n]:
|
|
Packit |
eace71 |
EOF
|
|
Packit |
eace71 |
read line
|
|
Packit |
eace71 |
if test x$line = xn -o x$line = xN -o x$line = xno -o x$line = xNO; then
|
|
Packit |
eace71 |
echo "aborting..."
|
|
Packit |
eace71 |
exit
|
|
Packit |
eace71 |
fi
|
|
Packit |
eace71 |
fi
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
i=0
|
|
Packit |
eace71 |
cat ${datfile} | while read line; do
|
|
Packit |
eace71 |
if echo $line | grep "^#" >/dev/null; then continue; fi
|
|
Packit |
eace71 |
if echo $line | grep "^$" >/dev/null; then continue; fi
|
|
Packit |
eace71 |
if test x$begin != x; then
|
|
Packit |
eace71 |
if test x$begin != x$i -a x$end = x; then
|
|
Packit |
eace71 |
let i=i+1
|
|
Packit |
eace71 |
continue
|
|
Packit |
eace71 |
elif test x$begin != x -a x$end != x; then
|
|
Packit |
eace71 |
if test $i -lt $begin -o $i -gt $end; then
|
|
Packit |
eace71 |
let i=i+1
|
|
Packit |
eace71 |
continue
|
|
Packit |
eace71 |
fi
|
|
Packit |
eace71 |
fi
|
|
Packit |
eace71 |
fi
|
|
Packit |
eace71 |
imm_data_en=`echo $line | awk '/^[YesNo]+/ {print $1}'`
|
|
Packit |
eace71 |
if test x$imm_data_en = x; then continue; fi
|
|
Packit |
eace71 |
initial_r2t_en=`echo $line | awk '{print $2}'`
|
|
Packit |
eace71 |
hdrdgst_en=`echo $line | awk '{print $3}'`
|
|
Packit |
eace71 |
datdgst_en=`echo $line | awk '{print $4}'`
|
|
Packit |
eace71 |
first_burst=`echo $line | awk '{print $5}'`
|
|
Packit |
eace71 |
max_burst=`echo $line | awk '{print $6}'`
|
|
Packit |
eace71 |
max_recv_dlength=`echo $line | awk '{print $7}'`
|
|
Packit |
eace71 |
max_r2t=`echo $line | awk '{print $8}'`
|
|
Packit |
eace71 |
# ensure we are logged out
|
|
Packit |
eace71 |
${iscsiadm} -m node -T $target -p $ipnr --logout 2>/dev/null >/dev/null
|
|
Packit |
eace71 |
# set parameters for next run
|
|
Packit |
eace71 |
update_cfg
|
|
Packit |
eace71 |
echo "================== TEST #$i BEGIN ===================="
|
|
Packit |
eace71 |
echo "ImmediateData = $imm_data_en"
|
|
Packit |
eace71 |
echo "InitialR2T = $initial_r2t_en"
|
|
Packit |
eace71 |
echo "HeaderDigest = $hdrdgst_en"
|
|
Packit |
eace71 |
echo "DataDigest = $datdgst_en"
|
|
Packit |
eace71 |
echo "FirstBurstLength = $first_burst"
|
|
Packit |
eace71 |
echo "MaxBurstLength = $max_burst"
|
|
Packit |
eace71 |
echo "MaxRecvDataSegmentLength = $max_recv_dlength"
|
|
Packit |
eace71 |
echo "MaxOutstandingR2T = $max_r2t"
|
|
Packit |
eace71 |
# login for new test
|
|
Packit |
eace71 |
# catch errors on this
|
|
Packit |
eace71 |
if ! ${iscsiadm} -m node -T $target -p $ipnr --login; then break; fi
|
|
Packit |
eace71 |
while [ ! -e $device ] ; do sleep 1 ; done
|
|
Packit |
eace71 |
if ! disktest_run; then break; fi
|
|
Packit |
eace71 |
if ! fdisk_run; then break; fi
|
|
Packit |
eace71 |
if ! mkfs_run; then break; fi
|
|
Packit |
eace71 |
if ! bonnie_run; then break; fi
|
|
Packit |
eace71 |
let i=i+1
|
|
Packit |
eace71 |
done
|
|
Packit |
eace71 |
regress_signal
|
|
Packit |
eace71 |
echo
|
|
Packit |
eace71 |
echo "===================== THE END ========================"
|