[BACK]Return to auto-qa CVS log [TXT][DIR] Up to [Development] / xfs-cmds / xfstests / tools

File: [Development] / xfs-cmds / xfstests / tools / auto-qa (download)

Revision 1.41, Mon May 26 06:34:31 2003 UTC (14 years, 5 months ago) by fsgqa
Branch: MAIN
Changes since 1.40: +23 -3 lines

QA test updates for external log/rt devices.
Allow TEST filesystem to be created with an external log/rt device too.

#!/bin/sh
#
# Copyright (c) 2000-2002 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)

_log()
{
    echo "$*" >&2
    echo "$*" >> $LOG
    sync
}

_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" $EMAIL \
		< $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"

# 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()
{
    exec $ROOT/su -c "(shutdown -r now \"auto-qa rebooting\" )&" < /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
}

_test_mkfs_xfs()
{
    TEST_OPTIONS=""
    [ "$USE_EXTERNAL" = yes -a ! -z "$TEST_RTDEV" ] && \
        TEST_OPTIONS="$TEST_OPTIONS -rrtdev=$TEST_RTDEV"
    [ "$USE_EXTERNAL" = yes -a ! -z "$TEST_LOGDEV" ] && \
        TEST_OPTIONS="$TEST_OPTIONS -llogdev=$TEST_LOGDEV"
    _sudo /sbin/mkfs.xfs -f $TEST_OPTIONS $MKFS_OPTIONS $* $TEST_DEV
}

_test_mount()
{
    TEST_OPTIONS=""
    [ "$USE_EXTERNAL" = yes -a ! -z "$TEST_RTDEV" ] && \
        TEST_OPTIONS="$TEST_OPTIONS -ortdev=$TEST_RTDEV"
    [ "$USE_EXTERNAL" = yes -a ! -z "$TEST_LOGDEV" ] && \
        TEST_OPTIONS="$TEST_OPTIONS -ologdev=$TEST_LOGDEV"
    _sudo mount -t xfs $TEST_OPTIONS $* $TEST_DEV $TEST_DIR
}


_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 acl 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="buildtools"
	    ;;
	    
	*buildtools)
	    _log "	*** build and install tools"
	    for pkg in attr acl xfsprogs dmapi xfsdump xfstests 
	    do
		cd $WORKAREA/cmd/$pkg

		# use e-fence - but this will only take effect on configure
		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 and acl now have install-lib targets as well
		[ "$pkg" = "attr" -o "$pkg" = "acl" ] || continue
		_sudo make install-lib 2>&1 \
			|| _fail "	    !!! install $pkg failed"
	    done

	    new_state="buildkernel"
	    ;;

	*buildkernel)
	    _log "	*** build kernel"
	    
	    _change_state "clean" ; # we better start from scratch if this fails
	    
	    cd $WORKAREA/linux
	    make -j4 EXTRAVERSION=$EXTRA bzImage modules 2>&1 \
			|| _fail "	    !!! build bzImage/modules failed"
	    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 $KERNEL_OPTIONS 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 "	    *** kernel"
	    ls -l /boot/*$EXTRA*  2>&1
	    _log "	    *** kernel modules"
	    [ -d /lib/modules/$SVERSION$EXTRA/kernel/fs/xfs ] && \
		ls -l /lib/modules/$SVERSION$EXTRA/kernel/fs/xfs/*

	    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"
	    
	    _test_mkfs_xfs 2>&1 \
			|| _fail "	    !!! failed to mkfs TEST_DEV"
	    
	    _log "	    *** mounting TEST_DEV"
	    
	    _test_mount 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"
	    ;;
	    
	bench-run)
	    cd $QADIR
	    
	    # $BENCHMARK is typically unset, which equates to "all"
	    #
	    _log "	    *** run benchmarks"
	    _sudo ./bench $BENCH_PASSES `id -nu && id -ng` $BENCHMARK \
			|| _fail "	    !!! failed to run benchmarks"

	    _log ""
	    _log "	    *** send results mail"
	    mail -s "XFS QA benchmark results" $EMAIL < $QADIR/bench.out 2>&1
	
	    new_state="done"
	    ;;
	    
	*run)
	    cd $QADIR
	    
	    _log "	    *** run tests ($CHECK_OPTIONS)"
	    _sudo ./check -l $CHECK_OPTIONS 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