Whamcloud - gitweb
TT-59 remove . and - from the node name
[fs/lustre-release.git] / lustre / tests / test-framework.sh
index e76c6a0..d9c6d13 100644 (file)
@@ -58,44 +58,50 @@ usage() {
 print_summary () {
     trap 0
     [ "$TESTSUITE" == "lfsck" ] && return 0
-    [ -n "$ONLY" ] && echo "WARNING: ONLY is set to ${ONLY}."
-    local form="%-13s %-17s %s\n"
-    printf "$form" "status" "script" "skipped tests E(xcluded) S(low)"
+    [ -n "$ONLY" ] && echo "WARNING: ONLY is set to $(echo $ONLY)"
+    local details
+    local form="%-13s %-17s %-9s %s %s\n"
+    printf "$form" "status" "script" "Total(sec)" "E(xcluded) S(low)"
     echo "------------------------------------------------------------------------------------"
     for O in $DEFAULT_SUITES; do
-        local skipped=""
-        local slow=""
         O=$(echo $O  | tr "-" "_" | tr "[:lower:]" "[:upper:]")
-        local o=$(echo $O  | tr "[:upper:]" "[:lower:]")
-        o=${o//_/-}
+        [ "${!O}" = "no" ] && continue || true
+        local o=$(echo $O  | tr "[:upper:]_" "[:lower:]-")
         local log=${TMP}/${o}.log
-        [ -f $log ] && skipped=$(grep excluded $log | awk '{ printf " %s", $3 }' | sed 's/test_//g')
-        [ -f $log ] && slow=$(grep SLOW $log | awk '{ printf " %s", $3 }' | sed 's/test_//g')
-        [ "${!O}" = "done" ] && \
-            printf "$form" "Done" "$O" "E=$skipped" && \
-            [ -n "$slow" ] && printf "$form" "-" "-" "S=$slow"
-
+        if is_sanity_benchmark $o; then
+            log=${TMP}/sanity-benchmark.log
+        fi
+        local slow=
+        local skipped=
+        local total=
+        local status=Unfinished
+        if [ -f $log ]; then
+            skipped=$(grep excluded $log | awk '{ printf " %s", $3 }' | sed 's/test_//g')
+            slow=$(egrep "^PASS|^FAIL" $log | tr -d "("| sed s/s\)$//g | sort -nr -k 3  | head -5 |  awk '{ print $2":"$3"s" }')
+            total=$(grep duration $log | awk '{ print $2}')
+            if [ "${!O}" = "done" ]; then
+                status=Done
+            fi
+            if $DDETAILS; then
+                local durations=$(egrep "^PASS|^FAIL" $log |  tr -d "("| sed s/s\)$//g | awk '{ print $2":"$3"|" }')
+                details=$(printf "%s\n%s %s %s\n" "$details" "DDETAILS" "$O" "$(echo $durations)")
+            fi
+        fi
+        printf "$form" $status "$O" "${total}" "E=$skipped"
+        printf "$form" "-" "-" "-" "S=$(echo $slow)"
     done
 
     for O in $DEFAULT_SUITES; do
         O=$(echo $O  | tr "-" "_" | tr "[:lower:]" "[:upper:]")
         if [ "${!O}" = "no" ]; then
-            # FIXME.
-            # only for those tests suits which are run directly from acc-sm script:
-            # bonnie, iozone, etc.
-            if [ -f "$TESTSUITELOG" ] && grep FAIL $TESTSUITELOG | grep -q ' '$O  ; then
-               printf "$form" "UNFINISHED" "$O" ""  
-            else
-               printf "$form" "Skipped" "$O" ""
-            fi
+            printf "$form" "Skipped" "$O" ""
         fi
     done
 
-    for O in $DEFAULT_SUITES; do
-        O=$(echo $O  | tr "-" "_" | tr "[:lower:]" "[:upper:]")
-        [ "${!O}" = "done" -o "${!O}" = "no" ] || \
-            printf "$form" "UNFINISHED" "$O" ""
-    done
+    # print the detailed tests durations if DDETAILS=true
+    if $DDETAILS; then
+        echo "$details"
+    fi
 }
 
 init_test_env() {
@@ -246,6 +252,8 @@ init_test_env() {
     shift $((OPTIND - 1))
     ONLY=${ONLY:-$*}
 
+    # print the durations of each test if "true"
+    DDETAILS=${DDETAILS:-false}
     [ "$TESTSUITELOG" ] && rm -f $TESTSUITELOG || true
     rm -f $TMP/*active
 }
@@ -286,7 +294,7 @@ load_module() {
         eval set -- \$$optvar
         if [ $# -eq 0 -a -n "$MODPROBECONF" ]; then
             # Nothing in $MODOPTS_<MODULE>; try modprobe.conf
-            set -- $(grep "^options\\s*\<${module}\>" $MODPROBECONF)
+            set -- $(grep -P "^options\\s+${BASE}" $MODPROBECONF)
             # Get rid of "options $module"
             (($# > 0)) && shift 2
 
@@ -712,13 +720,10 @@ setup_quota(){
 }
 
 zconf_mount() {
-    local OPTIONS
     local client=$1
     local mnt=$2
-    # Only supply -o to mount if we have options
-    if [ -n "$MOUNTOPT" ]; then
-        OPTIONS="-o $MOUNTOPT"
-    fi
+    local OPTIONS=${3:-$MOUNTOPT}
+
     local device=$MGSNID:/$FSNAME
     if [ -z "$mnt" -o -z "$FSNAME" ]; then
         echo Bad zconf mount command: opt=$OPTIONS dev=$device mnt=$mnt
@@ -827,10 +832,6 @@ zconf_mount_clients() {
     local mnt=$2
     local OPTIONS=${3:-$MOUNTOPT}
 
-    # Only supply -o to mount if we have options
-    if [ "$OPTIONS" ]; then
-        OPTIONS="-o $OPTIONS"
-    fi
     local device=$MGSNID:/$FSNAME
     if [ -z "$mnt" -o -z "$FSNAME" ]; then
         echo Bad zconf mount command: opt=$OPTIONS dev=$device mnt=$mnt
@@ -1027,14 +1028,14 @@ check_progs_installed () {
 }
 
 # recovery-scale functions
-client_var_name() {
-    echo __$(echo $1 | tr '-' 'X')
+node_var_name() {
+    echo __$(echo $1 | tr '-' '_' | tr '.' '_')
 }
 
 start_client_load() {
     local client=$1
     local load=$2
-    local var=$(client_var_name $client)_load
+    local var=$(node_var_name $client)_load
     eval export ${var}=$load
 
     do_node $client "PATH=$PATH MOUNT=$MOUNT ERRORS_OK=$ERRORS_OK \
@@ -1065,7 +1066,7 @@ start_client_loads () {
 # only for remote client 
 check_client_load () {
     local client=$1
-    local var=$(client_var_name $client)_load
+    local var=$(node_var_name $client)_load
     local TESTLOAD=run_${!var}.sh
 
     ps auxww | grep -v grep | grep $client | grep -q "$TESTLOAD" || return 1
@@ -1139,7 +1140,7 @@ restart_client_loads () {
         check_client_load $client
         rc=${PIPESTATUS[0]}
         if [ "$rc" != 0 -a "$expectedfail" ]; then
-            local var=$(client_var_name $client)_load
+            local var=$(node_var_name $client)_load
             start_client_load $client ${!var}
             echo "Restarted client load ${!var}: on $client. Checking ..."
             check_client_load $client
@@ -1484,6 +1485,11 @@ replay_barrier() {
     local facet=$1
     do_facet $facet sync
     df $MOUNT
+
+    # make sure there will be no seq change
+    local clients=${CLIENTS:-$HOSTNAME}
+    do_nodes $clients "f=${MOUNT}/fsa-\\\$(hostname); mcreate \\\$f; rm \\\$f"
+
     local svc=${facet}_svc
     do_facet $facet $LCTL --device %${!svc} notransno
     do_facet $facet $LCTL --device %${!svc} readonly
@@ -2209,6 +2215,9 @@ nfs_client_mode () {
         # FIXME: remove hostname when 19215 fixed
         do_nodes $clients "echo \\\$(hostname); grep ' '$MOUNT' ' /proc/mounts"
         declare -a nfsexport=(`grep ' '$MOUNT' ' /proc/mounts | awk '{print $1}' | awk -F: '{print $1 " "  $2}'`)
+        if [[ ${#nfsexport[@]} -eq 0 ]]; then
+                error_exit NFSCLIENT=$NFSCLIENT mode, but no NFS export found!
+        fi
         do_nodes ${nfsexport[0]} "echo \\\$(hostname); df -T  ${nfsexport[1]}"
         return
     fi
@@ -2882,6 +2891,14 @@ error_noexit() {
     echo "$@" > $LOGDIR/err
 }
 
+exit_status () {
+    local status=0
+    local log=$TESTSUITELOG
+
+    [ -f "$log" ] && grep -q FAIL $log && status=1
+    exit $status
+}
+
 error() {
     error_noexit "$@"
     exit 1
@@ -2907,6 +2924,8 @@ skip_env () {
 skip () {
     echo
     log " SKIP: ${TESTSUITE} ${TESTNAME} $@"
+    [ "$ALWAYS_SKIPPED" ] && \
+        skip_logged ${TESTNAME} "$@" || true
     [ "$TESTSUITELOG" ] && \
         echo "${TESTSUITE}: SKIP: $TESTNAME $@" >> $TESTSUITELOG || true
 }
@@ -2922,9 +2941,12 @@ build_test_filter() {
         log "excepting tests: `echo $EXCEPT $ALWAYS_EXCEPT`"
     [ "$EXCEPT_SLOW" ] && \
         log "skipping tests SLOW=no: `echo $EXCEPT_SLOW`"
-    for E in $EXCEPT $ALWAYS_EXCEPT; do
+    for E in $EXCEPT; do
         eval EXCEPT_${E}=true
     done
+    for E in $ALWAYS_EXCEPT; do
+        eval EXCEPT_ALWAYS_${E}=true
+    done
     for E in $EXCEPT_SLOW; do
         eval EXCEPT_SLOW_${E}=true
     done
@@ -2943,6 +2965,7 @@ basetest() {
 
 # print a newline if the last test was skipped
 export LAST_SKIPPED=
+export ALWAYS_SKIPPED=
 #
 # Main entry into test-framework. This is called with the name and
 # description of a test. The name is used to find the function to run
@@ -2984,6 +3007,20 @@ run_test() {
         TESTNAME=test_$1 skip "skipping excluded test $1 (base $base)"
         return 0
     fi
+    testname=EXCEPT_ALWAYS_$1
+    if [ ${!testname}x != x ]; then
+        LAST_SKIPPED="y"
+        ALWAYS_SKIPPED="y"
+        TESTNAME=test_$1 skip "skipping ALWAYS excluded test $1"
+        return 0
+    fi
+    testname=EXCEPT_ALWAYS_$base
+    if [ ${!testname}x != x ]; then
+        LAST_SKIPPED="y"
+        ALWAYS_SKIPPED="y"
+        TESTNAME=test_$1 skip "skipping ALWAYS excluded test $1 (base $base)"
+        return 0
+    fi
     testname=EXCEPT_SLOW_$1
     if [ ${!testname}x != x ]; then
         LAST_SKIPPED="y"
@@ -2998,6 +3035,7 @@ run_test() {
     fi
 
     LAST_SKIPPED=
+    ALWAYS_SKIPPED=
     run_one_logged $1 "$2"
 
     return $?
@@ -3032,6 +3070,12 @@ trace() {
         return 1
 }
 
+complete () {
+    equals_msg $1 test complete, duration $2 sec
+    [ -f "$TESTSUITELOG" ] && egrep .FAIL $TESTSUITELOG || true
+    echo duration $2 >>$TESTSUITELOG
+}
+
 pass() {
     # Set TEST_STATUS here; will be used for logging the result
     if [ -f $LOGDIR/err ]; then
@@ -3039,12 +3083,15 @@ pass() {
     else
         TEST_STATUS="PASS"
     fi
-    echo $TEST_STATUS " " $@
+    echo "$TEST_STATUS $@" 2>&1 | tee -a $TESTSUITELOG
 }
 
 check_mds() {
-    FFREE=$(do_node $SINGLEMDS lctl get_param -n osd.*MDT*.filesfree | awk 'BEGIN{avail=0}; {avail+=$1}; END{print avail}')
-    FTOTAL=$(do_node $SINGLEMDS lctl get_param -n osd.*MDT*.filestotal | awk 'BEGIN{avail=0}; {avail+=$1}; END{print avail}')
+    local FFREE=$(do_node $SINGLEMDS \
+        lctl get_param -n osd*.*MDT*.filesfree | calc_sum)
+    local FTOTAL=$(do_node $SINGLEMDS \
+        lctl get_param -n osd*.*MDT*.filestotal | calc_sum)
+
     [ $FFREE -ge $FTOTAL ] && error "files free $FFREE > total $FTOTAL" || true
 }
 
@@ -3120,7 +3167,7 @@ run_one_logged() {
         echo "test_$1 returned $RC" | tee $LOGDIR/err
 
     duration=$((`date +%s` - $BEFORE))
-    pass "(${duration}s)"
+    pass "$1" "(${duration}s)"
     [ -f $LOGDIR/err ] && TEST_ERROR=$(cat $LOGDIR/err)
     log_sub_test_end $TEST_STATUS $duration "$RC" "$TEST_ERROR"
 
@@ -3131,6 +3178,14 @@ run_one_logged() {
     return 0
 }
 
+#
+# Print information of skipped tests to result.yml
+#
+skip_logged(){
+    log_sub_test_begin $1
+    log_sub_test_end "SKIP" "0" "0" "\"$2\""
+}
+
 canonical_path() {
     (cd `dirname $1`; echo $PWD/`basename $1`)
 }
@@ -4357,7 +4412,7 @@ init_logging() {
         echo "Logging to local directory: $LOGDIR"
     fi
 
-    yml_nodes_file $LOGDIR
+    yml_nodes_file $LOGDIR >> $YAML_LOG
     yml_results_file >> $YAML_LOG
 }
 
@@ -4370,11 +4425,11 @@ log_test_status() {
 }
 
 log_sub_test_begin() {
-    yml_log_sub_test_begin $@ >> $YAML_LOG
+    yml_log_sub_test_begin "$@" >> $YAML_LOG
 }
 
 log_sub_test_end() {
-    yml_log_sub_test_end $@ >> $YAML_LOG
+    yml_log_sub_test_end "$@" >> $YAML_LOG
 }
 
 run_llverdev()
@@ -4470,3 +4525,19 @@ else
     echo \\\$(basename \\\$dv);
 fi;"
 }
+
+is_sanity_benchmark() {
+    local benchmarks="dbench bonnie iozone fsx"
+    local suite=$1
+    for b in $benchmarks; do
+        if [ "$b" == "$suite" ]; then
+            return 0
+        fi
+    done
+    return 1
+}
+
+min_ost_size () {
+    $LCTL get_param -n osc.*.kbytesavail | sort -n | head -n1
+}
+