File: [Development] / xfs-cmds / xfstests / tools / auto-qa (download)
Revision 1.21, Mon Feb 25 22:58:23 2002 UTC (15 years, 8 months ago) by nathans
Branch: MAIN
Changes since 1.20: +5 -0
lines
Merge of xfs-cmds-2.4.18:slinx:112403a by nathans.
attr now has an install-lib target as well, ensure it is used.
|
#!/bin/sh
#
# Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of version 2 of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# Further, this software is distributed without any warranty that it is
# free of the rightful claim of any third person regarding infringement
# or the like. Any license provided herein, whether implied or
# otherwise, applies only to this software file. Patent licenses, if
# any, provided herein do not apply to combinations of this program with
# other software, or any other product whatsoever.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write the Free Software Foundation, Inc., 59
# Temple Place - Suite 330, Boston MA 02111-1307, USA.
#
# Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
# Mountain View, CA 94043, or:
#
# http://www.sgi.com
#
# For further information regarding this notice, see:
#
# http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
#
# automatic qa system. 31/08/00 dxm@sgi.com
# configuration (you could tune this)
EXTRA="-xfs-qa"
BOOT="/boot"
SOAK_PASSES="-1"
SOAK_STRESS="10000"
SOAK_PROC="3"
_log()
{
echo "$*" >&2
echo "$*" >> $LOG
}
_fail()
{
if [ "$started" = "1" ]
then
echo "auto-qa stopped" | wall
started=0
fi
_log "$*"
# send special email if a cron'd qa run fails
case $state
in
cron*)
mail -s "xfs qa status report" $ADMINEMAIL \
< $LOG 2>&1
;;
esac
status=1
exit 1
}
_get_kernel_version()
{
[ -x $WORKAREA ] \
|| _fail "can't access workarea $WORKAREA"
[ -r $WORKAREA/linux/Makefile ] \
|| _fail "can't read makefile $WORKAREA/linux/Makefile"
eval `awk '
BEGIN { FS = "[ \t=]+" }
/^VERSION =/ { a=$2 }
/^PATCHLEVEL =/ { b=$2 }
/^SUBLEVEL =/ { c=$2 }
/^EXTRAVERSION =/ { d=$2 }
END {
print "VERSION=" a "." b "." c d " ; SVERSION=" a "." b "." c
}
' < $WORKAREA/linux/Makefile`
}
# this should be constant
ROOT="$HOME/qa"
HOST=`hostname -s`
if [ ! -z "$CVSROOT" ]; then
WORKAREA="$ROOT/linux-2.4-xfs"
else
[ -z "$WORKAREA" ] && WORKAREA="$ROOT/linux-xfs"
fi
export WORKAREA
export PATH="/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin/ptools:/usr/local/bin"
STATE=$ROOT/qa.state
QADIR="$WORKAREA/cmd/xfstests"
SUDO="su -c"
CONFIG="$ROOT/$HOST.config"
COMMON_CONFIG="$WORKAREA/cmd/xfstests/common.config"
SH="/bin/sh"
LOG="$ROOT/qa.log"
# need to add auto-qa hosts here
case $HOST
in
fuzzy)
EMAIL="nathans@larry"
ADMINEMAIL="nathans@larry"
MODULAR=1
;;
bruce)
EMAIL="dxm@larry"
ADMINEMAIL="dxm@larry"
MODULAR=1
;;
sagan)
EMAIL="dxm@larry"
ADMINEMAIL="dxm@larry"
MODULAR=0
;;
troppo)
EMAIL="nathans@larry"
ADMINEMAIL="nathans@larry"
MODULAR=0
;;
goldfish)
EMAIL="nathans@larry"
ADMINEMAIL="nathans@larry"
MODULAR=1
;;
*)
_fail "auto-qa: no configuration information for host '$HOST'"
;;
esac
# do some cleanup on exit
_cleanup()
{
umount $SCRATCH_DEV &> /dev/null
umount $TEST_DEV &> /dev/null
if [ "$started" = 1 ]
then
echo "auto-qa stopped" | wall
started=0
fi
}
status=1
trap "_cleanup; exit \$status" 0 1 2 3 15
# clean exit
_success()
{
status=0
exit 0
}
_get_state()
{
state=`cat $STATE`
}
_set_state()
{
echo $1 > $STATE
_get_state
}
_change_state()
{
new=$1
case $state
in
*-*)
case $new
in
*-*)
_set_state $new
;;
*)
_set_state `echo $state | sed "s/-.*$/-$new/"`
;;
esac
;;
*)
_set_state $new
;;
esac
}
_sudo()
{
$ROOT/su -c "$*" < /dev/null ;# HACK - we need a hacked su at the mo
}
_restart()
{
# erk - why won't this thing reboot reliably??
exec $ROOT/su -c "(shutdown -r 2 \"auto-qa rebooting\" ; sleep 10 ; reboot ; sleep 10 ; reboot )&" < /dev/null
}
_update_autoqa_file()
{
SELF="$ROOT/auto-qa"
SELF_UPDATE="cmd/xfstests/tools/auto-qa"
if [ -z "$CVSROOT" ]; then
cmd="p_tupdate $SELF_UPDATE"
else
cmd="cvs -z3 update $SELF_UPDATE"
fi
exec $SH -c "cd $WORKAREA ; $cmd; chmod +x $SELF_UPDATE ; exec $SELF"
}
_update_workarea()
{
if [ -z "$CVSROOT" ]; then
_log " *** p_tupdate"
cd $WORKAREA
p_tupdate 2>&1 \
|| _fail " !!! p_tupdate failed"
_log " *** p_check/p_purge"
cd $WORKAREA
p_check -s | p_purge -yiu 2>&1 \
|| _fail " !!! p_check/p_purge failed"
_log " *** non-trunk files"
cd $WORKAREA
p_list -c 2>&1 \
|| _fail " !!! p_list failed"
else
_log " *** cvs update"
cd $WORKAREA
cvs -z3 update -d
fi
}
_log "*** linux-xfs QA (`date`)"
_get_state
# check preconditions for starting state
case $1
in
cron-init)
case $state
in
*done)
;;
*)
_fail " !!! cron-init while not in \"*done\" state"
;;
esac
;;
cron-restarted)
# we don't auto restart after reboot, but cron the restart
# to happen a bit later - it's much easier and safer that way
if [ $state != "cron-restarted" ]
then
_fail " !!! cron-restarted while not in \"cron-restarted\" state"
fi
;;
esac
if [ "$1" != "" ]
then
_set_state $1
fi
[ $UID -eq 0 ] && _fail " !!! QA most be run as a normal user"
[ -d $ROOT ] || _fail " !!! QA root \"$ROOT\" not found"
[ -d $WORKAREA ] || _fail " !!! QA workarea \"$WORKAREA\" not found"
[ -r $CONFIG ] || _fail " !!! Can't read config file $CONFIG"
. $COMMON_CONFIG || _fail " !!! Couldn't source $COMMON_CONFIG"
_get_kernel_version
IMAGE="$BOOT/vmlinuz$EXTRA"
SYSTEMMAP="$BOOT/System.map-$VERSION$EXTRA"
MODULES="/lib/modules/$SVERSION"
cd $ROOT
started=1
echo "auto-qa started" | wall
while true
do
_get_state
_log " *** state $state start (`date`)"
_log " (user=$USER, host=$HOST)"
new_state=""
case $state
in
*init)
echo "" > $ROOT/qa.log
echo "" > $ROOT/qa.full
_log "******************************************************"
_log "QA init $VERSION (`date`)"
_log "******************************************************"
_log "--- kernel ($IMAGE)"
_log "--- modules ($MODULES)"
_change_state "inited"
_update_autoqa_file
;;
*inited)
_log " *** QA initialized"
new_state="update"
;;
*update)
_update_workarea
new_state="clean"
;;
*clean)
# we need to configure or else we might fail to clean
for pkg in attr xfsprogs dmapi xfsdump xfstests
do
cd $WORKAREA/cmd/$pkg
_log " *** clean $pkg tools"
make realclean 2>&1 \
|| _fail " !!! clean $pkg failed"
done
_log " *** clean linux"
cd $WORKAREA/linux
make mrproper 2>&1 \
|| _fail " !!! clean linux failed"
_log " *** install configuration file"
cp -f $CONFIG $WORKAREA/linux/.config 2>&1 \
|| _fail " !!! failed to install config"
_log " *** remove version file"
rm -f include/linux/version.h 2>&1 \
|| _fail " !!! failed to clean version"
new_state="reconfig"
;;
*reconfig)
_log " *** reconfig kernel"
_change_state "clean" ; # we better start from scratch if this fails
cd $WORKAREA/linux
# we want to use default options for any new config options.
echo -e "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" | \
make EXTRAVERSION=$EXTRA oldconfig 2>&1 \
|| _fail " !!! reconfig oldconfig failed"
make EXTRAVERSION=$EXTRA dep 2>&1 \
|| _fail " !!! reconfig dep failed"
new_state="build"
;;
*build)
_log " *** build kernel"
_change_state "clean" ; # we better start from scratch if this fails
cd $WORKAREA/linux
make -j2 EXTRAVERSION=$EXTRA bzImage 2>&1 \
|| _fail " !!! build bzImage failed"
make -j2 EXTRAVERSION=$EXTRA modules 2>&1 \
|| _fail " !!! build modules failed"
_log " *** build and install tools"
for pkg in attr xfsprogs dmapi xfsdump xfstests
do
cd $WORKAREA/cmd/$pkg
# use e-fence - but this will only take effect on configure
export MALLOCLIB=/usr/lib/libefence.a
make configure 2>&1 \
|| _fail " !!! configure $pkg failed"
make default 2>&1 \
|| _fail " !!! build $pkg failed"
_sudo make install install-dev 2>&1 \
|| _fail " !!! install $pkg failed"
# attr now has an install-lib target as well
[ $pkg == "attr" ] || continue
_sudo make install-lib 2>&1 \
|| _fail " !!! install $pkg failed"
done
new_state="install"
;;
*install)
_log " *** blat old modules"
_sudo rm -rf $MODULES
_log " *** install kernel"
cd $WORKAREA/linux
_sudo cp -f $WORKAREA/linux/arch/i386/boot/bzImage $IMAGE 2>&1 \
|| _fail " !!! install kernel failed"
_sudo cp -f $WORKAREA/linux/System.map $SYSTEMMAP 2>&1 \
|| _fail " !!! install kernel failed"
_sudo make EXTRAVERSION=$EXTRA modules_install 2>&1 \
|| _fail " !!! install modules failed"
_log " *** reinit lilo"
_sudo /sbin/lilo 2>&1 \
|| _fail " !!! reinit lilo failed"
new_state="restart"
;;
*restart)
_log " *** select qa kernel"
_sudo /sbin/lilo -R linux-xfs-qa 2>&1 \
|| _fail " !!! lilo failed"
_log " *** prepare to restart"
_change_state "restarted"
_log " *** restarting"
_restart # doesn't return
;;
*restarted)
_log " *** QA reentered after restart"
new_state="check"
;;
*check)
uname=`uname -ar`
_log " *** uname $uname"
_log " *** user tools"
ls -l /sbin/*xfs* /usr/sbin/*xfs* 2>&1
_log " *** kernel"
ls -l /boot/*$EXTRA* 2>&1
_log " *** kernel modules"
ls -l /lib/modules/$SVERSION$EXTRA/kernel/fs/xfs/* \
/lib/modules/$SVERSION$EXTRA/kernel/fs/xfs_support/*
if [ $MODULAR -eq 0 ]
then
new_state="reset"
else
new_state="probe"
fi
;;
*probe)
_log " *** modules dependencies"
_sudo depmod -a 2>&1 \
|| _fail " !!! failed to depmod -a"
_log " *** unmounting XFS mounts"
_sudo umount -a -t xfs 2>&1
_log " *** removing modules"
for m in xfsidbg xfs kdbm_pg kdbm_vm
do
_sudo rmmod $m 2> /dev/null
done
_log " *** installing modules"
_sudo modprobe xfs 2>&1 \
|| _fail " !!! failed to modprobe xfs"
new_state="reset"
;;
*reset)
_log " *** unmounting TEST_DEV"
_sudo umount $TEST_DEV 2>&1
_log " *** unmounting SCRATCH_DEV"
_sudo umount $SCRATCH_DEV 2>&1
_log " *** clean TEST_DEV"
_sudo mkfs -t xfs -f $TEST_DEV 2>&1 \
|| _fail " !!! failed to mkfs TEST_DEV"
_log " *** mounting TEST_DEV"
_sudo mount -t xfs $TEST_DEV $TEST_DIR 2>&1 \
|| _fail " !!! failed to mount"
new_state="run"
;;
soak-run)
cd $QADIR
_log " *** run soak test"
_sudo ./soak $SOAK_PASSES $SOAK_STRESS $SOAK_PROC\
|| _fail " !!! failed to run soak test"
new_state="done"
;;
*run)
cd $QADIR
_log " *** run tests"
_sudo ./check -l -g auto 2>&1 | tee $ROOT/qa.out
_log ""
_log " *** send status mail"
mail -s "xfs qa status report" $EMAIL < $ROOT/qa.out 2>&1
new_state="done"
;;
*done)
_log "*** QA run complete"
_success
;;
*nothing)
new_state="done"
_log " *** do nothing"
;;
*)
_fail " !!! unknown state $state"
;;
esac
_log " *** state $state done (`date`)"
[ "$new_state" = "" ] && _fail " !!! no new state set"
_change_state $new_state
done