X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fauster;h=39e621f5a9097f4680ce8cfe3fd4b5384dacfecb;hb=33ed79ba61a3275519c897557407619d576a9dc2;hp=21087e0e09bb05b111faa2e57cf3b126cb10753f;hpb=eccc959e384bae23cdb91d9cd1d2ec779ce2e127;p=fs%2Flustre-release.git diff --git a/lustre/tests/auster b/lustre/tests/auster index 21087e0..39e621f 100755 --- a/lustre/tests/auster +++ b/lustre/tests/auster @@ -1,35 +1,51 @@ #!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +# +# This file is part of Lustre, http://www.lustre.org/ +# +# lustre/tests/auster # +# Drive lustre tests +# + # -# auster - drive lustre tests # TODO # 1. --time-limt add per test time limit, kill test if it runs to long # 2. Read list of tests to run from a file. same syntax as cli, but one test per line # 3. Run test on remote node -# 4. Use long opts for auster options +# set -e export TF_FAIL=/tmp/tf.fail +export TF_SKIP=/tmp/tf.skip usage() { - less -F <.sh) - -i N Repeat tests N times (default 1). A new directory - will be created under LOGDIR for each iteration. - -k Don't stop when subtests fail - -R Remount lustre between tests - -r Reformat (during initial configuration if needed) - -s SLOW=yes - -v Verbose mode - -l Send logs to the Maloo database after run - (can be done later by running maloo_upload.sh) - -h This help. + -c, --config CONFIG Test environment config file + -C, --client-only Run client-side sanity tests against an already setup + filesystem. Users must define FSNAME and mgs_HOST manually. + -d, --log-dir LOGDIR Top level directory for logs + -D, --full-log-dir FULLLOGDIR Full directory for logs + -f, --cfg-name STR Config name (cfg/.sh) + -g, --group GROUP Test group file (Overrides tests listed on command line) + -S, --suite TESTSUITE First test suite to run allows for restarts + -H, --honor Honor the EXCEPT and ALWAYS_EXCEPT list when --only is used + -i, --repeat N Repeat tests N times (default 1). A new directory + will be created under LOGDIR for each iteration. + -k --no-stop Don't stop when subtests fail + -R, --remount Remount lustre between tests + -r, --reformat Reformat (during initial configuration if needed) + -s --slow SLOW=yes + -v, --verbose Verbose mode + -l, --send-logs Send logs to the Maloo database after run + (can be done later by running maloo_upload.sh) + -L, --lang Script language of test suite. Default: bash + -N, --no-setup No setup. Do not setup Lustre prior to executing test suite. + -h, --help This help. Suite options These are suite specific options that can be specified after each suite on @@ -48,12 +64,16 @@ the default "local" configuration. auster -s sanity replay-single --except 70b -Run test listed in batch-list 5 times using large config. +Run all tests in the regression group 5 times using large config. + + auster -f large -g test-groups/regression -i 5 - auster -f large -r 5 -b batch-list +Run the client-only tests from sanity. + + FSNAME=myfilesystem mgs_HOST=1.2.3.4 auster -C sanity EOF - exit + exit } dry_run=false @@ -62,44 +82,77 @@ verbose=false repeat_count=1 upload_logs=false reformat=false +script_lang=bash test_logs_dir=/tmp/test_logs/$(date +%Y-%m-%d)/$(date +%H%M%S) -export SLOW=no -export ${NAME:=local} -while getopts "c:d:D:nkf:i:rRslhv" opt +export HONOR_EXCEPT= +export do_setup=true +export client_tests_only=false +export "${SLOW:=no}" +export "${NAME:=local}" + +# Replace long option with corresponding short option +for arg in "$@"; do + shift + case "$arg" in + --config) set -- "$@" '-c';; + --client-only) set -- "$@" '-C';; + --log-dir) set -- "$@" '-d';; + --full-log-dir) set -- "$@" '-D';; + --group) set -- "$@" '-g';; + --suite) set -- "$@" '-S';; + --no-stop) set -- "$@" '-k';; + --verbose) set -- "$@" '-v';; + --honor) set -- "$@" '-H';; + --repeat) set -- "$@" '-i';; + --cfg-name) set -- "$@" '-f';; + --remount) set -- "$@" '-R';; + --reformat) set -- "$@" '-r';; + --slow) set -- "$@" '-s';; + --send-logs) set -- "$@" '-l';; + --lang) set -- "$@" '-L';; + --no-setup) set -- "$@" '-N';; + --help) set -- "$@" '-h';; + *) set -- "$@" "$arg";; + esac +done + +while getopts "c:Cd:D:nkf:S:g:Hi:rRslL:Nhv" opt do - case "$opt" in - c) CONFIG=$OPTARG;; - d) test_logs_dir=$OPTARG/$(date +%Y-%m-%d)/$(date +%H%M%S);; - D) test_logs_dir=$OPTARG;; - k) export FAIL_ON_ERROR=false;; - n) dry_run=:;; - v) verbose=:;; - i) repeat_count=$OPTARG;; - f) NAME=$OPTARG;; - R) do_reset=:;; - r) reformat=:;; - s) SLOW=yes;; - l) upload_logs=true;; - h|\?) usage;; - esac + case "$opt" in + c) export CONFIG=$OPTARG;; + C) client_tests_only=true;; + d) test_logs_dir=$OPTARG/$(date +%Y-%m-%d)/$(date +%H%M%S);; + D) test_logs_dir=$OPTARG;; + g) test_group_file=$OPTARG;; + S) FIRST_SUITE=$OPTARG;; + k) export FAIL_ON_ERROR=false;; + n) dry_run=:;; + v) verbose=:;; + H) export HONOR_EXCEPT="y";; + i) repeat_count=$OPTARG;; + f) NAME=$OPTARG;; + R) do_reset=:;; + r) reformat=:;; + s) export SLOW=yes;; + l) upload_logs=true;; + L) script_lang=$OPTARG;; + N) do_setup=false;; + h|\?) usage;; + esac done -shift $((OPTIND -1)) -# -# Various paramters for the tests scripts -# -#: ${SIZE:=$((RAMKB * 2))} -#: ${RSIZE:=512} -#: ${UID:=1000} -#: ${MOUNT=/mnt/lustre} -#: ${MOUNT2:=${MOUNT}2} -#: ${COUNT:=1000} -#: ${TMP:=/tmp} +# If a test_group_file is specified, then ignore rest of command line +if [[ $test_group_file ]]; then + export TEST_GROUP=$(basename $test_group_file) + set $(sed 's/#.*$//' $test_group_file) +else + shift $((OPTIND -1)) +fi reset_lustre() { if $do_reset; then - stopall - setupall + stopall + setupall fi } @@ -109,6 +162,16 @@ STARTTIME=`date +%s` . $LUSTRE/tests/test-framework.sh init_test_env +# Set CLIENTONLY, while trying to discover some common +# variables so the test runner doesn't need do this +# manually +if $client_tests_only; then + export CLIENTONLY=true; + export FSTYPE=${FSTYPE:-ldiskfs}; + export MDSCOUNT="$(( $($LFS mdts | wc -l) - 1 ))" + export OSTCOUNT="$(( $($LFS osts | wc -l) - 1 ))" +fi + print_summary () { trap 0 local form="%-13s %-17s %s\n" @@ -119,47 +182,48 @@ print_summary () { setup_if_needed() { - nfs_client_mode && return - auster_cleanup=false - - local MOUNTED=$(mounted_lustre_filesystems) - if $(echo $MOUNTED | grep -w -q $MOUNT); then - check_config_clients $MOUNT - # init_facets_vars - # init_param_vars - return - fi + ! ${do_setup} && return + nfs_client_mode && return + AUSTER_CLEANUP=false + + local MOUNTED=$(mounted_lustre_filesystems) + if $(echo $MOUNTED' ' | grep -w -q $MOUNT' '); then + check_config_clients $MOUNT + # init_facets_vars + # init_param_vars + return + fi - echo "Lustre is not mounted, trying to do setup ... " - $reformat && formatall - setupall + echo "Lustre is not mounted, trying to do setup ... " + $reformat && CLEANUP_DM_DEV=true formatall + setupall - MOUNTED=$(mounted_lustre_filesystems) - if ! $(echo $MOUNTED | grep -w -q $MOUNT); then - echo "Lustre is not mounted after setup! " - exit 1 - fi - auster_cleanup=true + MOUNTED=$(mounted_lustre_filesystems) + if ! $(echo $MOUNTED' ' | grep -w -q $MOUNT' '); then + echo "Lustre is not mounted after setup! " + exit 1 + fi + AUSTER_CLEANUP=true } cleanup_if_needed() { - if $auster_cleanup; then - cleanupall - fi + if $AUSTER_CLEANUP; then + cleanupall + fi } find_script_in_path() { target=$1 path=$2 for dir in $(tr : " " <<< $path); do - if [ -e $dir/$target ]; then - echo $dir/$target - return 0 - fi - if [ -e $dir/$target.sh ]; then - echo $dir/$target.sh - return 0 - fi + if [ -f $dir/$target ]; then + echo $dir/$target + return 0 + fi + if [ -f $dir/$target.sh ]; then + echo $dir/$target.sh + return 0 + fi done return 1 } @@ -174,53 +238,59 @@ doit() { return 0 fi if $verbose; then - printf "Running: %s\n" "$*" + printf "Running: %s\n" "$*" fi "$@" } run_suite() { - suite_name=$1 - suite_script=$2 - only=$3 - title $suite_name - log_test $suite_name - - local start_ts=$(date +%s) - doit bash $suite_script $only - rc=$? - duration=$(($(date +%s) - $start_ts)) - if [ -f $TF_FAIL -o $rc -ne 0 ]; then - status="FAIL" - else - status="PASS" - fi - log_test_status $duration $status + local suite_name=$1 + local suite_script=$2 + title $suite_name + log_test $suite_name + + rm -f $TF_FAIL + touch $TF_SKIP + local start_ts=$(date +%s) + doit $script_lang $suite_script + local rc=$? + local duration=$(($(date +%s) - $start_ts)) + + local status="PASS" + if [[ $rc -ne 0 || -f $TF_FAIL ]]; then + status="FAIL" + elif [[ -f $TF_SKIP ]]; then + status="SKIP" + fi + log_test_status $duration $status + [[ ! -f $TF_SKIP ]] || rm -f $TF_SKIP - reset_lustre + reset_lustre + + return $rc } run_suite_logged() { - local suite_name=${1%.sh} - local suite=$(echo ${suite_name} | tr "[:lower:]-" "[:upper:]_") - local suite_only=${suite}_ONLY + local suite_name=${1%.sh} + local suite=$(echo ${suite_name} | tr "[:lower:]-" "[:upper:]_") - suite_script=$(find_script_in_path $suite_name $PATH:$LUSTRE/tests) + suite_script=$(find_script_in_path $suite_name $LUSTRE/tests) - if [[ -z $suite_script ]]; then - echo "Can't find test script for $suite_name" - return 1 - fi - - echo "run_suite $suite_name $suite_script ${!suite_only}" - local log_name=${suite_name}.suite_log.$(hostname).log - if $verbose; then - run_suite $suite_name $suite_script "${!suite_only}" 2>&1 |tee $LOGDIR/$log_name - else - run_suite $suite_name $suite_script "${!suite_only}" > $LOGDIR/$log_name 2>&1 - fi + if [[ -z $suite_script ]]; then + echo "Can't find test script for $suite_name" + return 1 + fi + + echo "run_suite $suite_name $suite_script" + local log_name=${suite_name}.suite_log.$(hostname -s).log + if $verbose; then + run_suite $suite_name $suite_script 2>&1 |tee $LOGDIR/$log_name + else + run_suite $suite_name $suite_script > $LOGDIR/$log_name 2>&1 + fi + return ${PIPESTATUS[0]} } # @@ -239,52 +309,64 @@ run_suites() { local n=0 local argv=("$@") while ((n < repeat_count)); do - local RC=0 - local logdir=${test_logs_dir} - ((repeat_count > 1)) && logdir="$logdir/$n" - reset_logging $logdir - set -- "${argv[@]}" - while [[ -n $1 ]]; do - unset ONLY EXCEPT START_AT STOP_AT - local opts="" - local time_limit="" -# echo "argv: $*" - suite=$1 - shift; - while [[ -n $1 ]]; do - case "$1" in - --only) - shift; - export ONLY=$(split_commas $1) - opts+="ONLY=$ONLY ";; - --except) - shift; - export EXCEPT=$(split_commas $1) - opts+="EXCEPT=$EXCEPT ";; - --start-at) - shift; - export START_AT=$1 - opts+="START_AT=$START_AT ";; - --stop-at) - shift; - export STOP_AT=$1 - opts+="STOP_AT=$STOP_AT ";; - --time-limit) - shift; - time_limit=$1;; - *) - break;; - esac - shift - done - echo "running: $suite $opts" - run_suite_logged $suite || RC=$? - echo $suite returned $RC - done - if $upload_logs; then - $upload_script $LOGDIR - fi - n=$((n + 1)) + local RC=0 + local logdir=${test_logs_dir} + local first_suite=$FIRST_SUITE + ((repeat_count > 1)) && logdir="$logdir/$n" + reset_logging $logdir + set -- "${argv[@]}" + while [[ -n $1 ]]; do + unset ONLY EXCEPT START_AT STOP_AT + local opts="" + local time_limit="" + #echo "argv: $*" + suite=$1 + shift; + while [[ -n $1 ]]; do + case "$1" in + --only) + shift; + export ONLY=$(split_commas $1) + opts+="ONLY=$ONLY ";; + --suite) + shift; + export SUITE=$(split_commas $1) + opts+="SUITE=$SUITE ";; + --pattern) + shift; + export PATTERN=$(split_commas $1) + opts+="PATTERN=$PATTERN ";; + --except) + shift; + export EXCEPT=$(split_commas $1) + opts+="EXCEPT=$EXCEPT ";; + --start-at) + shift; + export START_AT=$1 + opts+="START_AT=$START_AT ";; + --stop-at) + shift; + export STOP_AT=$1 + opts+="STOP_AT=$STOP_AT ";; + --time-limit) + shift; + time_limit=$1;; + *) + break;; + esac + shift + done + if [ "x"$first_suite == "x" ] || [ $first_suite == $suite ]; then # If first_suite not set or this is the first suite + echo "running: $suite $opts" + run_suite_logged $suite || RC=$? + unset first_suite + echo $suite returned $RC + fi + done + if $upload_logs; then + $upload_script $LOGDIR + fi + n=$((n + 1)) done } @@ -292,7 +374,7 @@ if [ $upload_logs = true ] ; then upload_script=$(find_script_in_path maloo_upload.sh $PATH:$LUSTRE/tests) if [[ -z $upload_script ]]; then echo "Can't find maloo_upload.sh script" - exit 1 + exit 1 fi if [ ! -r ~/.maloorc ] ; then @@ -305,10 +387,19 @@ fi export NAME MOUNT START CLEAN . ${CONFIG:-$LUSTRE/tests/cfg/$NAME.sh} -assert_env mds_HOST MDS_MKFS_OPTS -assert_env ost_HOST OST_MKFS_OPTS OSTCOUNT -assert_env FSNAME MOUNT MOUNT2 +# Only need to know where (MOUNT) and how (mgs_HOST) to +# mount Lustre for client-side only tests +if $client_tests_only; then + assert_env mgs_HOST +else + assert_env mds_HOST + assert_env ost_HOST OSTCOUNT + assert_env MOUNT2 +fi + +assert_env FSNAME MOUNT +echo "Started at `date`" setup_if_needed run_suites "$@"