blob: c3defcf8d264f519c5319b18ea7b31280148f2f6 [file] [log] [blame]
#!/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." > /dev/tty
echo "Either run 'pounder -k' to stop all tests, or remove it." > /dev/tty
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." > /dev/tty
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." > /dev/tty
exit 1
fi
# Set up tmpdir
mkdir -p "$POUNDER_TMPDIR"
if [ ! -d "$POUNDER_TMPDIR" ]; then
echo "Could not create $POUNDER_TMPDIR; aborting." > /dev/tty
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." > /dev/tty
echo "To kill all tests, run 'pounder -k' or press ^C."> /dev/tty
# 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