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