Whamcloud - gitweb
LU-10979 test: correct the version code check in sanity-sec.sh
[fs/lustre-release.git] / lustre / tests / sanity-sec.sh
index 81e5594..dfd07fa 100755 (executable)
@@ -44,13 +44,8 @@ WTL=${WTL:-"$LUSTRE/tests/write_time_limit"}
 CONFDIR=/etc/lustre
 PERM_CONF=$CONFDIR/perm.conf
 FAIL_ON_ERROR=false
-
 HOSTNAME_CHECKSUM=$(hostname | sum | awk '{ print $1 }')
 SUBNET_CHECKSUM=$(expr $HOSTNAME_CHECKSUM % 250 + 1)
-NODEMAP_COUNT=16
-NODEMAP_RANGE_COUNT=3
-NODEMAP_IPADDR_LIST="1 10 64 128 200 250"
-NODEMAP_MAX_ID=128
 
 require_dsh_mds || exit 0
 require_dsh_ost || exit 0
@@ -64,6 +59,12 @@ ID1=${ID1:-501}
 USER0=$(getent passwd | grep :$ID0:$ID0: | cut -d: -f1)
 USER1=$(getent passwd | grep :$ID1:$ID1: | cut -d: -f1)
 
+NODEMAP_COUNT=16
+NODEMAP_RANGE_COUNT=3
+NODEMAP_IPADDR_LIST="1 10 64 128 200 250"
+NODEMAP_ID_COUNT=10
+NODEMAP_MAX_ID=$((ID0 + NODEMAP_ID_COUNT))
+
 [ -z "$USER0" ] &&
        skip "need to add user0 ($ID0:$ID0)" && exit 0
 
