Home | History | Annotate | Download | only in pounder21
      1 #!/bin/bash
      2 
      3 # Main pounder control script.
      4 
      5 # Copyright (C) 2003-2006 IBM
      6 #
      7 # This program is free software; you can redistribute it and/or
      8 # modify it under the terms of the GNU General Public License as
      9 # published by the Free Software Foundation; either version 2 of the
     10 # License, or (at your option) any later version.
     11 #
     12 # This program is distributed in the hope that it will be useful, but
     13 # WITHOUT ANY WARRANTY; without even the implied warranty of
     14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     15 # General Public License for more details.
     16 #
     17 # You should have received a copy of the GNU General Public License
     18 # along with this program; if not, write to the Free Software
     19 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
     20 # 02111-1307, USA.
     21 
     22 source libpounder.sh
     23 
     24 # This function kills off pounder and related subprocesses.
     25 function dokill() {
     26 	echo "Killing off pounder(s)..."
     27 	kill -INT `cat $POUNDER_PIDFILE`;
     28 	rm -rf $POUNDER_PIDFILE
     29 	#killall -9 randasys 2> /dev/null	# These run as user 'daemon' and have to be killed manually.
     30 }
     31 
     32 # Main function follows
     33 
     34 function help() {
     35 	cat << ENDL
     36 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]
     37 
     38 -h      	Brings up this menu
     39 -c scheduler	Creates a new test scheduler called scheduler-tests.tar.gz in the pounder/schedulers folder.
     40 		All subtests to be packaged with this scheduler must first be placed in the pounder/tests folder.
     41 -x      	Enable X stress tests.
     42 -d duration	Run pounder for duration seconds.
     43 -n ipaddr	Use ipaddr for NFS tests.
     44 -f		Remove pounder pid file before running.
     45 -u      	Unmount NFS log storage.
     46 -r      	Remount NFS log storage.
     47 -g logdir      	Use logdir as the log directory. (You probably want -s too.)
     48 -s      	Store logs locally.
     49 -l      	List (both included and excluded) subtests that came with the test scheduler
     50 -e subtests     Exclude subtests from next pounder run
     51 -i subtests     Include previously excluded subtests in the next pounder run
     52 -k      	Kill pounder.
     53 
     54 run "./pounder" to run all subtests
     55 run "./pounder subtest" to run just one particular subtest
     56         (example: ./pounder tests/T90ramp/D02build_kernel)
     57 ENDL
     58 }
     59 
     60 function exclude() {
     61 	echo "excluding from tests $@..."
     62 
     63 	POUNDER_TESTS=$POUNDER_HOME/tests
     64 	SUBTESTS_INC=`find $POUNDER_TESTS -name excluded -prune -o -type f -print -o -type l -print`
     65 
     66 	for i in $@
     67 	do
     68 		BASENAME=`basename "$i"`
     69 
     70 		ORIG_DIR=`pwd`
     71 		cd `dirname $i`
     72 		FULL_PATH=`pwd`/"$BASENAME"
     73 		cd $ORIG_DIR
     74 
     75 		FOUND=`echo "$SUBTESTS_INC" | grep -x "$FULL_PATH"`
     76 
     77 		if [ -n "$FOUND" -a -x "$i" ]; then
     78 
     79 			ALREADY_EXCLUDED=`grep -w "$BASENAME" $POUNDER_TESTS/excluded/testlist | cut -d " " -f1`
     80 			if [ $ALREADY_EXCLUDED ]; then
     81 				echo $ALREADY_EXCLUDED
     82 				echo "$BASENAME has already been excluded from the test scheduler. Make sure the test names in the test scheduler are unique."
     83 				exit 1
     84 			fi
     85 
     86 			echo "$BASENAME" "$FULL_PATH" >> "$POUNDER_TESTS"/excluded/testlist
     87 			mv "$i" "$POUNDER_TESTS"/excluded/"$BASENAME"
     88 
     89 			if [ $? -eq 0 ]; then
     90 				echo "Successfully removed $i from test scheduler."
     91 			else
     92 				echo "Removal of $i from tests UNSUCCESSFUL."
     93 			fi
     94 		else
     95 			echo "$i is not a subtest included in the current scheduler. Use ./pounder -l for list of valid, excludable subtests."
     96 		fi
     97 	done
     98 }
     99 
    100 function include() {
    101 	echo "including in tests $@..."
    102 
    103         POUNDER_EXCLUDED=$POUNDER_HOME/tests/excluded
    104 
    105         for i in $@
    106         do
    107 		ORIG_FILE=`grep -w "$i" $POUNDER_EXCLUDED/testlist | cut -d " " -f2`
    108 
    109 		if [ -n "$ORIG_FILE" ]; then
    110 			mv $POUNDER_EXCLUDED/$i $ORIG_FILE
    111 			if [ $? -eq 0 ]; then
    112 				sed "/$i /d" $POUNDER_EXCLUDED/testlist > $POUNDER_EXCLUDED/tempfile
    113 				mv $POUNDER_EXCLUDED/tempfile $POUNDER_EXCLUDED/testlist
    114 				echo "Successfully added $i back to test scheduler."
    115 			else
    116 				echo "Addition of $i to tests UNSUCCESSFUL."
    117 			fi
    118 		else
    119 			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."
    120 		fi
    121         done
    122 }
    123 
    124 function list_tests() {
    125 
    126 	if [ ! -d $POUNDER_HOME/tests ]; then
    127 		echo "Error: No test schedule found. Did you run make install?"
    128 		exit 1
    129 	fi
    130 
    131 	echo "Included subtests:"
    132 	INCLUDED_TESTS=`find $POUNDER_HOME/tests -name excluded -prune -o -type f -print -o -type l -print`
    133 	if [ -z "$INCLUDED_TESTS" ]; then
    134 		echo "[NONE]"
    135 	else
    136 		echo "$INCLUDED_TESTS"
    137 	fi
    138 	echo
    139 
    140 	echo "Excluded subtests:"
    141 
    142 	if [ ! -d $POUNDER_HOME/tests/excluded ]; then
    143 		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?"
    144 		exit 1
    145 	fi
    146 
    147 	EXCLUDED_TESTS=`grep -v "#" $POUNDER_HOME/tests/excluded/testlist`
    148 	if [ -z "$EXCLUDED_TESTS" ]; then
    149 		echo "[NONE]"
    150 	else
    151 		echo "$EXCLUDED_TESTS" | cut -d " " -f1
    152 	fi
    153 
    154 }
    155 
    156 function create_scheduler() {
    157 	TESTS_EXCLUDED=$POUNDER_HOME/tests/excluded
    158 	REPO_EXCLUDED=$POUNDER_HOME/test_repo/excluded
    159 
    160 	if [ ! -d $TESTS_EXCLUDED ]; then
    161 		cp -r $REPO_EXCLUDED $TESTS_EXCLUDED
    162 	elif [ ! -e $TESTS_EXCLUDED/testlist ]; then
    163 		cp $REPO_EXCLUDED/testlist $TESTS_EXCLUDED/testlist
    164 	fi
    165 
    166 	tar -czf $POUNDER_HOME/schedulers/$@-tests.tar.gz tests
    167 }
    168 # process options: -x to run in xterms, -k to kill tests, -d to set duration,
    169 # -f to remove bogus pounder.pid files.
    170 while getopts d:kn:g:xure:i:m:c:shl? o
    171 do
    172 	case "$o" in
    173 	   d) export DURATION="$OPTARG";;
    174 	   k) dokill; exit;;
    175 	   n) export NFS_SERVER="$OPTARG";;
    176 	   g) export POUNDER_LOGDIR="$OPTARG";;
    177 	   x) export DO_X_TESTS=1;;
    178 	   f) rm -rf "$POUNDER_PIDFILE";;
    179 	   u) umount $POUNDER_HOME/log 2> /dev/null; exit 0;;
    180 	   s) export NFS_LOGGING=0;;
    181 	   r) ./nfs_logging; exit;;
    182 	   e) exclude $OPTARG; exit;;
    183 	   i) include $OPTARG; exit;;
    184 	   l) list_tests; exit;;
    185 	   m) export MAX_FAILURES="$OPTARG";;
    186 	   c) create_scheduler $OPTARG; exit;;
    187 	   h) help $0; exit;;
    188 	   '?') help $0; exit 1;;
    189 	esac
    190 done
    191 
    192 # Did user ask for X tests when DISPLAY is set?
    193 # Probably _not_ what the user wants.
    194 if [ $DO_X_TESTS -eq 1 ] && [ ! -z "$DISPLAY" ]; then
    195 	echo "WARNING: X tests are enabled and DISPLAY is set.  xterms will appear on this desktop!"
    196 	echo "WARNING: Kill pounder NOW if this is not what you intended."
    197 fi
    198 
    199 # Get set up to read arguments, even though there aren't any...
    200 shift `expr $OPTIND - 1`
    201 
    202 # Are we already running?
    203 if [ -f "$POUNDER_PIDFILE" ]; then
    204 	echo "File $POUNDER_PIDFILE exists; pounder may already be running."
    205 	echo "Either run 'pounder -k' to stop all tests, or remove it."
    206 	exit 1
    207 fi
    208 
    209 # Did the user run Install?
    210 if [ ! -x run-helper -o ! -x timed_loop -o ! -x infinite_loop ]; then
    211 	echo "Could not find run-helper, infinite_loop or timed_loop.  Did you run Install?"
    212 	exit -1
    213 fi
    214 
    215 # Try to mount NFS log store.
    216 if [ -z "$NFS_LOGSERVER" -o -z "$NFS_LOGDIR" ]; then
    217 	echo "NFS logging disabled because NFS_LOGSERVER or NFS_LOGDIR are not set."
    218 	export NFS_LOGGING=0
    219 else
    220 	if [ $NFS_LOGGING -gt 0 ]; then
    221 		./nfs_logging
    222 	fi
    223 fi
    224 
    225 # Set up log directory
    226 mkdir -p "$POUNDER_LOGDIR" 2> /dev/null
    227 if [ ! -d "$POUNDER_LOGDIR" ]; then
    228 	echo "Could not create $POUNDER_LOGDIR; aborting."
    229 	exit 1
    230 fi
    231 
    232 # Set up dir for optional components
    233 mkdir -p "$POUNDER_OPTDIR"
    234 if [ ! -d "$POUNDER_OPTDIR" ]; then
    235 	echo "Could not create $POUNDER_OPTDIR; aborting."
    236 	exit 1
    237 fi
    238 
    239 # Set up tmpdir
    240 mkdir -p "$POUNDER_TMPDIR"
    241 if [ ! -d "$POUNDER_TMPDIR" ]; then
    242 	echo "Could not create $POUNDER_TMPDIR; aborting."
    243 	exit 1
    244 fi
    245 
    246 TEST_HEAD="$1"
    247 if [ -z $TEST_HEAD ]; then
    248 	TEST_HEAD=tests
    249 fi
    250 
    251 # needs to be a separate check in case there is no tests/ dir...
    252 if [ ! -d "$TEST_HEAD" -a ! -f "$TEST_HEAD" ]; then
    253 	echo "$TEST_HEAD does not exist!"
    254 	exit 1
    255 fi
    256 
    257 
    258 # Dump environment variables...
    259 export > "$POUNDER_LOGDIR/environment"
    260 
    261 echo "Starting $POUNDER_VERSION"
    262 echo "STARTING TESTS."
    263 echo "To kill all tests, run 'pounder -k' or press ^C."
    264 
    265 # Handle the duration thing...
    266 function kill_after {
    267 	sleep $DURATION
    268 	./pounder -k
    269 }
    270 if [ ! -z "$DURATION" -a "$DURATION" -gt 0 ]; then
    271 	kill_after &
    272 fi
    273 
    274 # Now run the tests
    275 ./run-helper $TEST_HEAD --leader
    276