[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.13, Tue Apr 3 04:13:04 2001 UTC (16 years, 7 months ago) by fsgqa
Branch: MAIN
Changes since 1.12: +1 -1 lines

roll to 2.4.3

#!/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

_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
}

# configuration (you could tune this)

EXTRA="-xfs-qa"
VERSION="2.4.3"
BOOT="/boot"
SOAK_PASSES="-1"
SOAK_STRESS="10000"
SOAK_PROC="3"

# 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"
IMAGE="$BOOT/vmlinuz-$VERSION$EXTRA"
SYSTEMMAP="$BOOT/System.map-$VERSION$EXTRA"
CONFIG="$ROOT/$HOST.config"
MODULES="/lib/modules/$VERSION$EXTRA"
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="dxm@larry"
        ADMINEMAIL="dxm@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"

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 (`date`)"
            _log "******************************************"

            _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 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 acl xfsprogs 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"
            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/$VERSION$EXTRA/kernel/fs/pagebuf/* \
                  /lib/modules/$VERSION$EXTRA/kernel/fs/xfs/*     \
                  /lib/modules/$VERSION$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 pagebuf 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