@@ -80,18 +81,7 @@ FOPS_IDMAPS=(
 
 check_and_setup_lustre
 
-sec_cleanup() {
-       if [ "$I_MOUNTED" = "yes" ]; then
-               cleanupall -f || error "sec_cleanup"
-       fi
-}
-
-DIR=${DIR:-$MOUNT}
-[ -z "$(echo $DIR | grep $MOUNT)" ] &&
-       error "$DIR not in $MOUNT" && sec_cleanup && exit 1
-
-[ $(echo $MOUNT | wc -w) -gt 1 ] &&
-       echo "NAME=$MOUNT mounted more than once" && sec_cleanup && exit 0
+assert_DIR
 
 # for GSS_SUP
 GSS_REF=$(lsmod | grep ^ptlrpc_gss | awk '{print $3}')
@@ -271,7 +261,7 @@ delete_nodemaps() {
                        return 3
                fi
 
-               out=$(do_facet mgs $LCTL get_param nodemap.$csum.id)
+               out=$(do_facet mgs $LCTL get_param nodemap.$csum.id 2>/dev/null)
                [[ $(echo $out | grep -c $csum) != 0 ]] && return 1
        done
        return 0
@@ -313,10 +303,11 @@ add_idmaps() {
        local cmd="$LCTL nodemap_add_idmap"
        local rc=0
 
+       echo "Start to add idmaps ..."
        for ((i = 0; i < NODEMAP_COUNT; i++)); do
                local j
 
-               for ((j = 500; j < NODEMAP_MAX_ID; j++)); do
+               for ((j = $ID0; j < NODEMAP_MAX_ID; j++)); do
                        local csum=${HOSTNAME_CHECKSUM}_${i}
                        local client_id=$j
                        local fs_id=$((j + 1))
@@ -335,15 +326,84 @@ add_idmaps() {
        return $rc
 }
 
+update_idmaps() { #LU-10040
+       [ $(lustre_version_code mgs) -lt $(version_code 2.10.55) ] &&
+               skip "Need MGS >= 2.10.55" &&
+               return
+       local csum=${HOSTNAME_CHECKSUM}_0
+       local old_id_client=$ID0
+       local old_id_fs=$((ID0 + 1))
+       local new_id=$((ID0 + 100))
+       local tmp_id
+       local cmd
+       local run
+       local idtype
+       local rc=0
+
+       echo "Start to update idmaps ..."
+
+       #Inserting an existed idmap should return error
+       cmd="$LCTL nodemap_add_idmap --name $csum --idtype uid"
+       if do_facet mgs \
+               $cmd --idmap $old_id_client:$old_id_fs 2>/dev/null; then
+               error "insert idmap {$old_id_client:$old_id_fs} " \
+                       "should return error"
+               rc=$((rc + 1))
+               return rc
+       fi
+
+       #Update id_fs and check it
+       if ! do_facet mgs $cmd --idmap $old_id_client:$new_id; then
+               error "$cmd --idmap $old_id_client:$new_id failed"
+               rc=$((rc + 1))
+               return $rc
+       fi
+       tmp_id=$(do_facet mgs $LCTL get_param -n nodemap.$csum.idmap |
+               awk '{ print $7 }' | sed -n '2p')
+       [ $tmp_id != $new_id ] && { error "new id_fs $tmp_id != $new_id"; \
+               rc=$((rc + 1)); return $rc; }
+
+       #Update id_client and check it
+       if ! do_facet mgs $cmd --idmap $new_id:$new_id; then
+               error "$cmd --idmap $new_id:$new_id failed"
+               rc=$((rc + 1))
+               return $rc
+       fi
+       tmp_id=$(do_facet mgs $LCTL get_param -n nodemap.$csum.idmap |
+               awk '{ print $5 }' | sed -n "$((NODEMAP_ID_COUNT + 1)) p")
+       tmp_id=$(echo ${tmp_id%,*}) #e.g. "501,"->"501"
+       [ $tmp_id != $new_id ] && { error "new id_client $tmp_id != $new_id"; \
+               rc=$((rc + 1)); return $rc; }
+
+       #Delete above updated idmap
+       cmd="$LCTL nodemap_del_idmap --name $csum --idtype uid"
+       if ! do_facet mgs $cmd --idmap $new_id:$new_id; then
+               error "$cmd --idmap $new_id:$new_id failed"
+               rc=$((rc + 1))
+               return $rc
+       fi
+
+       #restore the idmaps to make delete_idmaps work well
+       cmd="$LCTL nodemap_add_idmap --name $csum --idtype uid"
+       if ! do_facet mgs $cmd --idmap $old_id_client:$old_id_fs; then
+               error "$cmd --idmap $old_id_client:$old_id_fs failed"
+               rc=$((rc + 1))
+               return $rc
+       fi
+
+       return $rc
+}
+
 delete_idmaps() {
        local i
        local cmd="$LCTL nodemap_del_idmap"
        local rc=0
 
+       echo "Start to delete idmaps ..."
        for ((i = 0; i < NODEMAP_COUNT; i++)); do
                local j
 
-               for ((j = 500; j < NODEMAP_MAX_ID; j++)); do
+               for ((j = $ID0; j < NODEMAP_MAX_ID; j++)); do
                        local csum=${HOSTNAME_CHECKSUM}_${i}
                        local client_id=$j
                        local fs_id=$((j + 1))
@@ -426,11 +486,12 @@ test_idmap() {
        local cmd="$LCTL nodemap_test_id"
        local rc=0
 
+       echo "Start to test idmaps ..."
        ## nodemap deactivated
        if ! do_facet mgs $LCTL nodemap_activate 0; then
                return 1
        fi
-       for ((id = 500; id < NODEMAP_MAX_ID; id++)); do
+       for ((id = $ID0; id < NODEMAP_MAX_ID; id++)); do
                local j
 
                for ((j = 0; j < NODEMAP_RANGE_COUNT; j++)); do
@@ -449,7 +510,7 @@ test_idmap() {
                return 2
        fi
 
-       for ((id = 500; id < NODEMAP_MAX_ID; id++)); do
+       for ((id = $ID0; id < NODEMAP_MAX_ID; id++)); do
                for ((j = 0; j < NODEMAP_RANGE_COUNT; j++)); do
                        nid="$SUBNET_CHECKSUM.0.${j}.100@tcp"
                        fs_id=$(do_facet mgs $cmd --nid $nid    \
@@ -473,7 +534,7 @@ test_idmap() {
                fi
        done
 
-       for ((id = 500; id < NODEMAP_MAX_ID; id++)); do
+       for ((id = $ID0; id < NODEMAP_MAX_ID; id++)); do
                for ((j = 0; j < NODEMAP_RANGE_COUNT; j++)); do
                        nid="$SUBNET_CHECKSUM.0.${j}.100@tcp"
                        fs_id=$(do_facet mgs $cmd --nid $nid    \
@@ -706,6 +767,66 @@ test_10b() {
 }
 run_test 10b "delete range from the correct nodemap"
 
+test_10c() { #LU-8912
+       [ $(lustre_version_code mgs) -lt $(version_code 2.10.57) ] &&
+               skip "Need MGS >= 2.10.57" && return
+
+       local nm="nodemap_lu8912"
+       local nid_range="10.210.[32-47].[0-255]@o2ib3"
+       local start_nid="10.210.32.0@o2ib3"
+       local end_nid="10.210.47.255@o2ib3"
+       local start_nid_found
+       local end_nid_found
+
+       do_facet mgs $LCTL nodemap_del $nm 2>/dev/null
+       do_facet mgs $LCTL nodemap_add $nm || error "Add $nm failed"
+       do_facet mgs $LCTL nodemap_add_range --name $nm --range $nid_range ||
+               error "Add range $nid_range to $nm failed"
+
+       start_nid_found=$(do_facet mgs $LCTL get_param nodemap.$nm.* |
+               awk -F '[,: ]' /start_nid/'{ print $9 }')
+       [ "$start_nid" == "$start_nid_found" ] ||
+               error "start_nid: $start_nid_found != $start_nid"
+       end_nid_found=$(do_facet mgs $LCTL get_param nodemap.$nm.* |
+               awk -F '[,: ]' /end_nid/'{ print $13 }')
+       [ "$end_nid" == "$end_nid_found" ] ||
+               error "end_nid: $end_nid_found != $end_nid"
+
+       do_facet mgs $LCTL nodemap_del $nm || error "Delete $nm failed"
+       return 0
+}
+run_test 10c "verfify contiguous range support"
+
+test_10d() { #LU-8913
+       [ $(lustre_version_code mgs) -lt $(version_code 2.10.59) ] &&
+               skip "Need MGS >= 2.10.59" && return
+
+       local nm="nodemap_lu8913"
+       local nid_range="*@o2ib3"
+       local start_nid="0.0.0.0@o2ib3"
+       local end_nid="255.255.255.255@o2ib3"
+       local start_nid_found
+       local end_nid_found
+
+       do_facet mgs $LCTL nodemap_del $nm 2>/dev/null
+       do_facet mgs $LCTL nodemap_add $nm || error "Add $nm failed"
+       do_facet mgs $LCTL nodemap_add_range --name $nm --range $nid_range ||
+               error "Add range $nid_range to $nm failed"
+
+       start_nid_found=$(do_facet mgs $LCTL get_param nodemap.$nm.* |
+               awk -F '[,: ]' /start_nid/'{ print $9 }')
+       [ "$start_nid" == "$start_nid_found" ] ||
+               error "start_nid: $start_nid_found != $start_nid"
+       end_nid_found=$(do_facet mgs $LCTL get_param nodemap.$nm.* |
+               awk -F '[,: ]' /end_nid/'{ print $13 }')
+       [ "$end_nid" == "$end_nid_found" ] ||
+               error "end_nid: $end_nid_found != $end_nid"
+
+       do_facet mgs $LCTL nodemap_del $nm || error "Delete $nm failed"
+       return 0
+}
+run_test 10d "verfify nodemap range format '*@<net>' support"
+
 test_11() {
        local rc
 
@@ -884,14 +1005,19 @@ test_15() {
        [[ $rc != 0 ]] && error "nodemap_test_id failed with $rc" && return 4
 
        rc=0
+       update_idmaps
+       rc=$?
+       [[ $rc != 0 ]] && error "update_idmaps failed with $rc" && return 5
+
+       rc=0
        delete_idmaps
        rc=$?
-       [[ $rc != 0 ]] && error "nodemap_del_idmap failed with $rc" && return 5
+       [[ $rc != 0 ]] && error "nodemap_del_idmap failed with $rc" && return 6
 
        rc=0
        delete_nodemaps
        rc=$?
-       [[ $rc != 0 ]] && error "nodemap_delete failed with $rc" && return 6
+       [[ $rc != 0 ]] && error "nodemap_delete failed with $rc" && return 7
 
        return 0
 }
@@ -901,12 +1027,9 @@ wait_nm_sync() {
        local nodemap_name=$1
        local key=$2
        local value=$3
-       local proc_param="${nodemap_name}.${key}"
-       [ "$nodemap_name" == "active" ] && proc_param="active"
-
+       local opt=$4
+       local proc_param
        local is_active=$(do_facet mgs $LCTL get_param -n nodemap.active)
-       (( is_active == 0 )) && [ "$proc_param" != "active" ] && return
-
        local max_retries=20
        local is_sync
        local out1=""
@@ -914,8 +1037,17 @@ wait_nm_sync() {
        local mgs_ip=$(host_nids_address $mgs_HOST $NETTYPE | cut -d' ' -f1)
        local i
 
+       if [ "$nodemap_name" == "active" ]; then
+               proc_param="active"
+       elif [ -z "$key" ]; then
+               proc_param=${nodemap_name}
+       else
+               proc_param="${nodemap_name}.${key}"
+       fi
+       (( is_active == 0 )) && [ "$proc_param" != "active" ] && return
+
        if [ -z "$value" ]; then
-               out1=$(do_facet mgs $LCTL get_param nodemap.${proc_param})
+               out1=$(do_facet mgs $LCTL get_param $opt nodemap.${proc_param})
                echo "On MGS ${mgs_ip}, ${proc_param} = $out1"
        else
                out1=$value;
@@ -932,7 +1064,7 @@ wait_nm_sync() {
                        [ $node_ip == $mgs_ip ] && continue
                    fi
 
-                   out2=$(do_node $node_ip $LCTL get_param \
+                   out2=$(do_node $node_ip $LCTL get_param $opt \
                                   nodemap.$proc_param 2>/dev/null)
                    echo "On $node ${node_ip}, ${proc_param} = $out2"
                    [ "$out1" != "$out2" ] && is_sync=false && break
@@ -1361,6 +1493,7 @@ nodemap_test_setup() {
 
        do_facet mgs $LCTL nodemap_modify --name default \
                --property admin --value 1
+       wait_nm_sync default admin_nodemap
        do_facet mgs $LCTL nodemap_modify --name default \
                --property trusted --value 1
        wait_nm_sync default trusted_nodemap
@@ -1374,6 +1507,7 @@ nodemap_test_cleanup() {
 
        do_facet mgs $LCTL nodemap_modify --name default \
                 --property admin --value 0
+       wait_nm_sync default admin_nodemap
        do_facet mgs $LCTL nodemap_modify --name default \
                 --property trusted --value 0
        wait_nm_sync default trusted_nodemap
@@ -1562,6 +1696,7 @@ nodemap_acl_test() {
 }
 
 test_23a() {
+       [ $num_clients -lt 2 ] && skip "Need 2 clients at least" && return
        nodemap_version_check || return 0
        nodemap_test_setup
 
@@ -1761,7 +1896,6 @@ run_test 26 "test transferring very large nodemap"
 
 nodemap_exercise_fileset() {
        local nm="$1"
-       local fileset_on_mgs=""
        local loop=0
 
        # setup
@@ -1780,8 +1914,10 @@ nodemap_exercise_fileset() {
        fileset_test_setup "$nm"
 
        # add fileset info to $nm nodemap
-       do_facet mgs $LCTL set_param nodemap.${nm}.fileset=/$subdir ||
+       if ! combined_mgs_mds; then
+           do_facet mgs $LCTL set_param nodemap.${nm}.fileset=/$subdir ||
                error "unable to add fileset info to $nm nodemap on MGS"
+       fi
        do_facet mgs $LCTL set_param -P nodemap.${nm}.fileset=/$subdir ||
               error "unable to add fileset info to $nm nodemap for servers"
        wait_nm_sync $nm fileset "nodemap.${nm}.fileset=/$subdir"
@@ -1812,12 +1948,12 @@ nodemap_exercise_fileset() {
                error "subdir of fileset not taken into account"
 
        # remove fileset info from nodemap
-       do_facet mgs $LCTL nodemap_set_fileset --name $nm --fileset \'\' ||
+       do_facet mgs $LCTL nodemap_set_fileset --name $nm --fileset clear ||
                error "unable to delete fileset info on $nm nodemap"
        wait_update_facet mgs "$LCTL get_param nodemap.${nm}.fileset" \
                          "nodemap.${nm}.fileset=" ||
                error "fileset info still not cleared on $nm nodemap"
-       do_facet mgs $LCTL set_param -P nodemap.${nm}.fileset=\'\' ||
+       do_facet mgs $LCTL set_param -P nodemap.${nm}.fileset=clear ||
                error "unable to reset fileset info on $nm nodemap"
        wait_nm_sync $nm fileset "nodemap.${nm}.fileset="
 
@@ -1854,7 +1990,10 @@ nodemap_exercise_fileset() {
        fi
 }
 
-test_27() {
+test_27a() {
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.50) ] &&
+               skip "Need MDS >= 2.11.50" && return
+
        for nm in "default" "c0"; do
                local subdir="subdir_${nm}"
                local subsubdir="subsubdir_${nm}"
@@ -1863,7 +2002,46 @@ test_27() {
                nodemap_exercise_fileset "$nm"
        done
 }
-run_test 27 "test fileset in various nodemaps"
+run_test 27a "test fileset in various nodemaps"
+
+test_27b() { #LU-10703
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.50) ] &&
+               skip "Need MDS >= 2.11.50" && return
+       [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return
+
+       nodemap_test_setup
+       trap nodemap_test_cleanup EXIT
+
+       # Add the nodemaps and set their filesets
+       for i in $(seq 1 $MDSCOUNT); do
+               do_facet mgs $LCTL nodemap_del nm$i 2>/dev/null
+               do_facet mgs $LCTL nodemap_add nm$i ||
+                       error "add nodemap nm$i failed"
+               wait_nm_sync nm$i "" "" "-N"
+
+               if ! combined_mgs_mds; then
+                       do_facet mgs \
+                               $LCTL set_param nodemap.nm$i.fileset=/dir$i ||
+                               error "set nm$i.fileset=/dir$i failed on MGS"
+               fi
+               do_facet mgs $LCTL set_param -P nodemap.nm$i.fileset=/dir$i ||
+                       error "set nm$i.fileset=/dir$i failed on servers"
+               wait_nm_sync nm$i fileset "nodemap.nm$i.fileset=/dir$i"
+       done
+
+       # Check if all the filesets are correct
+       for i in $(seq 1 $MDSCOUNT); do
+               fileset=$(do_facet mds$i \
+                         $LCTL get_param -n nodemap.nm$i.fileset)
+               [ "$fileset" = "/dir$i" ] ||
+                       error "nm$i.fileset $fileset != /dir$i on mds$i"
+               do_facet mgs $LCTL nodemap_del nm$i ||
+                       error "delete nodemap nm$i failed"
+       done
+
+       nodemap_test_cleanup
+}
+run_test 27b "The new nodemap won't clear the old nodemap's fileset"
 
 test_28() {
        if ! $SHARED_KEY; then
@@ -1976,7 +2154,6 @@ sec_unsetup() {
 }
 sec_unsetup
 
-sec_cleanup
-
 complete $SECONDS
+check_and_cleanup_lustre
 exit_status