#!/bin/bash # vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # # runtest.sh of /tools/systemtap/Regression/testsuite-upstream-raw # Description: testsuite-upstream-raw # Author: Martin Cermak # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # # Copyright (c) 2014 Red Hat, Inc. # # 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, see http://www.gnu.org/licenses/. # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Include Beaker environment . /usr/share/beakerlib/beakerlib.sh || exit 1 # What part of the testsuite should we run (and then check for errors)? _WHAT=${_WHAT:-DEFAULT} export AVC_ERROR='+no_avc_check' touch /tmp/disable-qe-abrt unset DEBUGINFOD_PROGRESS if test $(rpm --eval "0%{rhel}") -ge 9; then # Allow use of debuginfod export DEBUGINFOD_URLS=http://debuginfod.usersys.redhat.com:3632/ # export DEBUGINFOD_PROGRESS=1 else unset DEBUGINFOD_URLS fi trap '' SIGHUP SIGINT SIGQUIT SIGABRT ORIGPWD=$( pwd ) PKGMGR="yum --skip-broken --nogpgcheck" rpm -q dnf && PKGMGR="dnf --setopt=strict=0 --nogpgcheck" STARTDATE=$(date +%Y-%m-%d-%H-%M-%S) STAPSRPM=$(rpm -qif `which stap` | awk '/Source RPM/ {print $NF}' | sort -u | sed 's/\.src\.rpm//') SUITERPM=$(rpm --queryformat '%{name}\n' -qf `which stap` | grep -o '.*systemtap' | sort -u)-testsuite SUITELOC=$(rpm -ql $SUITERPM | grep -o '.*systemtap\/testsuite/' | sort -u) test_primary_arch_only () { echo "=== TESTING PRIMARY ARCH ONLY ===" sed -i '/^proc arch_compile_flags/,/^}/d' $SUITELOC/lib/compile_flags.exp echo 'proc arch_compile_flags {} { return 1 }' >> $SUITELOC/lib/compile_flags.exp } # For devtoolset, compat arch support was dropped for non-x86_64 arches. Ref: bz1493500 if echo $SUITELOC | grep -q toolset && arch | egrep -q '^(ppc64|s390x)$'; then test_primary_arch_only elif test $(rpm -E '0%{rhel}') -ge 8 -a "$(arch)" != "x86_64"; then test_primary_arch_only fi # Currently the Makefile overrides what was set in the env via # http://pkgs.devel.redhat.com/cgit/rpms/devtoolset-7/commit/?h=devtoolset-7.1-rhel-7&id=e305f5912a13bd2ca04ac319afca50bfab6f4aea # And actually if the base rhel dyninst is installed, the dts testsuite runs against it rather than agains # the dts-stap - producing irrelevant test results. # # A real fix on the stap side might be: # -LD_LIBRARY_PATH=$(DESTDIR)$(libdir)/systemtap # +LD_LIBRARY_PATH=$(DESTDIR)$(libdir)/systemtap:$(DESTDIR)$(libdir)/dyninst # in the Makefile.am etc, but let's work this around for now in a way that we simply use the # LD_LIBRARY_PATH taken directly from the env: if echo $SUITELOC | grep -q toolset; then sed -i 's/^LD_LIBRARY_PATH/# LD_LIBRARY_PATH/' $SUITELOC/Makefile fi rlJournalStart rlPhaseStartSetup rlLogInfo "SUITERPM=$SUITERPM" rlLogInfo "SUITELOC=$SUITELOC" rlRun "pushd $SUITELOC" rlServiceStop firewalld rlServiceStop iptables rlServiceStop ip6tables rlServiceStart avahi-daemon rlRun "rpm -qa | grep ^kernel | grep -v `uname -r` | xargs rpm -e --nodeps" 0-255 # if ! (uname -r | fgrep -q '.rt'); then # rlRun "$ORIGPWD/stap-prep" 0,127 || \ # rlRun "stap-prep" 0,127 # fi rlRun "sysctl -w kernel.panic=1" rlRun "sysctl -w kernel.panic_on_oops=1" rlRun "$PKGMGR -y install --setopt=multilib_policy=all libstdc++ dejagnu elfutils-devel gettext libgcc glibc-devel gcc-c++ libstdc++-devel dyninst dyninst-devel" rlPhaseEnd MYDMESGDIR=/root/mydmesg mkdir -p $MYDMESGDIR if strings $(which dmesg) | fgrep -q -- '-w'; then rlPhaseStart FAIL "Run dmesg recorder." MYTIMESTAMP=$(date +%s) dmesg -wH > $MYDMESGDIR/dmesg$MYTIMESTAMP & MYDMESGPID=$! rlLogInfo "Dmesg recorder file: $MYDMESGDIR/dmesg$MYTIMESTAMP" rlLogInfo "Dmesg PID: $MYDMESGPID" rlPhaseEnd fi rlPhaseStart FAIL "sanity check" rlRun "stap -vve 'probe kernel.function(\"vfs_read\"){ log(\"hey!\"); exit() } probe timer.s(60){log(\"timeout\"); exit()}'" rlRun "stap -vvl 'process(\"/usr/sbin/fdisk\").function(\"main\")'" 0-255 rlPhaseEnd if ! test -f $SUITELOC/systemtap.log; then rlPhaseStart WARN "Apply blacklist" # === RHEL7 === if rlIsRHEL 7; then if arch | grep -q s390; then true # PR17270 #rlRun "rm -f systemtap.onthefly/hrtimer_onthefly.exp" #rlRun "rm -f systemtap.onthefly/uprobes_onthefly.exp" #rlRun "rm -f systemtap.onthefly/kprobes_onthefly.exp" # PR17140 #rlRun "rm -f systemtap.examples/profiling/functioncallcount.stp" elif arch | grep -q ppc; then true # PR17270 #rlRun "rm -f systemtap.onthefly/hrtimer_onthefly.exp" #rlRun "rm -f systemtap.onthefly/uprobes_onthefly.exp" #rlRun "rm -f systemtap.onthefly/kprobes_onthefly.exp" # PR17126 #rlRun "rm -f systemtap.base/tracepoints.exp" # BZ1153082 #rlRun "rm -f systemtap.clone/main_quiesce.exp" #elif rpm -q systemtap | grep -q '2.4-16.el7_0'; then # BZ1145958 #rlRun "rm -f systemtap.base/process_resume.exp" fi # === FEDORA === elif grep -qi fedora /etc/redhat-release; then # BZ1153082 rlRun "rm -f systemtap.clone/main_quiesce.exp" fi # Work around problem fixed in https://sourceware.org/git/gitweb.cgi?p=systemtap.git;a=commitdiff;h=a9b0aa4dbd1aa7a1c36eba8102e1445e8f2eb8b8 rlRun "sed -i 's/exit\ 0/return/' $(fgrep -ril 'exit 0' $(find . -type f -name '*.exp')) ||:" rlPhaseEnd else rlPhaseStart FAIL "Post-process anticipated reboot" # Sometimes the testsuite crashes the kernel or causes stall. # In case --ignore-panic is set, the box gets rebooted (bz1155644). # This shouldn't happen. It'd be nice to report it as FAIL, but that # appears to be too pedantic. We'll need this bell to ring when # too many unexpected failures get reported by the upstream test driver. # rlRun "false" # Remove testcases that have already been run for tc in $( awk '/^Running.*exp\ \.\.\.$/ {print $2}' *systemtap.log ); do echo $tc | grep -q 'systemtap/notest.exp' && continue test -f $tc && rm -f $tc && rlLog "Removed $tc" done #generate random hash HASH=$(date | md5sum | cut -c 1-32 -) # save existing logs before creating new ones rlRun "mv systemtap.log ${HASH}-systemtap.log" rlRun "mv systemtap.sum ${HASH}-systemtap.sum" # clean up garbage incl. systemtap.log rlRun "make clean" rlPhaseEnd fi rlPhaseStartTest # Start internal watchdog if running in beaker if test -n $JOBID; then rlLogInfo "Starting internal watchdog ..." $ORIGPWD/internal-watchdog.sh "$SUITELOC/systemtap.sum" & __WATCHDOG_PID=$! sleep 3 if ps -p $__WATCHDOG_PID; then rlLogInfo "Internal watchdog running (pid $__WATCHDOG_PID)." else rlFail "Problem starting the internal watchdog." fi fi # The _WHAT env var allows the test to only run selected subset of all # the tests and perform specific checks on the resulting logs. # # Accepted values: BPF # run the testsuite (grab the list of testcases from the respective check* file) TESTCASES=$(bash ${ORIGPWD}/check_${_WHAT}.sh TCLIST) rlRun "make RUNTESTFLAGS='$TESTCASES' installcheck 2>&1" # Kill internal watchdog if running in beaker if ! test -z $JOBID; then rlLogInfo "Killing internal watchdog ..." kill -s TERM $__WATCHDOG_PID fi rlPhaseEnd rlPhaseStart FAIL "Put all the log fragments together" rlRun "$ORIGPWD/dg-extract-results.sh *systemtap.sum > big-systemtap.sum" rlRun "$ORIGPWD/dg-extract-results.sh -L *systemtap.log > big-systemtap.log" rlRun "mv --force big-systemtap.sum systemtap.sum" rlRun "mv --force big-systemtap.log systemtap.log" # remove the hash-prefixed fragments # these are needed for the resume mode, but since we got to this point, # we most likely processed all the testcases somehow, put all the pieces # together and can start cleaning up and reporting rlRun "rm -f *-systemtap.{log,sum}" rlPhaseEnd rlPhaseStart FAIL "rlFileSubmit logs" rlRun "xz --keep --force systemtap.log" rlFileSubmit "systemtap.log.xz" rlRun "xz --keep --force systemtap.sum" rlFileSubmit "systemtap.sum.xz" rlRun "rm systemtap.log.xz systemtap.sum.xz" rlPhaseEnd if [[ "$_WHAT" == "DEFAULT" ]]; then rlPhaseStart FAIL "save logs to /mnt/scratch" MP=$( mktemp -d ) # Refer to /tools/systemtap/Install/upstream-head SD=rhpkg; rpm -q systemtap | grep -q mcermak && SD=upstream rlRun "echo ${BEAKER}jobs/${JOBID} > job.txt" rlRun "tar cf mydmesg.tar $MYDMESGDIR" rlRun "xz mydmesg.tar" rlRun "mount -o rw,nolock nfs.englab.brq.redhat.com:/scratch/mcermak $MP" if test $(rpm --eval '0%{rhel}') -eq 8 && (! echo ${STAPSRPM} | grep '\.el8'); then rlRun "LOGNAME=${MP}/testlogs/systemtap.${SD}/${STAPSRPM}.el8.$(uname -m)-${STARTDATE}" else rlRun "LOGNAME=${MP}/testlogs/systemtap.${SD}/${STAPSRPM}.$(uname -m)-${STARTDATE}" fi rlRun "mkdir -p $( dirname $LOGNAME )" rlRun "tar cJf ${LOGNAME}.tar.xz systemtap.log systemtap.sum job.txt mydmesg.tar.xz" # Upload logs to bunsen instance on tofan if running in beaker if ! test -z $JOBID; then LOGFULLNAME="${LOGNAME}.tar.xz" LOGBASENAME="$(basename $LOGFULLNAME)" rlLogInfo "Uploading test log to bunsen..." rlRun "cat $LOGFULLNAME | \ curl -X POST -F project=systemtap-qe \ -F tarballname=$LOGBASENAME \ -F 'tar=@-' \ http://tofan.yyz.redhat.com:8013/bunsen-upload.py" fi rlRun "umount -l $MP && sleep 3 && rm -rf $MP" rlPhaseEnd fi rlPhaseStart FAIL "Log checks ($_WHAT)" rlRun "bash ${ORIGPWD}/check_${_WHAT}.sh" rlPhaseEnd rlPhaseStartCleanup rlServiceRestore firewalld rlServiceRestore iptables rlServiceRestore ip6tables rlServiceRestore avahi-daemon rlRun popd kill -9 $MYDMESGPID ||: rlPhaseEnd rlJournalPrintText rlJournalEnd rm -f /tmp/disable-qe-abrt