summaryrefslogtreecommitdiff
path: root/qa/admin/pcp-qa-summary
diff options
context:
space:
mode:
Diffstat (limited to 'qa/admin/pcp-qa-summary')
-rwxr-xr-xqa/admin/pcp-qa-summary320
1 files changed, 320 insertions, 0 deletions
diff --git a/qa/admin/pcp-qa-summary b/qa/admin/pcp-qa-summary
new file mode 100755
index 0000000..1fa6ee3
--- /dev/null
+++ b/qa/admin/pcp-qa-summary
@@ -0,0 +1,320 @@
+#!/bin/sh
+#
+# pcp-qa-summary [vm ...]
+#
+# Used in concert with pcp-daily -q
+#
+
+_usage()
+{
+ echo "Usage: $0 [options] [vm ...]"
+ echo "Options:"
+ echo " -d debug"
+ echo " -m N minimum number of tests run to be reported [default 60]"
+ echo ' -n report not run tests (reported as "-")'
+ echo " -r only most recent results date [default report all dates]"
+ exit 1
+}
+
+
+# must have tried to run at least this number to qualify
+# 60 = > -g sanity [minus a few not runs]
+#
+minrun=60
+
+debug=false
+recent=false
+nflag=false
+while getopts 'dm:nr?' p
+do
+ case "$p"
+ in
+ d) debug=true
+ ;;
+ m) minrun=$OPTARG
+ ;;
+ n) nflag=true
+ ;;
+ r) recent=true
+ ;;
+ ?) _usage
+ # NOTREACHED
+ esac
+done
+shift `expr $OPTIND - 1`
+
+sts=0
+if $debug
+then
+ tmp=`pwd`/tmp
+ trap "exit \$sts" 0 1 2 3 15
+else
+ tmp=/var/tmp/$$
+ trap "rm -f $tmp.*; exit \$sts" 0 1 2 3 15
+fi
+rm -f $tmp.*
+
+if [ $# -eq 0 ]
+then
+ set -- `[ -d $HOME/Logs/by-vm ] && cd $HOME/Logs/by-vm && echo *`
+fi
+
+if [ -f $HOME/whatami.out ]
+then
+ # Turn
+ # Host PCP CPU Operating System
+ # ----------- -------- ------ ------------------
+ # vm00 3.7.0 x86_64 Ubuntu 12.04 (precise)
+ # into
+ # vm00|PCP 3.7.0 x86_64 Ubuntu 12.04
+ #
+ sed <$HOME/whatami.out \
+ -e '1,2d' \
+ -e '/^[ ]*$/d' \
+ -e 's/ */|PCP#/' \
+ -e 's/ */#/' \
+ -e 's/ */#/' \
+ -e 's/ *(.*)//' \
+ -e 's/#/ /g' \
+ | LC_COLLATE=POSIX sort -t '|' --key=1,1 >$tmp.what
+fi
+
+_what()
+{
+ if [ -f $tmp.what ]
+ then
+ LC_COLLATE=POSIX sort -t '|' --key=1,1 \
+ | join \
+ -1 2 -2 1 -t '|' -a 1 -e "$vmdir" -o 1.1,2.1,2.2 \
+ - $tmp.what \
+ | sed -e 's/|PCP/ PCP/'
+ else
+ cat
+ fi
+}
+
+echo "==== QA Summary ===="
+echo
+echo "Date Run Pass Fail Nrun Host"
+for vm
+do
+ cd $HOME/Logs/by-vm
+ if [ -d "$vm" ]
+ then
+ cd "$vm"
+ vmdir="$vm"
+ else
+ vmdir=`echo ${vm}*`
+ if [ -d "$vmdir" ]
+ then
+ cd "$vmdir"
+ else
+ echo "$vm: arrrgggh no \$HOME/Logs/${vm}* directory"
+ continue
+ fi
+ fi
+ basevmname=`echo $vmdir | sed -e 's/\(vm[0-9][0-9]\)-.*/\1/' -e 's/\.sgi.com//'`
+ rm -f $tmp.seen $tmp.found
+ for date in `ls | grep -v qa | grep -v pcpqa | grep -v pcp | sort -r`
+ do
+ [ -f $date ] || continue
+ touch $tmp.seen
+ $debug && echo "Debug: == $vmdir on $date =="
+ # Looking for
+ # Not run: 008 009 022 096 114 117 130 148 164 212 223 233 284 290 307 311 329 330 331 332 333 348 361 370 377 390 420 441 442 476 477 478 480 506 512 545 570 584 640 652 654 712 713 714
+ # Failures: 062 169 244
+ # Failed 3 of 516 tests
+ # Passed all 67 tests
+ #
+ rm -f $tmp.dbg
+ if egrep '^((Not run:)|Failures:|(Failed [0-9][0-9]* of [0-9][0-9]* tests)|(Passed all [0-9][0-9]* tests)|Info:|===)' <$date >/dev/null
+ then
+ awk <$date >$tmp.out '
+/^Not run:/ { notrun = NF - 2
+ nrlist = $3
+ for (i = 4; i <= NF; i++) nrlist = nrlist " " $i
+ state = 1
+ print NR,": Not run: start: notrun=" notrun >"'$tmp.dbg'"
+ next
+ }
+/^Failed [0-9][0-9]* of [0-9][0-9]* tests/ {
+ failed = $2
+ run = $4
+ state = 3
+ }
+/^Passed all [0-9][0-9]* tests/ {
+ failed = 0
+ run = $3
+ state = 3
+ }
+/^Failures:/ { nfail = NF - 1
+ flist = $2
+ for (i = 3; i <= NF; i++) flist = flist " " $i
+ print NR,": Failures: start: nfail=" nfail >"'$tmp.dbg'"
+ state = 2
+ next
+ }
+/^Info:/ {
+ state = 0
+ notrun = 0
+ nfail = 0
+ next
+ }
+/^===/ {
+ state = 0
+ notrun = 0
+ nfail = 0
+ next
+ }
+state == 1 { # Not run: list broken over multiple lines
+ notrun += NF
+ for (i = 1; i <= NF; i++) nrlist = nrlist " " $i
+ print NR,": Not run: add",NF," notrun=" notrun >"'$tmp.dbg'"
+ next
+ }
+state == 2 { # Failures: list broken over multiple lines
+ nfail += NF
+ for (i = 1; i <= NF; i++) flist = flist " " $i
+ print NR,": Failures: add",NF," nfail=" nfail >"'$tmp.dbg'"
+ next
+ }
+state == 3 { if (run >= '$minrun') printf "%s %4d %4d %4d %4d|%s|%s+%s\n","'$date'",run,run-failed,failed,notrun,"'$basevmname'",flist,nrlist
+ state = 0
+ notrun = 0
+ nfail = 0
+ }
+END { print NR,": END state=" state >"'$tmp.dbg'"
+ }'
+ # Need to sort multiple runs one this date and pick the one
+ # with the maximum passes and minimum not runs
+ #
+ # 2013-03-13 1 1 0 0|vm19-opensuse-64
+ # 2013-03-13 67 67 0 2|vm19-opensuse-64
+ # 2013-03-13 512 509 3 48|vm19-opensuse-64
+ # 2013-03-13 512 509 3 16|vm19-opensuse-64
+ $debug && sed -e 's/^/Debug: /' <$tmp.dbg
+ sort <$tmp.out --key=3,3nr --key=5,5n \
+ | sed -e 1q >$tmp.tmp
+ if [ -s $tmp.tmp ]
+ then
+ if $debug
+ then
+ echo "Debug: summary lines ..."
+ sed -e 's/^/Debug: /' <$tmp.out
+ fi
+ sed -e 's/|[^|]*$//' <$tmp.tmp | _what >>$tmp.found
+ nfail=`awk <$tmp.tmp '{print $4}'`
+ if [ $nfail -gt 0 ]
+ then
+ sed -e 's/.*|//' -e 's/+.*//' <$tmp.tmp \
+ | tr ' ' '\012' \
+ | sed -e "s/\$/ X $basevmname/" >>$tmp.map
+ fi
+ if $nflag
+ then
+ nrun=`sed -e 's/|.*//' <$tmp.tmp | awk '{print $5}'`
+ if [ $nrun -gt 0 ]
+ then
+ sed -e 's/.*+//' <$tmp.tmp \
+ | tr ' ' '\012' \
+ | sed -e "s/\$/ - $basevmname/" >>$tmp.map
+ fi
+ fi
+ $recent && break
+ else
+ $debug && echo "Debug: tag lines, but no QA results found"
+ fi
+ else
+ $debug && echo "Debug: no QA result tag lines found"
+ fi
+ done
+ if [ -f $tmp.found ]
+ then
+ sort $tmp.found
+ cat $tmp.found >>$tmp.counts
+ else
+ if [ -f $tmp.seen ]
+ then
+ printf "%-30s|%s\n" "Daily runs, but no QA" "$basevmname" | _what
+ elif [ ! -f $tmp.seen ]
+ then
+ printf "%-30s|%s\n" "No daily runs" "$basevmname" | _what
+ fi
+ fi
+
+done
+
+if [ -f $tmp.counts ]
+then
+ awk <$tmp.counts '
+ { nrun += $2; nfail += $4 }
+END { printf "Summary: %d run, %d failed (%.2f%%)\n", nrun, nfail, 100*nfail/nrun }'
+fi
+
+if [ -f $tmp.map ]
+then
+ echo
+ if $nflag
+ then
+ echo "==== QA Failure (X) and Not Run (-) Map ===="
+ else
+ echo "==== QA Failure (X) Map ===="
+ fi
+ echo
+ ( ( sed -e 's/.* //' <$tmp.map | sort | uniq ) \
+ ; echo "---" \
+ ; sort -n $tmp.map \
+ ; echo "END" \
+ ) \
+ | awk '
+function heading() {
+ printf "%4.4s","Host"
+ for (i = 0; i < nh; i++) {
+ if (host[i] ~ /^vm/)
+ printf " %2.2s",substr(host[i],length(host[i])-1)
+ else if (host[i] == "bozo-laptop")
+ printf " %2.2s","bl"
+ else if (host[i] == "bozo-vm")
+ printf " %2.2s","bv"
+ else
+ printf " %2.2s",substr(host[i],1,2)
+ }
+ printf "\n"
+}
+BEGIN { nh = 0; state = 0 }
+$1 == "---" { heading()
+ printf "%4.4s","QA"
+ for (i = 0; i < nh; i++) printf " %2.2s"," "
+ printf " %4.4s QA groups\n","QA"
+ state = 1
+ last = $1
+ next
+ }
+state == 0 { host[nh] = $1; nh++; next }
+$1 != last { if (last != "---") {
+ printf "%4.4s",last
+ for (i = 0; i < nh; i++) printf " %2.2s",fail[i]
+ printf " %4.4s ",last
+ cmd = "grep \"^" last " \" $HOME/src/pcp/qa/group | sed -e \"s/^[0-9]* //\""
+ system(cmd)
+ }
+ for (i = 0; i < nh; i++) fail[i] = " "
+ last = $1
+ }
+$1 == last { for (i = 0; i < nh; i++) {
+ if (host[i] == $3) {
+ fail[i] = $2
+ break
+ }
+ }
+ }
+END { heading() }' \
+ | sed \
+ -e 's/ remote//' \
+ -e 's/ sanity//' \
+ -e 's/ ostest//' \
+ -e 's/ local//' \
+ -e 's/ oss//' \
+ -e 's/ #[0-9][0-9]*//g'
+fi
+