#!/bin/bash # Main pounder control script. # Copyright (C) 2003-2006 IBM # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. source libpounder.sh # This function kills off pounder and related subprocesses. function dokill() { echo "Killing off pounder(s)..." kill -INT `cat $POUNDER_PIDFILE`; rm -rf $POUNDER_PIDFILE #killall -9 randasys 2> /dev/null # These run as user 'daemon' and have to be killed manually. } # Main function follows function help() { cat << ENDL Usage: ./pounder [-g logdir] [-x] [-d duration] [-n ipaddr] [-m max_failures] [-f] [-h|-u|-r|-k|-l|-e subtests|-i subtests|-c scheduler] [-s] -h Brings up this menu -c scheduler Creates a new test scheduler called scheduler-tests.tar.gz in the pounder/schedulers folder. All subtests to be packaged with this scheduler must first be placed in the pounder/tests folder. -x Enable X stress tests. -d duration Run pounder for duration seconds. -n ipaddr Use ipaddr for NFS tests. -f Remove pounder pid file before running. -u Unmount NFS log storage. -r Remount NFS log storage. -g logdir Use logdir as the log directory. (You probably want -s too.) -s Store logs locally. -l List (both included and excluded) subtests that came with the test scheduler -e subtests Exclude subtests from next pounder run -i subtests Include previously excluded subtests in the next pounder run -k Kill pounder. run "./pounder" to run all subtests run "./pounder subtest" to run just one particular subtest (example: ./pounder tests/T90ramp/D02build_kernel) ENDL } function exclude() { echo "excluding from tests $@..." POUNDER_TESTS=$POUNDER_HOME/tests SUBTESTS_INC=`find $POUNDER_TESTS -name excluded -prune -o -type f -print -o -type l -print` for i in $@ do BASENAME=`basename "$i"` ORIG_DIR=`pwd` cd `dirname $i` FULL_PATH=`pwd`/"$BASENAME" cd $ORIG_DIR FOUND=`echo "$SUBTESTS_INC" | grep -x "$FULL_PATH"` if [ -n "$FOUND" -a -x "$i" ]; then ALREADY_EXCLUDED=`grep -w "$BASENAME" $POUNDER_TESTS/excluded/testlist | cut -d " " -f1` if [ $ALREADY_EXCLUDED ]; then echo $ALREADY_EXCLUDED echo "$BASENAME has already been excluded from the test scheduler. Make sure the test names in the test scheduler are unique." exit 1 fi echo "$BASENAME" "$FULL_PATH" >> "$POUNDER_TESTS"/excluded/testlist mv "$i" "$POUNDER_TESTS"/excluded/"$BASENAME" if [ $? -eq 0 ]; then echo "Successfully removed $i from test scheduler." else echo "Removal of $i from tests UNSUCCESSFUL." fi else echo "$i is not a subtest included in the current scheduler. Use ./pounder -l for list of valid, excludable subtests." fi done } function include() { echo "including in tests $@..." POUNDER_EXCLUDED=$POUNDER_HOME/tests/excluded for i in $@ do ORIG_FILE=`grep -w "$i" $POUNDER_EXCLUDED/testlist | cut -d " " -f2` if [ -n "$ORIG_FILE" ]; then mv $POUNDER_EXCLUDED/$i $ORIG_FILE if [ $? -eq 0 ]; then sed "/$i /d" $POUNDER_EXCLUDED/testlist > $POUNDER_EXCLUDED/tempfile mv $POUNDER_EXCLUDED/tempfile $POUNDER_EXCLUDED/testlist echo "Successfully added $i back to test scheduler." else echo "Addition of $i to tests UNSUCCESSFUL." fi else echo "$i is not an excluded subtest. It may already be included in the current scheduler. Use ./pounder -l for list of valid, includable subtests." fi done } function list_tests() { if [ ! -d $POUNDER_HOME/tests ]; then echo "Error: No test schedule found. Did you run make install?" exit 1 fi echo "Included subtests:" INCLUDED_TESTS=`find $POUNDER_HOME/tests -name excluded -prune -o -type f -print -o -type l -print` if [ -z "$INCLUDED_TESTS" ]; then echo "[NONE]" else echo "$INCLUDED_TESTS" fi echo echo "Excluded subtests:" if [ ! -d $POUNDER_HOME/tests/excluded ]; then echo "Error: $POUNDER_HOME/tests/excluded folder does not exist. Make sure your test scheduler was created or unpackaged correctly. Did you run make install?" exit 1 fi EXCLUDED_TESTS=`grep -v "#" $POUNDER_HOME/tests/excluded/testlist` if [ -z "$EXCLUDED_TESTS" ]; then echo "[NONE]" else echo "$EXCLUDED_TESTS" | cut -d " " -f1 fi } function create_scheduler() { TESTS_EXCLUDED=$POUNDER_HOME/tests/excluded REPO_EXCLUDED=$POUNDER_HOME/test_repo/excluded if [ ! -d $TESTS_EXCLUDED ]; then cp -r $REPO_EXCLUDED $TESTS_EXCLUDED elif [ ! -e $TESTS_EXCLUDED/testlist ]; then cp $REPO_EXCLUDED/testlist $TESTS_EXCLUDED/testlist fi tar -czf $POUNDER_HOME/schedulers/$@-tests.tar.gz tests } # process options: -x to run in xterms, -k to kill tests, -d to set duration, # -f to remove bogus pounder.pid files. while getopts d:kn:g:xure:i:m:c:shl? o do case "$o" in d) export DURATION="$OPTARG";; k) dokill; exit;; n) export NFS_SERVER="$OPTARG";; g) export POUNDER_LOGDIR="$OPTARG";; x) export DO_X_TESTS=1;; f) rm -rf "$POUNDER_PIDFILE";; u) umount $POUNDER_HOME/log 2> /dev/null; exit 0;; s) export NFS_LOGGING=0;; r) ./nfs_logging; exit;; e) exclude $OPTARG; exit;; i) include $OPTARG; exit;; l) list_tests; exit;; m) export MAX_FAILURES="$OPTARG";; c) create_scheduler $OPTARG; exit;; h) help $0; exit;; '?') help $0; exit 1;; esac done # Did user ask for X tests when DISPLAY is set? # Probably _not_ what the user wants. if [ $DO_X_TESTS -eq 1 ] && [ ! -z "$DISPLAY" ]; then echo "WARNING: X tests are enabled and DISPLAY is set. xterms will appear on this desktop!" echo "WARNING: Kill pounder NOW if this is not what you intended." fi # Get set up to read arguments, even though there aren't any... shift `expr $OPTIND - 1` # Are we already running? if [ -f "$POUNDER_PIDFILE" ]; then echo "File $POUNDER_PIDFILE exists; pounder may already be running." echo "Either run 'pounder -k' to stop all tests, or remove it." exit 1 fi # Did the user run Install? if [ ! -x run-helper -o ! -x timed_loop -o ! -x infinite_loop ]; then echo "Could not find run-helper, infinite_loop or timed_loop. Did you run Install?" exit -1 fi # Try to mount NFS log store. if [ -z "$NFS_LOGSERVER" -o -z "$NFS_LOGDIR" ]; then echo "NFS logging disabled because NFS_LOGSERVER or NFS_LOGDIR are not set." export NFS_LOGGING=0 else if [ $NFS_LOGGING -gt 0 ]; then ./nfs_logging fi fi # Set up log directory mkdir -p "$POUNDER_LOGDIR" 2> /dev/null if [ ! -d "$POUNDER_LOGDIR" ]; then echo "Could not create $POUNDER_LOGDIR; aborting." exit 1 fi # Set up dir for optional components mkdir -p "$POUNDER_OPTDIR" if [ ! -d "$POUNDER_OPTDIR" ]; then echo "Could not create $POUNDER_OPTDIR; aborting." exit 1 fi # Set up tmpdir mkdir -p "$POUNDER_TMPDIR" if [ ! -d "$POUNDER_TMPDIR" ]; then echo "Could not create $POUNDER_TMPDIR; aborting." exit 1 fi TEST_HEAD="$1" if [ -z $TEST_HEAD ]; then TEST_HEAD=tests fi # needs to be a separate check in case there is no tests/ dir... if [ ! -d "$TEST_HEAD" -a ! -f "$TEST_HEAD" ]; then echo "$TEST_HEAD does not exist!" exit 1 fi # Dump environment variables... export > "$POUNDER_LOGDIR/environment" echo "Starting $POUNDER_VERSION" echo "STARTING TESTS." echo "To kill all tests, run 'pounder -k' or press ^C." # Handle the duration thing... function kill_after { sleep $DURATION ./pounder -k } if [ ! -z "$DURATION" -a "$DURATION" -gt 0 ]; then kill_after & fi # Now run the tests ./run-helper $TEST_HEAD --leader