89796d0dbe2bb28df3cb9fb5fd5c0b8622c88aa8
[xfstests-dev.git] / tools / auto-qa
1 #!/bin/sh
2 #
3 # Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
4
5 # This program is free software; you can redistribute it and/or modify it
6 # under the terms of version 2 of the GNU General Public License as
7 # published by the Free Software Foundation.
8
9 # This program is distributed in the hope that it would be useful, but
10 # WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13 # Further, this software is distributed without any warranty that it is
14 # free of the rightful claim of any third person regarding infringement
15 # or the like.  Any license provided herein, whether implied or
16 # otherwise, applies only to this software file.  Patent licenses, if
17 # any, provided herein do not apply to combinations of this program with
18 # other software, or any other product whatsoever.
19
20 # You should have received a copy of the GNU General Public License along
21 # with this program; if not, write the Free Software Foundation, Inc., 59
22 # Temple Place - Suite 330, Boston MA 02111-1307, USA.
23
24 # Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
25 # Mountain View, CA  94043, or:
26
27 # http://www.sgi.com 
28
29 # For further information regarding this notice, see: 
30
31 # http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
32 #
33
34 # automatic qa system. 31/08/00 dxm@sgi.com
35
36 _log()
37 {
38     echo "$*" >&2
39     echo "$*" >> $LOG
40 }
41
42 _fail()
43 {
44     if [ "$started" = "1" ] 
45     then
46         echo "auto-qa stopped" | wall
47         started=0
48     fi
49
50     _log "$*"
51     
52     # send special email if a cron'd qa run fails
53     case $state
54     in
55         cron*)
56             mail -s "xfs qa status report" $ADMINEMAIL \
57                 < $LOG 2>&1
58         ;;
59     esac
60
61     status=1
62     exit 1
63 }
64
65 # configuration (you could tune this)
66
67 EXTRA="-xfs-qa"
68 VERSION="2.4.2"
69 BOOT="/boot"
70 SOAK_PASSES="-1"
71 SOAK_STRESS="10000"
72 SOAK_PROC="3"
73
74 # this should be constant
75
76 ROOT="$HOME/qa"
77 HOST=`hostname -s`
78 if [ ! -z "$CVSROOT" ]; then
79     WORKAREA="$ROOT/linux-2.4-xfs"
80 else
81     [ -z "$WORKAREA" ] && WORKAREA="$ROOT/linux-xfs"
82 fi
83 export WORKAREA
84
85 export PATH="/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin/ptools:/usr/local/bin"
86 STATE=$ROOT/qa.state
87 QADIR="$WORKAREA/cmd/xfstests"
88 SUDO="su -c"
89 IMAGE="$BOOT/vmlinuz-$VERSION$EXTRA"
90 SYSTEMMAP="$BOOT/System.map-$VERSION$EXTRA"
91 CONFIG="$ROOT/$HOST.config"
92 MODULES="/lib/modules/$VERSION$EXTRA"
93 COMMON_CONFIG="$WORKAREA/cmd/xfstests/common.config"
94 SH="/bin/sh"
95 LOG="$ROOT/qa.log"
96
97 # need to add auto-qa hosts here
98
99 case $HOST
100 in
101     fuzzy)
102         EMAIL="dxm@larry"
103         ADMINEMAIL="dxm@larry"
104         MODULAR=1
105         ;;
106     bruce)
107         EMAIL="dxm@larry"
108         ADMINEMAIL="dxm@larry"
109         MODULAR=1
110         ;;
111     sagan)
112         EMAIL="dxm@larry"
113         ADMINEMAIL="dxm@larry"
114         MODULAR=0
115         ;;
116     troppo)
117         EMAIL="nathans@larry"
118         ADMINEMAIL="nathans@larry"
119         MODULAR=0
120         ;;
121     goldfish)
122         EMAIL="nathans@larry"
123         ADMINEMAIL="nathans@larry"
124         MODULAR=1
125         ;;
126     *)
127         _fail "auto-qa: no configuration information for host '$HOST'"
128         ;;
129 esac
130
131 # do some cleanup on exit
132
133 _cleanup()
134 {
135     umount $SCRATCH_DEV &> /dev/null
136     umount $TEST_DEV &> /dev/null
137     if [ "$started" = 1 ]
138     then
139         echo "auto-qa stopped" | wall
140         started=0
141     fi
142 }
143 status=1
144 trap "_cleanup; exit \$status" 0 1 2 3 15
145
146 # clean exit
147
148 _success()
149 {
150     status=0
151     exit 0
152 }
153
154 _get_state()
155 {
156     state=`cat $STATE`
157 }
158
159 _set_state()
160 {
161     echo $1 > $STATE
162     _get_state
163 }
164
165 _change_state()
166 {
167     new=$1
168     
169     case $state
170     in
171         *-*)
172             case $new
173             in
174                 *-*)
175                     _set_state $new
176                     ;;
177                 *)
178                     _set_state `echo $state | sed "s/-.*$/-$new/"`
179                     ;;
180             esac
181             ;;
182         *)
183             _set_state $new
184             ;;
185     esac
186 }
187
188 _sudo()
189 {
190     $ROOT/su -c "$*" < /dev/null ;# HACK - we need a hacked su at the mo
191 }
192
193 _restart()
194 {
195     # erk - why won't this thing reboot reliably??
196     exec $ROOT/su -c "(shutdown -r 2 \"auto-qa rebooting\" ; sleep 10 ; reboot ; sleep 10 ; reboot )&" < /dev/null
197 }
198
199 _update_autoqa_file()
200 {
201     SELF="$ROOT/auto-qa"
202     SELF_UPDATE="cmd/xfstests/tools/auto-qa"
203     if [ -z "$CVSROOT" ]; then
204             cmd="p_tupdate $SELF_UPDATE"
205     else
206             cmd="cvs -z3 update $SELF_UPDATE"
207     fi
208     exec $SH -c "cd $WORKAREA ; $cmd; chmod +x $SELF_UPDATE ; exec $SELF"
209 }
210
211 _update_workarea()
212 {
213     if [ -z "$CVSROOT" ]; then
214         _log "        *** p_tupdate"
215         cd $WORKAREA 
216         p_tupdate 2>&1 \
217                         || _fail "            !!! p_tupdate failed"
218
219         _log "        *** p_check/p_purge"
220         cd $WORKAREA 
221         p_check -s | p_purge -yiu 2>&1 \
222                         || _fail "            !!! p_check/p_purge failed"
223
224         _log "        *** non-trunk files"
225         cd $WORKAREA 
226         p_list -c 2>&1 \
227                         || _fail "            !!! p_list failed"
228     else
229         _log "        *** cvs update"
230         cd $WORKAREA
231         cvs -z3 update -d
232     fi
233 }
234             
235
236 _log "*** linux-xfs QA (`date`)"
237
238 _get_state
239
240 # check preconditions for starting state
241 case $1
242 in
243     cron-init)
244         case $state
245         in
246             *done)
247                 ;;
248             *)
249                 _fail "    !!! cron-init while not in \"*done\" state"
250                 ;;
251         esac
252         ;;
253     cron-restarted)
254         # we don't auto restart after reboot, but cron the restart
255         # to happen a bit later - it's much easier and safer that way
256         if [ $state != "cron-restarted" ]
257         then
258             _fail "    !!! cron-restarted while not in \"cron-restarted\" state"
259         fi
260         ;;
261 esac
262
263 if [ "$1" != "" ]
264 then
265     _set_state $1
266 fi
267
268 [ $UID -eq 0 ]          && _fail "    !!! QA most be run as a normal user"
269 [ -d $ROOT ]            || _fail "    !!! QA root \"$ROOT\" not found"
270 [ -d $WORKAREA ]        || _fail "    !!! QA workarea \"$WORKAREA\" not found"
271 [ -r $CONFIG ]          || _fail "    !!! Can't read config file $CONFIG"
272 . $COMMON_CONFIG        || _fail "    !!! Couldn't source $COMMON_CONFIG"
273
274 cd $ROOT
275
276 started=1
277 echo "auto-qa started" | wall
278
279 while true
280 do
281     _get_state
282
283     _log "    *** state $state start (`date`)"
284     _log "        (user=$USER, host=$HOST)"
285     new_state=""
286
287     case $state
288     in
289         *init)
290             echo "" > $ROOT/qa.log
291             echo "" > $ROOT/qa.full
292             _log "******************************************"
293             _log "QA init (`date`)"
294             _log "******************************************"
295
296             _change_state "inited"
297             _update_autoqa_file
298             ;;
299             
300         *inited)
301             _log "        *** QA initialized"
302             new_state="update"
303             ;;
304         
305         *update)
306             _update_workarea
307             new_state="clean"
308             ;;
309
310         *clean)
311             # we need to configure or else we might fail to clean
312             for pkg in attr acl xfsprogs xfsdump xfstests
313             do
314                 cd $WORKAREA/cmd/$pkg
315                 _log "        *** clean $pkg tools"
316                 make realclean 2>&1 \
317                         || _fail "            !!! clean $pkg failed"
318             done
319
320             _log "        *** clean quota tools"
321             cd $WORKAREA/cmd/quota
322             ( rm -f configure ; autoconf ; sh configure ; make clean ) 2>&1 \
323                         || _fail "            !!! clean quota failed"
324
325             _log "        *** clean linux"
326             cd $WORKAREA/linux
327             make mrproper 2>&1 \
328                         || _fail "            !!! clean linux failed"
329
330             _log "        *** install configuration file"
331             cp -f $CONFIG $WORKAREA/linux/.config 2>&1 \
332                         || _fail "            !!! failed to install config"
333             
334             _log "        *** remove version file"
335             rm -f include/linux/version.h 2>&1 \
336                         || _fail "            !!! failed to clean version"
337
338             new_state="reconfig"
339             ;;
340             
341         *reconfig)
342         
343             _log "        *** reconfig kernel"
344             
345             _change_state "clean" ; # we better start from scratch if this fails
346             
347             cd $WORKAREA/linux
348             # we want to use default options for any new config options.
349             echo -e "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" | \
350                 make EXTRAVERSION=$EXTRA oldconfig 2>&1 \
351                         || _fail "            !!! reconfig oldconfig failed"
352             make EXTRAVERSION=$EXTRA dep 2>&1 \
353                         || _fail "            !!! reconfig dep failed"
354
355             new_state="build"
356             ;;
357             
358         *build)
359             _log "        *** build kernel"
360             
361             _change_state "clean" ; # we better start from scratch if this fails
362             
363             cd $WORKAREA/linux
364             make -j2 EXTRAVERSION=$EXTRA bzImage 2>&1 \
365                         || _fail "            !!! build bzImage failed"
366             make -j2 EXTRAVERSION=$EXTRA modules 2>&1 \
367                         || _fail "            !!! build modules failed"
368                                     
369             _log "        *** build and install tools"
370             for pkg in attr acl xfsprogs xfsdump xfstests 
371             do
372                 cd $WORKAREA/cmd/$pkg
373
374                 # use e-fence - but this will only take effect on configure
375                 export MALLOCLIB=/usr/lib/libefence.a
376                 make configure 2>&1 \
377                         || _fail "            !!! configure $pkg failed"
378                 make default 2>&1 \
379                         || _fail "            !!! build $pkg failed"
380
381                 _sudo make install install-dev 2>&1 \
382                         || _fail "            !!! install $pkg failed"
383             done
384
385             _log "        *** build and install quota tools"
386             cd $WORKAREA/cmd/quota
387             rm -f configure
388             
389             # use e-fence - but this will only take effect on configure
390             export MALLOCLIB=/usr/lib/libefence.a
391             ( autoconf ; sh configure --prefix=/usr; make all ) 2>&1 \
392                         || _fail "            !!! build quota failed"
393             _sudo make install 2>&1 \
394                         || _fail "            !!! install quota failed"
395
396             new_state="install"
397             ;;
398             
399         *install)
400             _log "        *** blat old modules"
401             
402             _sudo rm -rf $MODULES
403             
404             _log "        *** install kernel"
405             cd $WORKAREA/linux
406             _sudo cp -f $WORKAREA/linux/arch/i386/boot/bzImage $IMAGE 2>&1 \
407                         || _fail "            !!! install kernel failed"
408             _sudo cp -f $WORKAREA/linux/System.map $SYSTEMMAP 2>&1 \
409                         || _fail "            !!! install kernel failed"
410             _sudo make EXTRAVERSION=$EXTRA modules_install 2>&1 \
411                         || _fail "            !!! install modules failed"
412
413             _log "        *** reinit lilo"
414             _sudo /sbin/lilo 2>&1 \
415                         || _fail "            !!! reinit lilo failed"
416             new_state="restart"
417             ;;
418             
419         *restart)
420             _log "            *** select qa kernel"
421             _sudo /sbin/lilo -R linux-xfs-qa 2>&1 \
422                         || _fail "            !!! lilo failed"
423             
424             _log "            *** prepare to restart"
425             _change_state "restarted"
426             
427             _log "            *** restarting"
428
429             _restart # doesn't return
430             ;;
431             
432         *restarted)
433             _log "            *** QA reentered after restart"
434             
435             new_state="check"
436             ;;
437           
438         *check)
439             uname=`uname -ar`
440             _log "            *** uname $uname"
441             _log "            *** user tools"
442             ls -l /sbin/*xfs* /usr/sbin/*xfs* 2>&1
443             _log "            *** kernel"
444             ls -l /boot/*$EXTRA*  2>&1
445             _log "            *** kernel modules"
446             ls -l /lib/modules/$VERSION$EXTRA/kernel/fs/pagebuf/* \
447                   /lib/modules/$VERSION$EXTRA/kernel/fs/xfs/*     \
448                   /lib/modules/$VERSION$EXTRA/kernel/fs/xfs_support/* 
449             
450             if [ $MODULAR -eq 0 ]
451             then
452                 new_state="reset"
453             else
454                 new_state="probe"
455             fi
456             ;;
457             
458         *probe)
459             _log "            *** modules dependencies"
460             
461             _sudo depmod -a  2>&1 \
462                         || _fail "            !!! failed to depmod -a" 
463             
464             _log "            *** unmounting XFS mounts"
465             
466             _sudo umount -a -t xfs 2>&1
467             
468             _log "            *** removing modules"
469             
470             for m in xfsidbg xfs pagebuf kdbm_pg kdbm_vm
471             do
472                 _sudo rmmod $m 2> /dev/null
473             done
474             
475             _log "            *** installing modules"
476
477             _sudo modprobe xfs 2>&1 \
478                         || _fail "            !!! failed to modprobe xfs"
479
480             new_state="reset"
481             ;;
482             
483         *reset)
484             
485             _log "            *** unmounting TEST_DEV"
486             
487             _sudo umount $TEST_DEV 2>&1
488             
489             _log "            *** unmounting SCRATCH_DEV"
490             
491             _sudo umount $SCRATCH_DEV 2>&1
492             
493             _log "            *** clean TEST_DEV"
494             
495             _sudo mkfs -t xfs -f $TEST_DEV 2>&1 \
496                         || _fail "            !!! failed to mkfs TEST_DEV"
497             
498             _log "            *** mounting TEST_DEV"
499             
500             _sudo mount -t xfs $TEST_DEV $TEST_DIR 2>&1 \
501                         || _fail "            !!! failed to mount"
502                                     
503             new_state="run"
504             ;;
505             
506             
507         soak-run)
508             cd $QADIR
509             
510             _log "            *** run soak test"
511             _sudo ./soak $SOAK_PASSES $SOAK_STRESS $SOAK_PROC\
512                         || _fail "            !!! failed to run soak test"
513
514             new_state="done"
515             ;;
516             
517         *run)
518             cd $QADIR
519             
520             _log "            *** run tests"
521             _sudo ./check -l -g auto 2>&1 | tee $ROOT/qa.out
522             
523             _log ""
524             _log "            *** send status mail"
525             mail -s "xfs qa status report" $EMAIL < $ROOT/qa.out 2>&1
526         
527             new_state="done"
528             ;;
529             
530         *done)
531             _log "*** QA run complete"
532
533             _success
534             ;;
535             
536         *nothing)
537             new_state="done"
538             _log "    *** do nothing"
539             ;;
540             
541         *)
542             _fail "           !!! unknown state $state"
543             ;;
544     esac
545
546     _log "    *** state $state done (`date`)"
547     [ "$new_state" = "" ] && _fail "    !!! no new state set"
548     _change_state $new_state
549     
550 done