Blame test/regression.sh

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 ========================"