Whamcloud - gitweb
LU-1538 tests: standardize test script init - dne-part-2
[fs/lustre-release.git] / lustre / tests / sanity-sec.sh
1 #!/bin/bash
2 #
3 # Run select tests by setting ONLY, or as arguments to the script.
4 # Skip specific tests by setting EXCEPT.
5 #
6
7 set -e
8
9 ONLY=${ONLY:-"$*"}
10
11 LUSTRE=${LUSTRE:-$(dirname $0)/..}
12 . $LUSTRE/tests/test-framework.sh
13 init_test_env $@
14
15 init_logging
16
17 ALWAYS_EXCEPT="$SANITY_SEC_EXCEPT "
18 # bug number for skipped test:
19 ALWAYS_EXCEPT+=" "
20 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
21
22 [ "$SLOW" = "no" ] && EXCEPT_SLOW="26"
23
24 NODEMAP_TESTS=$(seq 7 26)
25
26 if ! check_versions; then
27         echo "It is NOT necessary to test nodemap under interoperation mode"
28         EXCEPT="$EXCEPT $NODEMAP_TESTS"
29 fi
30
31 build_test_filter
32
33 RUNAS_CMD=${RUNAS_CMD:-runas}
34
35 WTL=${WTL:-"$LUSTRE/tests/write_time_limit"}
36
37 CONFDIR=/etc/lustre
38 PERM_CONF=$CONFDIR/perm.conf
39 FAIL_ON_ERROR=false
40 HOSTNAME_CHECKSUM=$(hostname | sum | awk '{ print $1 }')
41 SUBNET_CHECKSUM=$(expr $HOSTNAME_CHECKSUM % 250 + 1)
42
43 require_dsh_mds || exit 0
44 require_dsh_ost || exit 0
45
46 clients=${CLIENTS//,/ }
47 num_clients=$(get_node_count ${clients})
48 clients_arr=($clients)
49
50 ID0=${ID0:-500}
51 ID1=${ID1:-501}
52 USER0=$(getent passwd | grep :$ID0:$ID0: | cut -d: -f1)
53 USER1=$(getent passwd | grep :$ID1:$ID1: | cut -d: -f1)
54
55 NODEMAP_COUNT=16
56 NODEMAP_RANGE_COUNT=3
57 NODEMAP_IPADDR_LIST="1 10 64 128 200 250"
58 NODEMAP_ID_COUNT=10
59 NODEMAP_MAX_ID=$((ID0 + NODEMAP_ID_COUNT))
60
61 [ -z "$USER0" ] &&
62         skip "need to add user0 ($ID0:$ID0)" && exit 0
63
64 [ -z "$USER1" ] &&
65         skip "need to add user1 ($ID1:$ID1)" && exit 0
66
67 IDBASE=${IDBASE:-60000}
68
69 # changes to mappings must be reflected in test 23
70 FOPS_IDMAPS=(
71         [0]="$((IDBASE+3)):$((IDBASE+0)) $((IDBASE+4)):$((IDBASE+2))"
72         [1]="$((IDBASE+5)):$((IDBASE+1)) $((IDBASE+6)):$((IDBASE+2))"
73         )
74
75 check_and_setup_lustre
76
77 assert_DIR
78
79 # for GSS_SUP
80 GSS_REF=$(lsmod | grep ^ptlrpc_gss | awk '{print $3}')
81 if [ ! -z "$GSS_REF" -a "$GSS_REF" != "0" ]; then
82         GSS_SUP=1
83         echo "with GSS support"
84 else
85         GSS_SUP=0
86         echo "without GSS support"
87 fi
88
89 MDT=$(do_facet $SINGLEMDS lctl get_param -N "mdt.\*MDT0000" |
90         cut -d. -f2 || true)
91 [ -z "$MDT" ] && error "fail to get MDT device" && exit 1
92 do_facet $SINGLEMDS "mkdir -p $CONFDIR"
93 IDENTITY_FLUSH=mdt.$MDT.identity_flush
94 IDENTITY_UPCALL=mdt.$MDT.identity_upcall
95
96 SAVE_PWD=$PWD
97
98 sec_login() {
99         local user=$1
100         local group=$2
101
102         $GSS_KRB5 || return
103         if ! $RUNAS_CMD -u $user krb5_login.sh; then
104                 error "$user login kerberos failed."
105                 exit 1
106         fi
107
108         if ! $RUNAS_CMD -u $user -g $group ls $DIR > /dev/null 2>&1; then
109                 $RUNAS_CMD -u $user lfs flushctx -k
110                 $RUNAS_CMD -u $user krb5_login.sh
111                 if ! $RUNAS_CMD -u$user -g$group ls $DIR > /dev/null 2>&1; then
112                         error "init $user $group failed."
113                         exit 2
114                 fi
115         fi
116 }
117
118 declare -a identity_old
119
120 sec_setup() {
121         for num in $(seq $MDSCOUNT); do
122                 switch_identity $num true || identity_old[$num]=$?
123         done
124
125         if ! $RUNAS_CMD -u $ID0 ls $DIR > /dev/null 2>&1; then
126                 sec_login $USER0 $USER0
127         fi
128
129         if ! $RUNAS_CMD -u $ID1 ls $DIR > /dev/null 2>&1; then
130                 sec_login $USER1 $USER1
131         fi
132 }
133 sec_setup
134
135 # run as different user
136 test_0() {
137         umask 0022
138
139         chmod 0755 $DIR || error "chmod (1)"
140         rm -rf $DIR/$tdir || error "rm (1)"
141         mkdir -p $DIR/$tdir || error "mkdir (1)"
142         chown $USER0 $DIR/$tdir || error "chown (2)"
143         $RUNAS_CMD -u $ID0 ls $DIR || error "ls (1)"
144         rm -f $DIR/f0 || error "rm (2)"
145         $RUNAS_CMD -u $ID0 touch $DIR/f0 && error "touch (1)"
146         $RUNAS_CMD -u $ID0 touch $DIR/$tdir/f1 || error "touch (2)"
147         $RUNAS_CMD -u $ID1 touch $DIR/$tdir/f2 && error "touch (3)"
148         touch $DIR/$tdir/f3 || error "touch (4)"
149         chown root $DIR/$tdir || error "chown (3)"
150         chgrp $USER0 $DIR/$tdir || error "chgrp (1)"
151         chmod 0775 $DIR/$tdir || error "chmod (2)"
152         $RUNAS_CMD -u $ID0 touch $DIR/$tdir/f4 || error "touch (5)"
153         $RUNAS_CMD -u $ID1 touch $DIR/$tdir/f5 && error "touch (6)"
154         touch $DIR/$tdir/f6 || error "touch (7)"
155         rm -rf $DIR/$tdir || error "rm (3)"
156 }
157 run_test 0 "uid permission ============================="
158
159 # setuid/gid
160 test_1() {
161         [ $GSS_SUP = 0 ] && skip "without GSS support." && return
162
163         rm -rf $DIR/$tdir
164         mkdir -p $DIR/$tdir
165
166         chown $USER0 $DIR/$tdir || error "chown (1)"
167         $RUNAS_CMD -u $ID1 -v $ID0 touch $DIR/$tdir/f0 && error "touch (2)"
168         echo "enable uid $ID1 setuid"
169         do_facet $SINGLEMDS "echo '* $ID1 setuid' >> $PERM_CONF"
170         do_facet $SINGLEMDS "lctl set_param -n $IDENTITY_FLUSH=-1"
171         $RUNAS_CMD -u $ID1 -v $ID0 touch $DIR/$tdir/f1 || error "touch (3)"
172
173         chown root $DIR/$tdir || error "chown (4)"
174         chgrp $USER0 $DIR/$tdir || error "chgrp (5)"
175         chmod 0770 $DIR/$tdir || error "chmod (6)"
176         $RUNAS_CMD -u $ID1 -g $ID1 touch $DIR/$tdir/f2 && error "touch (7)"
177         $RUNAS_CMD -u$ID1 -g$ID1 -j$ID0 touch $DIR/$tdir/f3 && error "touch (8)"
178         echo "enable uid $ID1 setuid,setgid"
179         do_facet $SINGLEMDS "echo '* $ID1 setuid,setgid' > $PERM_CONF"
180         do_facet $SINGLEMDS "lctl set_param -n $IDENTITY_FLUSH=-1"
181         $RUNAS_CMD -u $ID1 -g $ID1 -j $ID0 touch $DIR/$tdir/f4 ||
182                 error "touch (9)"
183         $RUNAS_CMD -u $ID1 -v $ID0 -g $ID1 -j $ID0 touch $DIR/$tdir/f5 ||
184                 error "touch (10)"
185
186         rm -rf $DIR/$tdir
187
188         do_facet $SINGLEMDS "rm -f $PERM_CONF"
189         do_facet $SINGLEMDS "lctl set_param -n $IDENTITY_FLUSH=-1"
190 }
191 run_test 1 "setuid/gid ============================="
192
193 # bug 3285 - supplementary group should always succeed.
194 # NB: the supplementary groups are set for local client only,
195 # as for remote client, the groups of the specified uid on MDT
196 # will be obtained by upcall /sbin/l_getidentity and used.
197 test_4() {
198         local server_version=$(lustre_version_code $SINGLEMDS)
199
200         [[ $server_version -ge $(version_code 2.6.93) ]] ||
201         [[ $server_version -ge $(version_code 2.5.35) &&
202            $server_version -lt $(version_code 2.5.50) ]] ||
203                 { skip "Need MDS version at least 2.6.93 or 2.5.35"; return; }
204
205         rm -rf $DIR/$tdir
206         mkdir -p $DIR/$tdir
207         chmod 0771 $DIR/$tdir
208         chgrp $ID0 $DIR/$tdir
209         $RUNAS_CMD -u $ID0 ls $DIR/$tdir || error "setgroups (1)"
210         do_facet $SINGLEMDS "echo '* $ID1 setgrp' > $PERM_CONF"
211         do_facet $SINGLEMDS "lctl set_param -n $IDENTITY_FLUSH=-1"
212         $RUNAS_CMD -u $ID1 -G1,2,$ID0 ls $DIR/$tdir ||
213                 error "setgroups (2)"
214         $RUNAS_CMD -u $ID1 -G1,2 ls $DIR/$tdir && error "setgroups (3)"
215         rm -rf $DIR/$tdir
216
217         do_facet $SINGLEMDS "rm -f $PERM_CONF"
218         do_facet $SINGLEMDS "lctl set_param -n $IDENTITY_FLUSH=-1"
219 }
220 run_test 4 "set supplementary group ==============="
221
222 create_nodemaps() {
223         local i
224         local out
225         local rc
226
227         squash_id default 99 0
228         wait_nm_sync default squash_uid '' inactive
229         squash_id default 99 1
230         wait_nm_sync default squash_gid '' inactive
231         for (( i = 0; i < NODEMAP_COUNT; i++ )); do
232                 local csum=${HOSTNAME_CHECKSUM}_${i}
233
234                 do_facet mgs $LCTL nodemap_add $csum
235                 rc=$?
236                 if [ $rc -ne 0 ]; then
237                         echo "nodemap_add $csum failed with $rc"
238                         return $rc
239                 fi
240
241                 out=$(do_facet mgs $LCTL get_param nodemap.$csum.id)
242                 ## This needs to return zero if the following statement is 1
243                 [[ $(echo $out | grep -c $csum) == 0 ]] && return 1
244         done
245         for (( i = 0; i < NODEMAP_COUNT; i++ )); do
246                 local csum=${HOSTNAME_CHECKSUM}_${i}
247
248                 wait_nm_sync $csum id '' inactive
249         done
250         return 0
251 }
252
253 delete_nodemaps() {
254         local i
255         local out
256
257         for ((i = 0; i < NODEMAP_COUNT; i++)); do
258                 local csum=${HOSTNAME_CHECKSUM}_${i}
259
260                 if ! do_facet mgs $LCTL nodemap_del $csum; then
261                         error "nodemap_del $csum failed with $?"
262                         return 3
263                 fi
264
265                 out=$(do_facet mgs $LCTL get_param nodemap.$csum.id 2>/dev/null)
266                 [[ $(echo $out | grep -c $csum) != 0 ]] && return 1
267         done
268         for (( i = 0; i < NODEMAP_COUNT; i++ )); do
269                 local csum=${HOSTNAME_CHECKSUM}_${i}
270
271                 wait_nm_sync $csum id '' inactive
272         done
273         return 0
274 }
275
276 add_range() {
277         local j
278         local cmd="$LCTL nodemap_add_range"
279         local range
280         local rc=0
281
282         for ((j = 0; j < NODEMAP_RANGE_COUNT; j++)); do
283                 range="$SUBNET_CHECKSUM.${2}.${j}.[1-253]@tcp"
284                 if ! do_facet mgs $cmd --name $1 --range $range; then
285                         rc=$((rc + 1))
286                 fi
287         done
288         return $rc
289 }
290
291 delete_range() {
292         local j
293         local cmd="$LCTL nodemap_del_range"
294         local range
295         local rc=0
296
297         for ((j = 0; j < NODEMAP_RANGE_COUNT; j++)); do
298                 range="$SUBNET_CHECKSUM.${2}.${j}.[1-253]@tcp"
299                 if ! do_facet mgs $cmd --name $1 --range $range; then
300                         rc=$((rc + 1))
301                 fi
302         done
303
304         return $rc
305 }
306
307 add_idmaps() {
308         local i
309         local cmd="$LCTL nodemap_add_idmap"
310         local rc=0
311
312         echo "Start to add idmaps ..."
313         for ((i = 0; i < NODEMAP_COUNT; i++)); do
314                 local j
315
316                 for ((j = $ID0; j < NODEMAP_MAX_ID; j++)); do
317                         local csum=${HOSTNAME_CHECKSUM}_${i}
318                         local client_id=$j
319                         local fs_id=$((j + 1))
320
321                         if ! do_facet mgs $cmd --name $csum --idtype uid \
322                              --idmap $client_id:$fs_id; then
323                                 rc=$((rc + 1))
324                         fi
325                         if ! do_facet mgs $cmd --name $csum --idtype gid \
326                              --idmap $client_id:$fs_id; then
327                                 rc=$((rc + 1))
328                         fi
329                 done
330         done
331
332         return $rc
333 }
334
335 update_idmaps() { #LU-10040
336         [ $(lustre_version_code mgs) -lt $(version_code 2.10.55) ] &&
337                 skip "Need MGS >= 2.10.55" &&
338                 return
339         local csum=${HOSTNAME_CHECKSUM}_0
340         local old_id_client=$ID0
341         local old_id_fs=$((ID0 + 1))
342         local new_id=$((ID0 + 100))
343         local tmp_id
344         local cmd
345         local run
346         local idtype
347         local rc=0
348
349         echo "Start to update idmaps ..."
350
351         #Inserting an existed idmap should return error
352         cmd="$LCTL nodemap_add_idmap --name $csum --idtype uid"
353         if do_facet mgs \
354                 $cmd --idmap $old_id_client:$old_id_fs 2>/dev/null; then
355                 error "insert idmap {$old_id_client:$old_id_fs} " \
356                         "should return error"
357                 rc=$((rc + 1))
358                 return rc
359         fi
360
361         #Update id_fs and check it
362         if ! do_facet mgs $cmd --idmap $old_id_client:$new_id; then
363                 error "$cmd --idmap $old_id_client:$new_id failed"
364                 rc=$((rc + 1))
365                 return $rc
366         fi
367         tmp_id=$(do_facet mgs $LCTL get_param -n nodemap.$csum.idmap |
368                 awk '{ print $7 }' | sed -n '2p')
369         [ $tmp_id != $new_id ] && { error "new id_fs $tmp_id != $new_id"; \
370                 rc=$((rc + 1)); return $rc; }
371
372         #Update id_client and check it
373         if ! do_facet mgs $cmd --idmap $new_id:$new_id; then
374                 error "$cmd --idmap $new_id:$new_id failed"
375                 rc=$((rc + 1))
376                 return $rc
377         fi
378         tmp_id=$(do_facet mgs $LCTL get_param -n nodemap.$csum.idmap |
379                 awk '{ print $5 }' | sed -n "$((NODEMAP_ID_COUNT + 1)) p")
380         tmp_id=$(echo ${tmp_id%,*}) #e.g. "501,"->"501"
381         [ $tmp_id != $new_id ] && { error "new id_client $tmp_id != $new_id"; \
382                 rc=$((rc + 1)); return $rc; }
383
384         #Delete above updated idmap
385         cmd="$LCTL nodemap_del_idmap --name $csum --idtype uid"
386         if ! do_facet mgs $cmd --idmap $new_id:$new_id; then
387                 error "$cmd --idmap $new_id:$new_id failed"
388                 rc=$((rc + 1))
389                 return $rc
390         fi
391
392         #restore the idmaps to make delete_idmaps work well
393         cmd="$LCTL nodemap_add_idmap --name $csum --idtype uid"
394         if ! do_facet mgs $cmd --idmap $old_id_client:$old_id_fs; then
395                 error "$cmd --idmap $old_id_client:$old_id_fs failed"
396                 rc=$((rc + 1))
397                 return $rc
398         fi
399
400         return $rc
401 }
402
403 delete_idmaps() {
404         local i
405         local cmd="$LCTL nodemap_del_idmap"
406         local rc=0
407
408         echo "Start to delete idmaps ..."
409         for ((i = 0; i < NODEMAP_COUNT; i++)); do
410                 local j
411
412                 for ((j = $ID0; j < NODEMAP_MAX_ID; j++)); do
413                         local csum=${HOSTNAME_CHECKSUM}_${i}
414                         local client_id=$j
415                         local fs_id=$((j + 1))
416
417                         if ! do_facet mgs $cmd --name $csum --idtype uid \
418                              --idmap $client_id:$fs_id; then
419                                 rc=$((rc + 1))
420                         fi
421                         if ! do_facet mgs $cmd --name $csum --idtype gid \
422                              --idmap $client_id:$fs_id; then
423                                 rc=$((rc + 1))
424                         fi
425                 done
426         done
427
428         return $rc
429 }
430
431 modify_flags() {
432         local i
433         local proc
434         local option
435         local cmd="$LCTL nodemap_modify"
436         local rc=0
437
438         proc[0]="admin_nodemap"
439         proc[1]="trusted_nodemap"
440         option[0]="admin"
441         option[1]="trusted"
442
443         for ((idx = 0; idx < 2; idx++)); do
444                 if ! do_facet mgs $cmd --name $1 --property ${option[$idx]} \
445                      --value 1; then
446                         rc=$((rc + 1))
447                 fi
448
449                 if ! do_facet mgs $cmd --name $1 --property ${option[$idx]} \
450                      --value 0; then
451                         rc=$((rc + 1))
452                 fi
453         done
454
455         return $rc
456 }
457
458 squash_id() {
459         [ $(lustre_version_code mgs) -lt $(version_code 2.5.53) ] &&
460                 skip "No nodemap on $(lustre_build_version mgs) MGS < 2.5.53" &&
461                 return
462         local cmd
463
464         cmd[0]="$LCTL nodemap_modify --property squash_uid"
465         cmd[1]="$LCTL nodemap_modify --property squash_gid"
466
467         if ! do_facet mgs ${cmd[$3]} --name $1 --value $2; then
468                 return 1
469         fi
470 }
471
472 wait_nm_sync() {
473         local nodemap_name=$1
474         local key=$2
475         local value=$3
476         local opt=$4
477         local proc_param
478         local is_active=$(do_facet mgs $LCTL get_param -n nodemap.active)
479         local max_retries=20
480         local is_sync
481         local out1=""
482         local out2
483         local mgs_ip=$(host_nids_address $mgs_HOST $NETTYPE | cut -d' ' -f1)
484         local i
485
486         if [ "$nodemap_name" == "active" ]; then
487                 proc_param="active"
488         elif [ -z "$key" ]; then
489                 proc_param=${nodemap_name}
490         else
491                 proc_param="${nodemap_name}.${key}"
492         fi
493         if [ "$opt" == "inactive" ]; then
494                 # check nm sync even if nodemap is not activated
495                 is_active=1
496                 opt=""
497         fi
498         (( is_active == 0 )) && [ "$proc_param" != "active" ] && return
499
500         if [ -z "$value" ]; then
501                 out1=$(do_facet mgs $LCTL get_param $opt \
502                         nodemap.${proc_param} 2>/dev/null)
503                 echo "On MGS ${mgs_ip}, ${proc_param} = $out1"
504         else
505                 out1=$value;
506         fi
507
508         # wait up to 10 seconds for other servers to sync with mgs
509         for i in $(seq 1 10); do
510                 for node in $(all_server_nodes); do
511                     local node_ip=$(host_nids_address $node $NETTYPE |
512                                     cut -d' ' -f1)
513
514                     is_sync=true
515                     if [ -z "$value" ]; then
516                         [ $node_ip == $mgs_ip ] && continue
517                     fi
518
519                     out2=$(do_node $node_ip $LCTL get_param $opt \
520                                    nodemap.$proc_param 2>/dev/null)
521                     echo "On $node ${node_ip}, ${proc_param} = $out2"
522                     [ "$out1" != "$out2" ] && is_sync=false && break
523                 done
524                 $is_sync && break
525                 sleep 1
526         done
527         if ! $is_sync; then
528                 echo MGS
529                 echo $out1
530                 echo OTHER - IP: $node_ip
531                 echo $out2
532                 error "mgs and $nodemap_name ${key} mismatch, $i attempts"
533         fi
534         echo "waited $((i - 1)) seconds for sync"
535 }
536
537 # ensure that the squash defaults are the expected defaults
538 squash_id default 99 0
539 wait_nm_sync default squash_uid '' inactive
540 squash_id default 99 1
541 wait_nm_sync default squash_gid '' inactive
542
543 test_nid() {
544         local cmd
545
546         cmd="$LCTL nodemap_test_nid"
547
548         nid=$(do_facet mgs $cmd $1)
549
550         if [ $nid == $2 ]; then
551                 return 0
552         fi
553
554         return 1
555 }
556
557 cleanup_active() {
558         # restore activation state
559         do_facet mgs $LCTL nodemap_activate 0
560         wait_nm_sync active
561 }
562
563 test_idmap() {
564         local i
565         local cmd="$LCTL nodemap_test_id"
566         local rc=0
567
568         echo "Start to test idmaps ..."
569         ## nodemap deactivated
570         if ! do_facet mgs $LCTL nodemap_activate 0; then
571                 return 1
572         fi
573         for ((id = $ID0; id < NODEMAP_MAX_ID; id++)); do
574                 local j
575
576                 for ((j = 0; j < NODEMAP_RANGE_COUNT; j++)); do
577                         local nid="$SUBNET_CHECKSUM.0.${j}.100@tcp"
578                         local fs_id=$(do_facet mgs $cmd --nid $nid      \
579                                       --idtype uid --id $id)
580                         if [ $fs_id != $id ]; then
581                                 echo "expected $id, got $fs_id"
582                                 rc=$((rc + 1))
583                         fi
584                 done
585         done
586
587         ## nodemap activated
588         if ! do_facet mgs $LCTL nodemap_activate 1; then
589                 return 2
590         fi
591
592         for ((id = $ID0; id < NODEMAP_MAX_ID; id++)); do
593                 for ((j = 0; j < NODEMAP_RANGE_COUNT; j++)); do
594                         nid="$SUBNET_CHECKSUM.0.${j}.100@tcp"
595                         fs_id=$(do_facet mgs $cmd --nid $nid    \
596                                 --idtype uid --id $id)
597                         expected_id=$((id + 1))
598                         if [ $fs_id != $expected_id ]; then
599                                 echo "expected $expected_id, got $fs_id"
600                                 rc=$((rc + 1))
601                         fi
602                 done
603         done
604
605         ## trust client ids
606         for ((i = 0; i < NODEMAP_COUNT; i++)); do
607                 local csum=${HOSTNAME_CHECKSUM}_${i}
608
609                 if ! do_facet mgs $LCTL nodemap_modify --name $csum \
610                      --property trusted --value 1; then
611                         error "nodemap_modify $csum failed with $?"
612                         return 3
613                 fi
614         done
615
616         for ((id = $ID0; id < NODEMAP_MAX_ID; id++)); do
617                 for ((j = 0; j < NODEMAP_RANGE_COUNT; j++)); do
618                         nid="$SUBNET_CHECKSUM.0.${j}.100@tcp"
619                         fs_id=$(do_facet mgs $cmd --nid $nid    \
620                                 --idtype uid --id $id)
621                         if [ $fs_id != $id ]; then
622                                 echo "expected $id, got $fs_id"
623                                 rc=$((rc + 1))
624                         fi
625                 done
626         done
627
628         ## ensure allow_root_access is enabled
629         for ((i = 0; i < NODEMAP_COUNT; i++)); do
630                 local csum=${HOSTNAME_CHECKSUM}_${i}
631
632                 if ! do_facet mgs $LCTL nodemap_modify --name $csum     \
633                      --property admin --value 1; then
634                         error "nodemap_modify $csum failed with $?"
635                         return 3
636                 fi
637         done
638
639         ## check that root allowed
640         for ((j = 0; j < NODEMAP_RANGE_COUNT; j++)); do
641                 nid="$SUBNET_CHECKSUM.0.${j}.100@tcp"
642                 fs_id=$(do_facet mgs $cmd --nid $nid --idtype uid --id 0)
643                 if [ $fs_id != 0 ]; then
644                         echo "root allowed expected 0, got $fs_id"
645                         rc=$((rc + 1))
646                 fi
647         done
648
649         ## ensure allow_root_access is disabled
650         for ((i = 0; i < NODEMAP_COUNT; i++)); do
651                 local csum=${HOSTNAME_CHECKSUM}_${i}
652
653                 if ! do_facet mgs $LCTL nodemap_modify --name $csum     \
654                                 --property admin --value 0; then
655                         error "nodemap_modify ${HOSTNAME_CHECKSUM}_${i} "
656                                 "failed with $rc"
657                         return 3
658                 fi
659         done
660
661         ## check that root is mapped to 99
662         for ((j = 0; j < NODEMAP_RANGE_COUNT; j++)); do
663                 nid="$SUBNET_CHECKSUM.0.${j}.100@tcp"
664                 fs_id=$(do_facet mgs $cmd --nid $nid --idtype uid --id 0)
665                 if [ $fs_id != 99 ]; then
666                         error "root squash expected 99, got $fs_id"
667                         rc=$((rc + 1))
668                 fi
669         done
670
671         ## reset client trust to 0
672         for ((i = 0; i < NODEMAP_COUNT; i++)); do
673                 if ! do_facet mgs $LCTL nodemap_modify          \
674                         --name ${HOSTNAME_CHECKSUM}_${i}        \
675                         --property trusted --value 0; then
676                         error "nodemap_modify ${HOSTNAME_CHECKSUM}_${i} "
677                                 "failed with $rc"
678                         return 3
679                 fi
680         done
681
682         return $rc
683 }
684
685 test_7() {
686         local rc
687
688         remote_mgs_nodsh && skip "remote MGS with nodsh" && return
689         [ $(lustre_version_code mgs) -lt $(version_code 2.5.53) ] &&
690                 skip "No nodemap on $(lustre_build_version mgs) MGS < 2.5.53" &&
691                 return
692
693         create_nodemaps
694         rc=$?
695         [[ $rc != 0 ]] && error "nodemap_add failed with $rc" && return 1
696
697         delete_nodemaps
698         rc=$?
699         [[ $rc != 0 ]] && error "nodemap_del failed with $rc" && return 2
700
701         return 0
702 }
703 run_test 7 "nodemap create and delete"
704
705 test_8() {
706         local rc
707
708         remote_mgs_nodsh && skip "remote MGS with nodsh" && return
709         [ $(lustre_version_code mgs) -lt $(version_code 2.5.53) ] &&
710                 skip "No nodemap on $(lustre_build_version mgs) MGS < 2.5.53" &&
711                 return
712
713         # Set up nodemaps
714
715         create_nodemaps
716         rc=$?
717         [[ $rc != 0 ]] && error "nodemap_add failed with $rc" && return 1
718
719         # Try duplicates
720
721         create_nodemaps
722         rc=$?
723         [[ $rc == 0 ]] && error "duplicate nodemap_add allowed with $rc" &&
724         return 2
725
726         # Clean up
727         delete_nodemaps
728         rc=$?
729         [[ $rc != 0 ]] && error "nodemap_del failed with $rc" && return 3
730
731         return 0
732 }
733 run_test 8 "nodemap reject duplicates"
734
735 test_9() {
736         local i
737         local rc
738
739         remote_mgs_nodsh && skip "remote MGS with nodsh" && return
740         [ $(lustre_version_code mgs) -lt $(version_code 2.5.53) ] &&
741                 skip "No nodemap on $(lustre_build_version mgs) MGS < 2.5.53" &&
742                 return
743
744         rc=0
745         create_nodemaps
746         rc=$?
747         [[ $rc != 0 ]] && error "nodemap_add failed with $rc" && return 1
748
749         rc=0
750         for ((i = 0; i < NODEMAP_COUNT; i++)); do
751                 if ! add_range ${HOSTNAME_CHECKSUM}_${i} $i; then
752                         rc=$((rc + 1))
753                 fi
754         done
755         [[ $rc != 0 ]] && error "nodemap_add_range failed with $rc" && return 2
756
757         rc=0
758         for ((i = 0; i < NODEMAP_COUNT; i++)); do
759                 if ! delete_range ${HOSTNAME_CHECKSUM}_${i} $i; then
760                         rc=$((rc + 1))
761                 fi
762         done
763         [[ $rc != 0 ]] && error "nodemap_del_range failed with $rc" && return 4
764
765         rc=0
766         delete_nodemaps
767         rc=$?
768         [[ $rc != 0 ]] && error "nodemap_del failed with $rc" && return 4
769
770         return 0
771 }
772 run_test 9 "nodemap range add"
773
774 test_10a() {
775         local rc
776
777         remote_mgs_nodsh && skip "remote MGS with nodsh" && return
778         [ $(lustre_version_code mgs) -lt $(version_code 2.5.53) ] &&
779                 skip "No nodemap on $(lustre_build_version mgs) MGS < 2.5.53" &&
780                 return
781
782         rc=0
783         create_nodemaps
784         rc=$?
785         [[ $rc != 0 ]] && error "nodemap_add failed with $rc" && return 1
786
787         rc=0
788         for ((i = 0; i < NODEMAP_COUNT; i++)); do
789                 if ! add_range ${HOSTNAME_CHECKSUM}_${i} $i; then
790                         rc=$((rc + 1))
791                 fi
792         done
793         [[ $rc != 0 ]] && error "nodemap_add_range failed with $rc" && return 2
794
795         rc=0
796         for ((i = 0; i < NODEMAP_COUNT; i++)); do
797                 if ! add_range ${HOSTNAME_CHECKSUM}_${i} $i; then
798                         rc=$((rc + 1))
799                 fi
800         done
801         [[ $rc == 0 ]] && error "nodemap_add_range duplicate add with $rc" &&
802                 return 2
803
804
805         rc=0
806         for ((i = 0; i < NODEMAP_COUNT; i++)); do
807                 if ! delete_range ${HOSTNAME_CHECKSUM}_${i} $i; then
808                         rc=$((rc + 1))
809                 fi
810         done
811         [[ $rc != 0 ]] && error "nodemap_del_range failed with $rc" && return 4
812
813         delete_nodemaps
814         rc=$?
815         [[ $rc != 0 ]] && error "nodemap_del failed with $rc" && return 5
816
817         return 0
818 }
819 run_test 10a "nodemap reject duplicate ranges"
820
821 test_10b() {
822         [ $(lustre_version_code mgs) -lt $(version_code 2.10.53) ] &&
823                 skip "Need MGS >= 2.10.53" && return
824
825         local nm1="nodemap1"
826         local nm2="nodemap2"
827         local nids="192.168.19.[0-255]@o2ib20"
828
829         do_facet mgs $LCTL nodemap_del $nm1 2>/dev/null
830         do_facet mgs $LCTL nodemap_del $nm2 2>/dev/null
831
832         do_facet mgs $LCTL nodemap_add $nm1 || error "Add $nm1 failed"
833         do_facet mgs $LCTL nodemap_add $nm2 || error "Add $nm2 failed"
834         do_facet mgs $LCTL nodemap_add_range --name $nm1 --range $nids ||
835                 error "Add range $nids to $nm1 failed"
836         [ -n "$(do_facet mgs $LCTL get_param nodemap.$nm1.* |
837                 grep start_nid)" ] || error "No range was found"
838         do_facet mgs $LCTL nodemap_del_range --name $nm2 --range $nids &&
839                 error "Deleting range $nids from $nm2 should fail"
840         [ -n "$(do_facet mgs $LCTL get_param nodemap.$nm1.* |
841                 grep start_nid)" ] || error "Range $nids should be there"
842
843         do_facet mgs $LCTL nodemap_del $nm1 || error "Delete $nm1 failed"
844         do_facet mgs $LCTL nodemap_del $nm2 || error "Delete $nm2 failed"
845         return 0
846 }
847 run_test 10b "delete range from the correct nodemap"
848
849 test_10c() { #LU-8912
850         [ $(lustre_version_code mgs) -lt $(version_code 2.10.57) ] &&
851                 skip "Need MGS >= 2.10.57" && return
852
853         local nm="nodemap_lu8912"
854         local nid_range="10.210.[32-47].[0-255]@o2ib3"
855         local start_nid="10.210.32.0@o2ib3"
856         local end_nid="10.210.47.255@o2ib3"
857         local start_nid_found
858         local end_nid_found
859
860         do_facet mgs $LCTL nodemap_del $nm 2>/dev/null
861         do_facet mgs $LCTL nodemap_add $nm || error "Add $nm failed"
862         do_facet mgs $LCTL nodemap_add_range --name $nm --range $nid_range ||
863                 error "Add range $nid_range to $nm failed"
864
865         start_nid_found=$(do_facet mgs $LCTL get_param nodemap.$nm.* |
866                 awk -F '[,: ]' /start_nid/'{ print $9 }')
867         [ "$start_nid" == "$start_nid_found" ] ||
868                 error "start_nid: $start_nid_found != $start_nid"
869         end_nid_found=$(do_facet mgs $LCTL get_param nodemap.$nm.* |
870                 awk -F '[,: ]' /end_nid/'{ print $13 }')
871         [ "$end_nid" == "$end_nid_found" ] ||
872                 error "end_nid: $end_nid_found != $end_nid"
873
874         do_facet mgs $LCTL nodemap_del $nm || error "Delete $nm failed"
875         return 0
876 }
877 run_test 10c "verfify contiguous range support"
878
879 test_10d() { #LU-8913
880         [ $(lustre_version_code mgs) -lt $(version_code 2.10.59) ] &&
881                 skip "Need MGS >= 2.10.59" && return
882
883         local nm="nodemap_lu8913"
884         local nid_range="*@o2ib3"
885         local start_nid="0.0.0.0@o2ib3"
886         local end_nid="255.255.255.255@o2ib3"
887         local start_nid_found
888         local end_nid_found
889
890         do_facet mgs $LCTL nodemap_del $nm 2>/dev/null
891         do_facet mgs $LCTL nodemap_add $nm || error "Add $nm failed"
892         do_facet mgs $LCTL nodemap_add_range --name $nm --range $nid_range ||
893                 error "Add range $nid_range to $nm failed"
894
895         start_nid_found=$(do_facet mgs $LCTL get_param nodemap.$nm.* |
896                 awk -F '[,: ]' /start_nid/'{ print $9 }')
897         [ "$start_nid" == "$start_nid_found" ] ||
898                 error "start_nid: $start_nid_found != $start_nid"
899         end_nid_found=$(do_facet mgs $LCTL get_param nodemap.$nm.* |
900                 awk -F '[,: ]' /end_nid/'{ print $13 }')
901         [ "$end_nid" == "$end_nid_found" ] ||
902                 error "end_nid: $end_nid_found != $end_nid"
903
904         do_facet mgs $LCTL nodemap_del $nm || error "Delete $nm failed"
905         return 0
906 }
907 run_test 10d "verfify nodemap range format '*@<net>' support"
908
909 test_11() {
910         local rc
911
912         remote_mgs_nodsh && skip "remote MGS with nodsh" && return
913         [ $(lustre_version_code mgs) -lt $(version_code 2.5.53) ] &&
914                 skip "No nodemap on $(lustre_build_version mgs) MGS < 2.5.53" &&
915                 return
916
917         rc=0
918         create_nodemaps
919         rc=$?
920         [[ $rc != 0 ]] && error "nodemap_add failed with $rc" && return 1
921
922         rc=0
923         for ((i = 0; i < NODEMAP_COUNT; i++)); do
924                 if ! modify_flags ${HOSTNAME_CHECKSUM}_${i}; then
925                         rc=$((rc + 1))
926                 fi
927         done
928         [[ $rc != 0 ]] && error "nodemap_modify with $rc" && return 2
929
930         rc=0
931         delete_nodemaps
932         rc=$?
933         [[ $rc != 0 ]] && error "nodemap_del failed with $rc" && return 3
934
935         return 0
936 }
937 run_test 11 "nodemap modify"
938
939 test_12() {
940         local rc
941
942         remote_mgs_nodsh && skip "remote MGS with nodsh" && return
943         [ $(lustre_version_code mgs) -lt $(version_code 2.5.53) ] &&
944                 skip "No nodemap on $(lustre_build_version mgs) MGS < 2.5.53" &&
945                 return
946
947         rc=0
948         create_nodemaps
949         rc=$?
950         [[ $rc != 0 ]] && error "nodemap_add failed with $rc" && return 1
951
952         rc=0
953         for ((i = 0; i < NODEMAP_COUNT; i++)); do
954                 if ! squash_id ${HOSTNAME_CHECKSUM}_${i} 88 0; then
955                         rc=$((rc + 1))
956                 fi
957         done
958         [[ $rc != 0 ]] && error "nodemap squash_uid with $rc" && return 2
959
960         rc=0
961         for ((i = 0; i < NODEMAP_COUNT; i++)); do
962                 if ! squash_id ${HOSTNAME_CHECKSUM}_${i} 88 1; then
963                         rc=$((rc + 1))
964                 fi
965         done
966         [[ $rc != 0 ]] && error "nodemap squash_gid with $rc" && return 3
967
968         rc=0
969         delete_nodemaps
970         rc=$?
971         [[ $rc != 0 ]] && error "nodemap_del failed with $rc" && return 4
972
973         return 0
974 }
975 run_test 12 "nodemap set squash ids"
976
977 test_13() {
978         local rc
979
980         remote_mgs_nodsh && skip "remote MGS with nodsh" && return
981         [ $(lustre_version_code mgs) -lt $(version_code 2.5.53) ] &&
982                 skip "No nodemap on $(lustre_build_version mgs) MGS < 2.5.53" &&
983                 return
984
985         rc=0
986         create_nodemaps
987         rc=$?
988         [[ $rc != 0 ]] && error "nodemap_add failed with $rc" && return 1
989
990         rc=0
991         for ((i = 0; i < NODEMAP_COUNT; i++)); do
992                 if ! add_range ${HOSTNAME_CHECKSUM}_${i} $i; then
993                         rc=$((rc + 1))
994                 fi
995         done
996         [[ $rc != 0 ]] && error "nodemap_add_range failed with $rc" && return 2
997
998         rc=0
999         for ((i = 0; i < NODEMAP_COUNT; i++)); do
1000                 for ((j = 0; j < NODEMAP_RANGE_COUNT; j++)); do
1001                         for k in $NODEMAP_IPADDR_LIST; do
1002                                 if ! test_nid $SUBNET_CHECKSUM.$i.$j.$k \
1003                                        ${HOSTNAME_CHECKSUM}_${i}; then
1004                                         rc=$((rc + 1))
1005                                 fi
1006                         done
1007                 done
1008         done
1009         [[ $rc != 0 ]] && error "nodemap_test_nid failed with $rc" && return 3
1010
1011         rc=0
1012         delete_nodemaps
1013         rc=$?
1014         [[ $rc != 0 ]] && error "nodemap_del failed with $rc" && return 4
1015
1016         return 0
1017 }
1018 run_test 13 "test nids"
1019
1020 test_14() {
1021         local rc
1022
1023         remote_mgs_nodsh && skip "remote MGS with nodsh" && return
1024         [ $(lustre_version_code mgs) -lt $(version_code 2.5.53) ] &&
1025                 skip "No nodemap on $(lustre_build_version mgs) MGS < 2.5.53" &&
1026                 return
1027
1028         rc=0
1029         create_nodemaps
1030         rc=$?
1031         [[ $rc != 0 ]] && error "nodemap_add failed with $rc" && return 1
1032
1033         rc=0
1034         for ((i = 0; i < NODEMAP_COUNT; i++)); do
1035                 for ((j = 0; j < NODEMAP_RANGE_COUNT; j++)); do
1036                         for k in $NODEMAP_IPADDR_LIST; do
1037                                 if ! test_nid $SUBNET_CHECKSUM.$i.$j.$k \
1038                                         default; then
1039                                         rc=$((rc + 1))
1040                                 fi
1041                         done
1042                 done
1043         done
1044         [[ $rc != 0 ]] && error "nodemap_test_nid failed with $rc" && return 3
1045
1046         rc=0
1047         delete_nodemaps
1048         rc=$?
1049         [[ $rc != 0 ]] && error "nodemap_del failed with $rc" && return 4
1050
1051         return 0
1052 }
1053 run_test 14 "test default nodemap nid lookup"
1054
1055 test_15() {
1056         local rc
1057
1058         remote_mgs_nodsh && skip "remote MGS with nodsh" && return
1059         [ $(lustre_version_code mgs) -lt $(version_code 2.5.53) ] &&
1060                 skip "No nodemap on $(lustre_build_version mgs) MGS < 2.5.53" &&
1061                 return
1062
1063         rc=0
1064         create_nodemaps
1065         rc=$?
1066         [[ $rc != 0 ]] && error "nodemap_add failed with $rc" && return 1
1067
1068         rc=0
1069         for ((i = 0; i < NODEMAP_COUNT; i++)); do
1070                 if ! add_range ${HOSTNAME_CHECKSUM}_${i} $i; then
1071                         rc=$((rc + 1))
1072                 fi
1073         done
1074         [[ $rc != 0 ]] && error "nodemap_add_range failed with $rc" && return 2
1075
1076         rc=0
1077         add_idmaps
1078         rc=$?
1079         [[ $rc != 0 ]] && error "nodemap_add_idmap failed with $rc" && return 3
1080
1081         activedefault=$(do_facet mgs $LCTL get_param -n nodemap.active)
1082         if [[ "$activedefault" != "1" ]]; then
1083                 stack_trap cleanup_active EXIT
1084         fi
1085
1086         rc=0
1087         test_idmap
1088         rc=$?
1089         [[ $rc != 0 ]] && error "nodemap_test_id failed with $rc" && return 4
1090
1091         rc=0
1092         update_idmaps
1093         rc=$?
1094         [[ $rc != 0 ]] && error "update_idmaps failed with $rc" && return 5
1095
1096         rc=0
1097         delete_idmaps
1098         rc=$?
1099         [[ $rc != 0 ]] && error "nodemap_del_idmap failed with $rc" && return 6
1100
1101         rc=0
1102         delete_nodemaps
1103         rc=$?
1104         [[ $rc != 0 ]] && error "nodemap_delete failed with $rc" && return 7
1105
1106         return 0
1107 }
1108 run_test 15 "test id mapping"
1109
1110 create_fops_nodemaps() {
1111         local i=0
1112         local client
1113         for client in $clients; do
1114                 local client_ip=$(host_nids_address $client $NETTYPE)
1115                 local client_nid=$(h2nettype $client_ip)
1116                 do_facet mgs $LCTL nodemap_add c${i} || return 1
1117                 do_facet mgs $LCTL nodemap_add_range    \
1118                         --name c${i} --range $client_nid || return 1
1119                 for map in ${FOPS_IDMAPS[i]}; do
1120                         do_facet mgs $LCTL nodemap_add_idmap --name c${i} \
1121                                 --idtype uid --idmap ${map} || return 1
1122                         do_facet mgs $LCTL nodemap_add_idmap --name c${i} \
1123                                 --idtype gid --idmap ${map} || return 1
1124                 done
1125
1126                 wait_nm_sync c$i idmap
1127
1128                 i=$((i + 1))
1129         done
1130         return 0
1131 }
1132
1133 delete_fops_nodemaps() {
1134         local i=0
1135         local client
1136         for client in $clients; do
1137                 do_facet mgs $LCTL nodemap_del c${i} || return 1
1138                 i=$((i + 1))
1139         done
1140         return 0
1141 }
1142
1143 fops_mds_index=0
1144 nm_test_mkdir() {
1145         if [ $MDSCOUNT -le 1 ]; then
1146                 do_node ${clients_arr[0]} mkdir -p $DIR/$tdir
1147         else
1148                 # round-robin MDTs to test DNE nodemap support
1149                 [ ! -d $DIR ] && do_node ${clients_arr[0]} mkdir -p $DIR
1150                 do_node ${clients_arr[0]} $LFS setdirstripe -c 1 -i \
1151                         $((fops_mds_index % MDSCOUNT)) $DIR/$tdir
1152                 ((fops_mds_index++))
1153         fi
1154 }
1155
1156 # acl test directory needs to be initialized on a privileged client
1157 fops_test_setup() {
1158         local admin=$(do_facet mgs $LCTL get_param -n nodemap.c0.admin_nodemap)
1159         local trust=$(do_facet mgs $LCTL get_param -n \
1160                 nodemap.c0.trusted_nodemap)
1161
1162         do_facet mgs $LCTL nodemap_modify --name c0 --property admin --value 1
1163         do_facet mgs $LCTL nodemap_modify --name c0 --property trusted --value 1
1164
1165         wait_nm_sync c0 admin_nodemap
1166         wait_nm_sync c0 trusted_nodemap
1167
1168         do_node ${clients_arr[0]} rm -rf $DIR/$tdir
1169         nm_test_mkdir
1170         do_node ${clients_arr[0]} chown $user $DIR/$tdir
1171
1172         do_facet mgs $LCTL nodemap_modify --name c0 \
1173                 --property admin --value $admin
1174         do_facet mgs $LCTL nodemap_modify --name c0 \
1175                 --property trusted --value $trust
1176
1177         # flush MDT locks to make sure they are reacquired before test
1178         do_node ${clients_arr[0]} $LCTL set_param \
1179                 ldlm.namespaces.$FSNAME-MDT*.lru_size=clear
1180
1181         wait_nm_sync c0 admin_nodemap
1182         wait_nm_sync c0 trusted_nodemap
1183 }
1184
1185 # fileset test directory needs to be initialized on a privileged client
1186 fileset_test_setup() {
1187         local nm=$1
1188
1189         if [ -n "$FILESET" -a -z "$SKIP_FILESET" ]; then
1190                 cleanup_mount $MOUNT
1191                 FILESET="" zconf_mount_clients $CLIENTS $MOUNT
1192         fi
1193
1194         local admin=$(do_facet mgs $LCTL get_param -n \
1195                 nodemap.${nm}.admin_nodemap)
1196         local trust=$(do_facet mgs $LCTL get_param -n \
1197                 nodemap.${nm}.trusted_nodemap)
1198
1199         do_facet mgs $LCTL nodemap_modify --name $nm --property admin --value 1
1200         do_facet mgs $LCTL nodemap_modify --name $nm --property trusted \
1201                 --value 1
1202
1203         wait_nm_sync $nm admin_nodemap
1204         wait_nm_sync $nm trusted_nodemap
1205
1206         # create directory and populate it for subdir mount
1207         do_node ${clients_arr[0]} mkdir $MOUNT/$subdir ||
1208                 error "unable to create dir $MOUNT/$subdir"
1209         do_node ${clients_arr[0]} touch $MOUNT/$subdir/this_is_$subdir ||
1210                 error "unable to create file $MOUNT/$subdir/this_is_$subdir"
1211         do_node ${clients_arr[0]} mkdir $MOUNT/$subdir/$subsubdir ||
1212                 error "unable to create dir $MOUNT/$subdir/$subsubdir"
1213         do_node ${clients_arr[0]} touch \
1214                         $MOUNT/$subdir/$subsubdir/this_is_$subsubdir ||
1215                 error "unable to create file \
1216                         $MOUNT/$subdir/$subsubdir/this_is_$subsubdir"
1217
1218         do_facet mgs $LCTL nodemap_modify --name $nm \
1219                 --property admin --value $admin
1220         do_facet mgs $LCTL nodemap_modify --name $nm \
1221                 --property trusted --value $trust
1222
1223         # flush MDT locks to make sure they are reacquired before test
1224         do_node ${clients_arr[0]} $LCTL set_param \
1225                 ldlm.namespaces.$FSNAME-MDT*.lru_size=clear
1226
1227         wait_nm_sync $nm admin_nodemap
1228         wait_nm_sync $nm trusted_nodemap
1229 }
1230
1231 # fileset test directory needs to be initialized on a privileged client
1232 fileset_test_cleanup() {
1233         local nm=$1
1234         local admin=$(do_facet mgs $LCTL get_param -n \
1235                 nodemap.${nm}.admin_nodemap)
1236         local trust=$(do_facet mgs $LCTL get_param -n \
1237                 nodemap.${nm}.trusted_nodemap)
1238
1239         do_facet mgs $LCTL nodemap_modify --name $nm --property admin --value 1
1240         do_facet mgs $LCTL nodemap_modify --name $nm --property trusted \
1241                 --value 1
1242
1243         wait_nm_sync $nm admin_nodemap
1244         wait_nm_sync $nm trusted_nodemap
1245
1246         # cleanup directory created for subdir mount
1247         do_node ${clients_arr[0]} rm -rf $MOUNT/$subdir ||
1248                 error "unable to remove dir $MOUNT/$subdir"
1249
1250         do_facet mgs $LCTL nodemap_modify --name $nm \
1251                 --property admin --value $admin
1252         do_facet mgs $LCTL nodemap_modify --name $nm \
1253                 --property trusted --value $trust
1254
1255         # flush MDT locks to make sure they are reacquired before test
1256         do_node ${clients_arr[0]} $LCTL set_param \
1257                 ldlm.namespaces.$FSNAME-MDT*.lru_size=clear
1258
1259         wait_nm_sync $nm admin_nodemap
1260         wait_nm_sync $nm trusted_nodemap
1261         if [ -n "$FILESET" -a -z "$SKIP_FILESET" ]; then
1262                 cleanup_mount $MOUNT
1263                 zconf_mount_clients $CLIENTS $MOUNT
1264         fi
1265 }
1266
1267 do_create_delete() {
1268         local run_u=$1
1269         local key=$2
1270         local testfile=$DIR/$tdir/$tfile
1271         local rc=0
1272         local c=0 d=0
1273         local qused_new
1274         if $run_u touch $testfile >& /dev/null; then
1275                 c=1
1276                 $run_u rm $testfile && d=1
1277         fi >& /dev/null
1278
1279         local res="$c $d"
1280         local expected=$(get_cr_del_expected $key)
1281         [ "$res" != "$expected" ] &&
1282                 error "test $key, wanted $expected, got $res" && rc=$((rc + 1))
1283         return $rc
1284 }
1285
1286 nodemap_check_quota() {
1287         local run_u="$1"
1288         $run_u lfs quota -q $DIR | awk '{ print $2; exit; }'
1289 }
1290
1291 do_fops_quota_test() {
1292         local run_u=$1
1293         # fuzz quota used to account for possible indirect blocks, etc
1294         local quota_fuzz=$(fs_log_size)
1295         local qused_orig=$(nodemap_check_quota "$run_u")
1296         local qused_high=$((qused_orig + quota_fuzz))
1297         local qused_low=$((qused_orig - quota_fuzz))
1298         local testfile=$DIR/$tdir/$tfile
1299         $run_u dd if=/dev/zero of=$testfile oflag=sync bs=1M count=1 \
1300                 >& /dev/null || error "unable to write quota test file"
1301         sync; sync_all_data || true
1302
1303         local qused_new=$(nodemap_check_quota "$run_u")
1304         [ $((qused_new)) -lt $((qused_low + 1024)) -o \
1305           $((qused_new)) -gt $((qused_high + 1024)) ] &&
1306                 error "$qused_new != $qused_orig + 1M after write, " \
1307                       "fuzz is $quota_fuzz"
1308         $run_u rm $testfile || error "unable to remove quota test file"
1309         wait_delete_completed_mds
1310
1311         qused_new=$(nodemap_check_quota "$run_u")
1312         [ $((qused_new)) -lt $((qused_low)) \
1313                 -o $((qused_new)) -gt $((qused_high)) ] &&
1314                 error "quota not reclaimed, expect $qused_orig, " \
1315                       "got $qused_new, fuzz $quota_fuzz"
1316 }
1317
1318 get_fops_mapped_user() {
1319         local cli_user=$1
1320
1321         for ((i=0; i < ${#FOPS_IDMAPS[@]}; i++)); do
1322                 for map in ${FOPS_IDMAPS[i]}; do
1323                         if [ $(cut -d: -f1 <<< "$map") == $cli_user ]; then
1324                                 cut -d: -f2 <<< "$map"
1325                                 return
1326                         fi
1327                 done
1328         done
1329         echo -1
1330 }
1331
1332 get_cr_del_expected() {
1333         local -a key
1334         IFS=":" read -a key <<< "$1"
1335         local mapmode="${key[0]}"
1336         local mds_user="${key[1]}"
1337         local cluster="${key[2]}"
1338         local cli_user="${key[3]}"
1339         local mode="0${key[4]}"
1340         local SUCCESS="1 1"
1341         local FAILURE="0 0"
1342         local noadmin=0
1343         local mapped=0
1344         local other=0
1345
1346         [[ $mapmode == *mapped* ]] && mapped=1
1347         # only c1 is mapped in these test cases
1348         [[ $mapmode == mapped_trusted* ]] && [ "$cluster" == "c0" ] && mapped=0
1349         [[ $mapmode == *noadmin* ]] && noadmin=1
1350
1351         # o+wx works as long as the user isn't mapped
1352         if [ $((mode & 3)) -eq 3 ]; then
1353                 other=1
1354         fi
1355
1356         # if client user is root, check if root is squashed
1357         if [ "$cli_user" == "0" ]; then
1358                 # squash root succeed, if other bit is on
1359                 case $noadmin in
1360                         0) echo $SUCCESS;;
1361                         1) [ "$other" == "1" ] && echo $SUCCESS
1362                            [ "$other" == "0" ] && echo $FAILURE;;
1363                 esac
1364                 return
1365         fi
1366         if [ "$mapped" == "0" ]; then
1367                 [ "$other" == "1" ] && echo $SUCCESS
1368                 [ "$other" == "0" ] && echo $FAILURE
1369                 return
1370         fi
1371
1372         # if mapped user is mds user, check for u+wx
1373         mapped_user=$(get_fops_mapped_user $cli_user)
1374         [ "$mapped_user" == "-1" ] &&
1375                 error "unable to find mapping for client user $cli_user"
1376
1377         if [ "$mapped_user" == "$mds_user" -a \
1378              $(((mode & 0300) == 0300)) -eq 1 ]; then
1379                 echo $SUCCESS
1380                 return
1381         fi
1382         if [ "$mapped_user" != "$mds_user" -a "$other" == "1" ]; then
1383                 echo $SUCCESS
1384                 return
1385         fi
1386         echo $FAILURE
1387 }
1388
1389 test_fops_admin_cli_i=""
1390 test_fops_chmod_dir() {
1391         local current_cli_i=$1
1392         local perm_bits=$2
1393         local dir_to_chmod=$3
1394         local new_admin_cli_i=""
1395
1396         # do we need to set up a new admin client?
1397         [ "$current_cli_i" == "0" ] && [ "$test_fops_admin_cli_i" != "1" ] &&
1398                 new_admin_cli_i=1
1399         [ "$current_cli_i" != "0" ] && [ "$test_fops_admin_cli_i" != "0" ] &&
1400                 new_admin_cli_i=0
1401
1402         # if only one client, and non-admin, need to flip admin everytime
1403         if [ "$num_clients" == "1" ]; then
1404                 test_fops_admin_client=$clients
1405                 test_fops_admin_val=$(do_facet mgs $LCTL get_param -n \
1406                         nodemap.c0.admin_nodemap)
1407                 if [ "$test_fops_admin_val" != "1" ]; then
1408                         do_facet mgs $LCTL nodemap_modify \
1409                                 --name c0 \
1410                                 --property admin \
1411                                 --value 1
1412                         wait_nm_sync c0 admin_nodemap
1413                 fi
1414         elif [ "$new_admin_cli_i" != "" ]; then
1415                 # restore admin val to old admin client
1416                 if [ "$test_fops_admin_cli_i" != "" ] &&
1417                                 [ "$test_fops_admin_val" != "1" ]; then
1418                         do_facet mgs $LCTL nodemap_modify \
1419                                 --name c${test_fops_admin_cli_i} \
1420                                 --property admin \
1421                                 --value $test_fops_admin_val
1422                         wait_nm_sync c${test_fops_admin_cli_i} admin_nodemap
1423                 fi
1424
1425                 test_fops_admin_cli_i=$new_admin_cli_i
1426                 test_fops_admin_client=${clients_arr[$new_admin_cli_i]}
1427                 test_fops_admin_val=$(do_facet mgs $LCTL get_param -n \
1428                         nodemap.c${new_admin_cli_i}.admin_nodemap)
1429
1430                 if [ "$test_fops_admin_val" != "1" ]; then
1431                         do_facet mgs $LCTL nodemap_modify \
1432                                 --name c${new_admin_cli_i} \
1433                                 --property admin \
1434                                 --value 1
1435                         wait_nm_sync c${new_admin_cli_i} admin_nodemap
1436                 fi
1437         fi
1438
1439         do_node $test_fops_admin_client chmod $perm_bits $DIR/$tdir || return 1
1440
1441         # remove admin for single client if originally non-admin
1442         if [ "$num_clients" == "1" ] && [ "$test_fops_admin_val" != "1" ]; then
1443                 do_facet mgs $LCTL nodemap_modify --name c0 --property admin \
1444                         --value 0
1445                 wait_nm_sync c0 admin_nodemap
1446         fi
1447
1448         return 0
1449 }
1450
1451 test_fops() {
1452         local mapmode="$1"
1453         local single_client="$2"
1454         local client_user_list=([0]="0 $((IDBASE+3)) $((IDBASE+4))"
1455                                 [1]="0 $((IDBASE+5)) $((IDBASE+6))")
1456         local mds_i
1457         local rc=0
1458         local perm_bit_list="0 3 $((0300)) $((0303))"
1459         # SLOW tests 000-007, 010-070, 100-700 (octal modes)
1460         [ "$SLOW" == "yes" ] &&
1461                 perm_bit_list="0 $(seq 1 7) $(seq 8 8 63) $(seq 64 64 511) \
1462                                $((0303))"
1463
1464         # step through mds users. -1 means root
1465         for mds_i in -1 0 1 2; do
1466                 local user=$((mds_i + IDBASE))
1467                 local client
1468                 local x
1469
1470                 [ "$mds_i" == "-1" ] && user=0
1471
1472                 echo mkdir -p $DIR/$tdir
1473                 fops_test_setup
1474                 local cli_i=0
1475                 for client in $clients; do
1476                         local u
1477                         for u in ${client_user_list[$cli_i]}; do
1478                                 local run_u="do_node $client \
1479                                              $RUNAS_CMD -u$u -g$u -G$u"
1480                                 for perm_bits in $perm_bit_list; do
1481                                         local mode=$(printf %03o $perm_bits)
1482                                         local key
1483                                         key="$mapmode:$user:c$cli_i:$u:$mode"
1484                                         test_fops_chmod_dir $cli_i $mode \
1485                                                 $DIR/$tdir ||
1486                                                         error cannot chmod $key
1487                                         do_create_delete "$run_u" "$key"
1488                                 done
1489
1490                                 # check quota
1491                                 test_fops_chmod_dir $cli_i 777 $DIR/$tdir ||
1492                                         error cannot chmod $key
1493                                 do_fops_quota_test "$run_u"
1494                         done
1495
1496                         cli_i=$((cli_i + 1))
1497                         [ "$single_client" == "1" ] && break
1498                 done
1499                 rm -rf $DIR/$tdir
1500         done
1501         return $rc
1502 }
1503
1504 nodemap_version_check () {
1505         remote_mgs_nodsh && skip "remote MGS with nodsh" && return 1
1506         [ $(lustre_version_code mgs) -lt $(version_code 2.5.53) ] &&
1507                 skip "No nodemap on $(lustre_build_version mgs) MGS < 2.5.53" &&
1508                 return 1
1509         return 0
1510 }
1511
1512 nodemap_test_setup() {
1513         local rc
1514         local active_nodemap=1
1515
1516         [ "$1" == "0" ] && active_nodemap=0
1517
1518         do_nodes $(comma_list $(all_mdts_nodes)) \
1519                 $LCTL set_param mdt.*.identity_upcall=NONE
1520
1521         rc=0
1522         create_fops_nodemaps
1523         rc=$?
1524         [[ $rc != 0 ]] && error "adding fops nodemaps failed $rc"
1525
1526         do_facet mgs $LCTL nodemap_activate $active_nodemap
1527         wait_nm_sync active
1528
1529         do_facet mgs $LCTL nodemap_modify --name default \
1530                 --property admin --value 1
1531         wait_nm_sync default admin_nodemap
1532         do_facet mgs $LCTL nodemap_modify --name default \
1533                 --property trusted --value 1
1534         wait_nm_sync default trusted_nodemap
1535 }
1536
1537 nodemap_test_cleanup() {
1538         trap 0
1539         delete_fops_nodemaps
1540         rc=$?
1541         [[ $rc != 0 ]] && error "removing fops nodemaps failed $rc"
1542
1543         do_facet mgs $LCTL nodemap_modify --name default \
1544                  --property admin --value 0
1545         wait_nm_sync default admin_nodemap
1546         do_facet mgs $LCTL nodemap_modify --name default \
1547                  --property trusted --value 0
1548         wait_nm_sync default trusted_nodemap
1549
1550         do_facet mgs $LCTL nodemap_activate 0
1551         wait_nm_sync active 0
1552
1553         export SK_UNIQUE_NM=false
1554         return 0
1555 }
1556
1557 nodemap_clients_admin_trusted() {
1558         local admin=$1
1559         local tr=$2
1560         local i=0
1561         for client in $clients; do
1562                 do_facet mgs $LCTL nodemap_modify --name c0 \
1563                         --property admin --value $admin
1564                 do_facet mgs $LCTL nodemap_modify --name c0 \
1565                         --property trusted --value $tr
1566                 i=$((i + 1))
1567         done
1568         wait_nm_sync c$((i - 1)) admin_nodemap
1569         wait_nm_sync c$((i - 1)) trusted_nodemap
1570 }
1571
1572 test_16() {
1573         nodemap_version_check || return 0
1574         nodemap_test_setup 0
1575
1576         trap nodemap_test_cleanup EXIT
1577         test_fops all_off
1578         nodemap_test_cleanup
1579 }
1580 run_test 16 "test nodemap all_off fileops"
1581
1582 test_17() {
1583         if $SHARED_KEY &&
1584         [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.55) ]; then
1585                 skip "Need MDS >= 2.11.55"
1586         fi
1587
1588         nodemap_version_check || return 0
1589         nodemap_test_setup
1590
1591         trap nodemap_test_cleanup EXIT
1592         nodemap_clients_admin_trusted 0 1
1593         test_fops trusted_noadmin 1
1594         nodemap_test_cleanup
1595 }
1596 run_test 17 "test nodemap trusted_noadmin fileops"
1597
1598 test_18() {
1599         if $SHARED_KEY &&
1600         [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.55) ]; then
1601                 skip "Need MDS >= 2.11.55"
1602         fi
1603
1604         nodemap_version_check || return 0
1605         nodemap_test_setup
1606
1607         trap nodemap_test_cleanup EXIT
1608         nodemap_clients_admin_trusted 0 0
1609         test_fops mapped_noadmin 1
1610         nodemap_test_cleanup
1611 }
1612 run_test 18 "test nodemap mapped_noadmin fileops"
1613
1614 test_19() {
1615         if $SHARED_KEY &&
1616         [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.55) ]; then
1617                 skip "Need MDS >= 2.11.55"
1618         fi
1619
1620         nodemap_version_check || return 0
1621         nodemap_test_setup
1622
1623         trap nodemap_test_cleanup EXIT
1624         nodemap_clients_admin_trusted 1 1
1625         test_fops trusted_admin 1
1626         nodemap_test_cleanup
1627 }
1628 run_test 19 "test nodemap trusted_admin fileops"
1629
1630 test_20() {
1631         if $SHARED_KEY &&
1632         [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.55) ]; then
1633                 skip "Need MDS >= 2.11.55"
1634         fi
1635
1636         nodemap_version_check || return 0
1637         nodemap_test_setup
1638
1639         trap nodemap_test_cleanup EXIT
1640         nodemap_clients_admin_trusted 1 0
1641         test_fops mapped_admin 1
1642         nodemap_test_cleanup
1643 }
1644 run_test 20 "test nodemap mapped_admin fileops"
1645
1646 test_21() {
1647         if $SHARED_KEY &&
1648         [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.55) ]; then
1649                 skip "Need MDS >= 2.11.55"
1650         fi
1651
1652         nodemap_version_check || return 0
1653         nodemap_test_setup
1654
1655         trap nodemap_test_cleanup EXIT
1656         local x=1
1657         local i=0
1658         for client in $clients; do
1659                 do_facet mgs $LCTL nodemap_modify --name c${i} \
1660                         --property admin --value 0
1661                 do_facet mgs $LCTL nodemap_modify --name c${i} \
1662                         --property trusted --value $x
1663                 x=0
1664                 i=$((i + 1))
1665         done
1666         wait_nm_sync c$((i - 1)) trusted_nodemap
1667
1668         test_fops mapped_trusted_noadmin
1669         nodemap_test_cleanup
1670 }
1671 run_test 21 "test nodemap mapped_trusted_noadmin fileops"
1672
1673 test_22() {
1674         if $SHARED_KEY &&
1675         [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.55) ]; then
1676                 skip "Need MDS >= 2.11.55"
1677         fi
1678
1679         nodemap_version_check || return 0
1680         nodemap_test_setup
1681
1682         trap nodemap_test_cleanup EXIT
1683         local x=1
1684         local i=0
1685         for client in $clients; do
1686                 do_facet mgs $LCTL nodemap_modify --name c${i} \
1687                         --property admin --value 1
1688                 do_facet mgs $LCTL nodemap_modify --name c${i} \
1689                         --property trusted --value $x
1690                 x=0
1691                 i=$((i + 1))
1692         done
1693         wait_nm_sync c$((i - 1)) trusted_nodemap
1694
1695         test_fops mapped_trusted_admin
1696         nodemap_test_cleanup
1697 }
1698 run_test 22 "test nodemap mapped_trusted_admin fileops"
1699
1700 # acl test directory needs to be initialized on a privileged client
1701 nodemap_acl_test_setup() {
1702         local admin=$(do_facet mgs $LCTL get_param -n \
1703                       nodemap.c0.admin_nodemap)
1704         local trust=$(do_facet mgs $LCTL get_param -n \
1705                       nodemap.c0.trusted_nodemap)
1706
1707         do_facet mgs $LCTL nodemap_modify --name c0 --property admin --value 1
1708         do_facet mgs $LCTL nodemap_modify --name c0 --property trusted --value 1
1709
1710         wait_nm_sync c0 admin_nodemap
1711         wait_nm_sync c0 trusted_nodemap
1712
1713         do_node ${clients_arr[0]} rm -rf $DIR/$tdir
1714         nm_test_mkdir
1715         do_node ${clients_arr[0]} chmod a+rwx $DIR/$tdir ||
1716                 error unable to chmod a+rwx test dir $DIR/$tdir
1717
1718         do_facet mgs $LCTL nodemap_modify --name c0 \
1719                 --property admin --value $admin
1720         do_facet mgs $LCTL nodemap_modify --name c0 \
1721                 --property trusted --value $trust
1722
1723         wait_nm_sync c0 trusted_nodemap
1724 }
1725
1726 # returns 0 if the number of ACLs does not change on the second (mapped) client
1727 # after being set on the first client
1728 nodemap_acl_test() {
1729         local user="$1"
1730         local set_client="$2"
1731         local get_client="$3"
1732         local check_setfacl="$4"
1733         local setfacl_error=0
1734         local testfile=$DIR/$tdir/$tfile
1735         local RUNAS_USER="$RUNAS_CMD -u $user"
1736         local acl_count=0
1737         local acl_count_post=0
1738
1739         nodemap_acl_test_setup
1740         sleep 5
1741
1742         do_node $set_client $RUNAS_USER touch $testfile
1743
1744         # ACL masks aren't filtered by nodemap code, so we ignore them
1745         acl_count=$(do_node $get_client getfacl $testfile | grep -v mask |
1746                 wc -l)
1747         do_node $set_client $RUNAS_USER setfacl -m $user:rwx $testfile ||
1748                 setfacl_error=1
1749
1750         # if check setfacl is set to 1, then it's supposed to error
1751         if [ "$check_setfacl" == "1" ]; then
1752                 [ "$setfacl_error" != "1" ] && return 1
1753                 return 0
1754         fi
1755         [ "$setfacl_error" == "1" ] && echo "WARNING: unable to setfacl"
1756
1757         acl_count_post=$(do_node $get_client getfacl $testfile | grep -v mask |
1758                 wc -l)
1759         [ $acl_count -eq $acl_count_post ] && return 0
1760         return 1
1761 }
1762
1763 test_23a() {
1764         [ $num_clients -lt 2 ] && skip "Need 2 clients at least" && return
1765         nodemap_version_check || return 0
1766         nodemap_test_setup
1767
1768         trap nodemap_test_cleanup EXIT
1769         # 1 trusted cluster, 1 mapped cluster
1770         local unmapped_fs=$((IDBASE+0))
1771         local unmapped_c1=$((IDBASE+5))
1772         local mapped_fs=$((IDBASE+2))
1773         local mapped_c0=$((IDBASE+4))
1774         local mapped_c1=$((IDBASE+6))
1775
1776         do_facet mgs $LCTL nodemap_modify --name c0 --property admin --value 1
1777         do_facet mgs $LCTL nodemap_modify --name c0 --property trusted --value 1
1778
1779         do_facet mgs $LCTL nodemap_modify --name c1 --property admin --value 0
1780         do_facet mgs $LCTL nodemap_modify --name c1 --property trusted --value 0
1781
1782         wait_nm_sync c1 trusted_nodemap
1783
1784         # setfacl on trusted cluster to unmapped user, verify it's not seen
1785         nodemap_acl_test $unmapped_fs ${clients_arr[0]} ${clients_arr[1]} ||
1786                 error "acl count (1)"
1787
1788         # setfacl on trusted cluster to mapped user, verify it's seen
1789         nodemap_acl_test $mapped_fs ${clients_arr[0]} ${clients_arr[1]} &&
1790                 error "acl count (2)"
1791
1792         # setfacl on mapped cluster to mapped user, verify it's seen
1793         nodemap_acl_test $mapped_c1 ${clients_arr[1]} ${clients_arr[0]} &&
1794                 error "acl count (3)"
1795
1796         # setfacl on mapped cluster to unmapped user, verify error
1797         nodemap_acl_test $unmapped_fs ${clients_arr[1]} ${clients_arr[0]} 1 ||
1798                 error "acl count (4)"
1799
1800         # 2 mapped clusters
1801         do_facet mgs $LCTL nodemap_modify --name c0 --property admin --value 0
1802         do_facet mgs $LCTL nodemap_modify --name c0 --property trusted --value 0
1803
1804         wait_nm_sync c0 trusted_nodemap
1805
1806         # setfacl to mapped user on c1, also mapped to c0, verify it's seen
1807         nodemap_acl_test $mapped_c1 ${clients_arr[1]} ${clients_arr[0]} &&
1808                 error "acl count (5)"
1809
1810         # setfacl to mapped user on c1, not mapped to c0, verify not seen
1811         nodemap_acl_test $unmapped_c1 ${clients_arr[1]} ${clients_arr[0]} ||
1812                 error "acl count (6)"
1813
1814         nodemap_test_cleanup
1815 }
1816 run_test 23a "test mapped regular ACLs"
1817
1818 test_23b() { #LU-9929
1819         [ $num_clients -lt 2 ] && skip "Need 2 clients at least" && return
1820         [ $(lustre_version_code mgs) -lt $(version_code 2.10.53) ] &&
1821                 skip "Need MGS >= 2.10.53" && return
1822
1823         export SK_UNIQUE_NM=true
1824         nodemap_test_setup
1825         trap nodemap_test_cleanup EXIT
1826
1827         local testdir=$DIR/$tdir
1828         local fs_id=$((IDBASE+10))
1829         local unmapped_id
1830         local mapped_id
1831         local fs_user
1832
1833         do_facet mgs $LCTL nodemap_modify --name c0 --property admin --value 1
1834         wait_nm_sync c0 admin_nodemap
1835         do_facet mgs $LCTL nodemap_modify --name c1 --property admin --value 1
1836         wait_nm_sync c1 admin_nodemap
1837         do_facet mgs $LCTL nodemap_modify --name c1 --property trusted --value 1
1838         wait_nm_sync c1 trusted_nodemap
1839
1840         # Add idmap $ID0:$fs_id (500:60010)
1841         do_facet mgs $LCTL nodemap_add_idmap --name c0 --idtype gid \
1842                 --idmap $ID0:$fs_id ||
1843                 error "add idmap $ID0:$fs_id to nodemap c0 failed"
1844         wait_nm_sync c0 idmap
1845
1846         # set/getfacl default acl on client 1 (unmapped gid=500)
1847         do_node ${clients_arr[0]} rm -rf $testdir
1848         do_node ${clients_arr[0]} mkdir -p $testdir
1849         # Here, USER0=$(getent passwd | grep :$ID0:$ID0: | cut -d: -f1)
1850         do_node ${clients_arr[0]} setfacl -R -d -m group:$USER0:rwx $testdir ||
1851                 error "setfacl $testdir on ${clients_arr[0]} failed"
1852         unmapped_id=$(do_node ${clients_arr[0]} getfacl $testdir |
1853                         grep -E "default:group:.*:rwx" | awk -F: '{print $3}')
1854         [ "$unmapped_id" = "$USER0" ] ||
1855                 error "gid=$ID0 was not unmapped correctly on ${clients_arr[0]}"
1856
1857         # getfacl default acl on client 2 (mapped gid=60010)
1858         mapped_id=$(do_node ${clients_arr[1]} getfacl $testdir |
1859                         grep -E "default:group:.*:rwx" | awk -F: '{print $3}')
1860         fs_user=$(do_node ${clients_arr[1]} getent passwd |
1861                         grep :$fs_id:$fs_id: | cut -d: -f1)
1862         [ -z "$fs_user" ] && fs_user=$fs_id
1863         [ $mapped_id -eq $fs_id -o "$mapped_id" = "$fs_user" ] ||
1864                 error "Should return gid=$fs_id or $fs_user on client2"
1865
1866         rm -rf $testdir
1867         nodemap_test_cleanup
1868         export SK_UNIQUE_NM=false
1869 }
1870 run_test 23b "test mapped default ACLs"
1871
1872 test_24() {
1873         nodemap_test_setup
1874
1875         trap nodemap_test_cleanup EXIT
1876         do_nodes $(comma_list $(all_server_nodes)) $LCTL get_param -R nodemap
1877
1878         nodemap_test_cleanup
1879 }
1880 run_test 24 "check nodemap proc files for LBUGs and Oopses"
1881
1882 test_25() {
1883         local tmpfile=$(mktemp)
1884         local tmpfile2=$(mktemp)
1885         local tmpfile3=$(mktemp)
1886         local tmpfile4=$(mktemp)
1887         local subdir=c0dir
1888         local client
1889
1890         nodemap_version_check || return 0
1891
1892         # stop clients for this test
1893         zconf_umount_clients $CLIENTS $MOUNT ||
1894             error "unable to umount clients $CLIENTS"
1895
1896         export SK_UNIQUE_NM=true
1897         nodemap_test_setup
1898
1899         # enable trusted/admin for setquota call in cleanup_and_setup_lustre()
1900         i=0
1901         for client in $clients; do
1902                 do_facet mgs $LCTL nodemap_modify --name c${i} \
1903                         --property admin --value 1
1904                 do_facet mgs $LCTL nodemap_modify --name c${i} \
1905                         --property trusted --value 1
1906                 ((i++))
1907         done
1908         wait_nm_sync c$((i - 1)) trusted_nodemap
1909
1910         trap nodemap_test_cleanup EXIT
1911
1912         # create a new, empty nodemap, and add fileset info to it
1913         do_facet mgs $LCTL nodemap_add test25 ||
1914                 error "unable to create nodemap $testname"
1915         do_facet mgs $LCTL set_param -P nodemap.$testname.fileset=/$subdir ||
1916                 error "unable to add fileset info to nodemap test25"
1917
1918         wait_nm_sync test25 id
1919
1920         do_facet mgs $LCTL nodemap_info > $tmpfile
1921         do_facet mds $LCTL nodemap_info > $tmpfile2
1922
1923         if ! $SHARED_KEY; then
1924                 # will conflict with SK's nodemaps
1925                 cleanup_and_setup_lustre
1926         fi
1927         # stop clients for this test
1928         zconf_umount_clients $CLIENTS $MOUNT ||
1929             error "unable to umount clients $CLIENTS"
1930
1931         do_facet mgs $LCTL nodemap_info > $tmpfile3
1932         diff -q $tmpfile3 $tmpfile >& /dev/null ||
1933                 error "nodemap_info diff on MGS after remount"
1934
1935         do_facet mds $LCTL nodemap_info > $tmpfile4
1936         diff -q $tmpfile4 $tmpfile2 >& /dev/null ||
1937                 error "nodemap_info diff on MDS after remount"
1938
1939         # cleanup nodemap
1940         do_facet mgs $LCTL nodemap_del test25 ||
1941             error "cannot delete nodemap test25 from config"
1942         nodemap_test_cleanup
1943         # restart clients previously stopped
1944         zconf_mount_clients $CLIENTS $MOUNT ||
1945             error "unable to mount clients $CLIENTS"
1946
1947         rm -f $tmpfile $tmpfile2
1948         export SK_UNIQUE_NM=false
1949 }
1950 run_test 25 "test save and reload nodemap config"
1951
1952 test_26() {
1953         nodemap_version_check || return 0
1954
1955         local large_i=32000
1956
1957         do_facet mgs "seq -f 'c%g' $large_i | xargs -n1 $LCTL nodemap_add"
1958         wait_nm_sync c$large_i admin_nodemap
1959
1960         do_facet mgs "seq -f 'c%g' $large_i | xargs -n1 $LCTL nodemap_del"
1961         wait_nm_sync c$large_i admin_nodemap
1962 }
1963 run_test 26 "test transferring very large nodemap"
1964
1965 nodemap_exercise_fileset() {
1966         local nm="$1"
1967         local loop=0
1968
1969         # setup
1970         if [ "$nm" == "default" ]; then
1971                 do_facet mgs $LCTL nodemap_activate 1
1972                 wait_nm_sync active
1973         else
1974                 nodemap_test_setup
1975         fi
1976         if $SHARED_KEY; then
1977                 export SK_UNIQUE_NM=true
1978         else
1979                 # will conflict with SK's nodemaps
1980                 trap "fileset_test_cleanup $nm" EXIT
1981         fi
1982         fileset_test_setup "$nm"
1983
1984         # add fileset info to $nm nodemap
1985         if ! combined_mgs_mds; then
1986             do_facet mgs $LCTL set_param nodemap.${nm}.fileset=/$subdir ||
1987                 error "unable to add fileset info to $nm nodemap on MGS"
1988         fi
1989         do_facet mgs $LCTL set_param -P nodemap.${nm}.fileset=/$subdir ||
1990                error "unable to add fileset info to $nm nodemap for servers"
1991         wait_nm_sync $nm fileset "nodemap.${nm}.fileset=/$subdir"
1992
1993         # re-mount client
1994         zconf_umount_clients ${clients_arr[0]} $MOUNT ||
1995                 error "unable to umount client ${clients_arr[0]}"
1996         # set some generic fileset to trigger SSK code
1997         export FILESET=/
1998         zconf_mount_clients ${clients_arr[0]} $MOUNT $MOUNT_OPTS ||
1999                 error "unable to remount client ${clients_arr[0]}"
2000         unset FILESET
2001
2002         # test mount point content
2003         do_node ${clients_arr[0]} test -f $MOUNT/this_is_$subdir ||
2004                 error "fileset not taken into account"
2005
2006         # re-mount client with sub-subdir
2007         zconf_umount_clients ${clients_arr[0]} $MOUNT ||
2008                 error "unable to umount client ${clients_arr[0]}"
2009         export FILESET=/$subsubdir
2010         zconf_mount_clients ${clients_arr[0]} $MOUNT $MOUNT_OPTS ||
2011                 error "unable to remount client ${clients_arr[0]}"
2012         unset FILESET
2013
2014         # test mount point content
2015         do_node ${clients_arr[0]} test -f $MOUNT/this_is_$subsubdir ||
2016                 error "subdir of fileset not taken into account"
2017
2018         # remove fileset info from nodemap
2019         do_facet mgs $LCTL nodemap_set_fileset --name $nm --fileset clear ||
2020                 error "unable to delete fileset info on $nm nodemap"
2021         wait_update_facet mgs "$LCTL get_param nodemap.${nm}.fileset" \
2022                           "nodemap.${nm}.fileset=" ||
2023                 error "fileset info still not cleared on $nm nodemap"
2024         do_facet mgs $LCTL set_param -P nodemap.${nm}.fileset=clear ||
2025                 error "unable to reset fileset info on $nm nodemap"
2026         wait_nm_sync $nm fileset "nodemap.${nm}.fileset="
2027
2028         # re-mount client
2029         zconf_umount_clients ${clients_arr[0]} $MOUNT ||
2030                 error "unable to umount client ${clients_arr[0]}"
2031         zconf_mount_clients ${clients_arr[0]} $MOUNT $MOUNT_OPTS ||
2032                 error "unable to remount client ${clients_arr[0]}"
2033
2034         # test mount point content
2035         if ! $(do_node ${clients_arr[0]} test -d $MOUNT/$subdir); then
2036                 ls $MOUNT
2037                 error "fileset not cleared on $nm nodemap"
2038         fi
2039
2040         # back to non-nodemap setup
2041         if $SHARED_KEY; then
2042                 export SK_UNIQUE_NM=false
2043                 zconf_umount_clients ${clients_arr[0]} $MOUNT ||
2044                         error "unable to umount client ${clients_arr[0]}"
2045         fi
2046         fileset_test_cleanup "$nm"
2047         if [ "$nm" == "default" ]; then
2048                 do_facet mgs $LCTL nodemap_activate 0
2049                 wait_nm_sync active 0
2050                 trap 0
2051                 export SK_UNIQUE_NM=false
2052         else
2053                 nodemap_test_cleanup
2054         fi
2055         if $SHARED_KEY; then
2056                 zconf_mount_clients ${clients_arr[0]} $MOUNT $MOUNT_OPTS ||
2057                         error "unable to remount client ${clients_arr[0]}"
2058         fi
2059 }
2060
2061 test_27a() {
2062         [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.50) ] &&
2063                 skip "Need MDS >= 2.11.50" && return
2064
2065         for nm in "default" "c0"; do
2066                 local subdir="subdir_${nm}"
2067                 local subsubdir="subsubdir_${nm}"
2068
2069                 if [ "$nm" == "default" ] && [ "$SHARED_KEY" == "true" ]; then
2070                         echo "Skipping nodemap $nm with SHARED_KEY";
2071                         continue;
2072                 fi
2073
2074                 echo "Exercising fileset for nodemap $nm"
2075                 nodemap_exercise_fileset "$nm"
2076         done
2077 }
2078 run_test 27a "test fileset in various nodemaps"
2079
2080 test_27b() { #LU-10703
2081         [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.50) ] &&
2082                 skip "Need MDS >= 2.11.50" && return
2083         [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return
2084
2085         nodemap_test_setup
2086         trap nodemap_test_cleanup EXIT
2087
2088         # Add the nodemaps and set their filesets
2089         for i in $(seq 1 $MDSCOUNT); do
2090                 do_facet mgs $LCTL nodemap_del nm$i 2>/dev/null
2091                 do_facet mgs $LCTL nodemap_add nm$i ||
2092                         error "add nodemap nm$i failed"
2093                 wait_nm_sync nm$i "" "" "-N"
2094
2095                 if ! combined_mgs_mds; then
2096                         do_facet mgs \
2097                                 $LCTL set_param nodemap.nm$i.fileset=/dir$i ||
2098                                 error "set nm$i.fileset=/dir$i failed on MGS"
2099                 fi
2100                 do_facet mgs $LCTL set_param -P nodemap.nm$i.fileset=/dir$i ||
2101                         error "set nm$i.fileset=/dir$i failed on servers"
2102                 wait_nm_sync nm$i fileset "nodemap.nm$i.fileset=/dir$i"
2103         done
2104
2105         # Check if all the filesets are correct
2106         for i in $(seq 1 $MDSCOUNT); do
2107                 fileset=$(do_facet mds$i \
2108                           $LCTL get_param -n nodemap.nm$i.fileset)
2109                 [ "$fileset" = "/dir$i" ] ||
2110                         error "nm$i.fileset $fileset != /dir$i on mds$i"
2111                 do_facet mgs $LCTL nodemap_del nm$i ||
2112                         error "delete nodemap nm$i failed"
2113         done
2114
2115         nodemap_test_cleanup
2116 }
2117 run_test 27b "The new nodemap won't clear the old nodemap's fileset"
2118
2119 test_28() {
2120         if ! $SHARED_KEY; then
2121                 skip "need shared key feature for this test" && return
2122         fi
2123         mkdir -p $DIR/$tdir || error "mkdir failed"
2124         touch $DIR/$tdir/$tdir.out || error "touch failed"
2125         if [ ! -f $DIR/$tdir/$tdir.out ]; then
2126                 error "read before rotation failed"
2127         fi
2128         # store top key identity to ensure rotation has occurred
2129         SK_IDENTITY_OLD=$(lctl get_param *.*.*srpc* | grep "expire" |
2130                 head -1 | awk '{print $15}' | cut -c1-8)
2131         do_facet $SINGLEMDS lfs flushctx ||
2132                  error "could not run flushctx on $SINGLEMDS"
2133         sleep 5
2134         lfs flushctx || error "could not run flushctx on client"
2135         sleep 5
2136         # verify new key is in place
2137         SK_IDENTITY_NEW=$(lctl get_param *.*.*srpc* | grep "expire" |
2138                 head -1 | awk '{print $15}' | cut -c1-8)
2139         if [ $SK_IDENTITY_OLD == $SK_IDENTITY_NEW ]; then
2140                 error "key did not rotate correctly"
2141         fi
2142         if [ ! -f $DIR/$tdir/$tdir.out ]; then
2143                 error "read after rotation failed"
2144         fi
2145 }
2146 run_test 28 "check shared key rotation method"
2147
2148 test_29() {
2149         if ! $SHARED_KEY; then
2150                 skip "need shared key feature for this test" && return
2151         fi
2152         if [ $SK_FLAVOR != "ski" ] && [ $SK_FLAVOR != "skpi" ]; then
2153                 skip "test only valid if integrity is active"
2154         fi
2155         rm -r $DIR/$tdir
2156         mkdir $DIR/$tdir || error "mkdir"
2157         touch $DIR/$tdir/$tfile || error "touch"
2158         zconf_umount_clients ${clients_arr[0]} $MOUNT ||
2159                 error "unable to umount clients"
2160         keyctl show | awk '/lustre/ { print $1 }' |
2161                 xargs -IX keyctl unlink X
2162         OLD_SK_PATH=$SK_PATH
2163         export SK_PATH=/dev/null
2164         if zconf_mount_clients ${clients_arr[0]} $MOUNT; then
2165                 export SK_PATH=$OLD_SK_PATH
2166                 if [ -e $DIR/$tdir/$tfile ]; then
2167                         error "able to mount and read without key"
2168                 else
2169                         error "able to mount without key"
2170                 fi
2171         else
2172                 export SK_PATH=$OLD_SK_PATH
2173                 keyctl show | awk '/lustre/ { print $1 }' |
2174                         xargs -IX keyctl unlink X
2175         fi
2176 }
2177 run_test 29 "check for missing shared key"
2178
2179 test_30() {
2180         if ! $SHARED_KEY; then
2181                 skip "need shared key feature for this test" && return
2182         fi
2183         if [ $SK_FLAVOR != "ski" ] && [ $SK_FLAVOR != "skpi" ]; then
2184                 skip "test only valid if integrity is active"
2185         fi
2186         mkdir -p $DIR/$tdir || error "mkdir failed"
2187         touch $DIR/$tdir/$tdir.out || error "touch failed"
2188         zconf_umount_clients ${clients_arr[0]} $MOUNT ||
2189                 error "unable to umount clients"
2190         # unload keys from ring
2191         keyctl show | awk '/lustre/ { print $1 }' |
2192                 xargs -IX keyctl unlink X
2193         # invalidate the key with bogus filesystem name
2194         lgss_sk -w $SK_PATH/$FSNAME-bogus.key -f $FSNAME.bogus \
2195                 -t client -d /dev/urandom || error "lgss_sk failed (1)"
2196         do_facet $SINGLEMDS lfs flushctx || error "could not run flushctx"
2197         OLD_SK_PATH=$SK_PATH
2198         export SK_PATH=$SK_PATH/$FSNAME-bogus.key
2199         if zconf_mount_clients ${clients_arr[0]} $MOUNT; then
2200                 SK_PATH=$OLD_SK_PATH
2201                 if [ -a $DIR/$tdir/$tdir.out ]; then
2202                         error "mount and read file with invalid key"
2203                 else
2204                         error "mount with invalid key"
2205                 fi
2206         fi
2207         SK_PATH=$OLD_SK_PATH
2208         zconf_umount_clients ${clients_arr[0]} $MOUNT ||
2209                 error "unable to umount clients"
2210 }
2211 run_test 30 "check for invalid shared key"
2212
2213 cleanup_31() {
2214         # unmount client
2215         zconf_umount $HOSTNAME $MOUNT || error "unable to umount client"
2216
2217         # remove ${NETTYPE}999 network on all nodes
2218         do_nodes $(comma_list $(all_nodes)) \
2219                  "$LNETCTL net del --net ${NETTYPE}999 && \
2220                   $LNETCTL lnet unconfigure 2>/dev/null || true"
2221
2222         # necessary to do writeconf in order to de-register
2223         # @${NETTYPE}999 nid for targets
2224         KZPOOL=$KEEP_ZPOOL
2225         export KEEP_ZPOOL="true"
2226         stopall
2227         export SK_MOUNTED=false
2228         writeconf_all
2229         setupall || echo 1
2230         export KEEP_ZPOOL="$KZPOOL"
2231 }
2232
2233 test_31() {
2234         local nid=$(lctl list_nids | grep ${NETTYPE} | head -n1)
2235         local addr=${nid%@*}
2236         local net=${nid#*@}
2237
2238         export LNETCTL=$(which lnetctl 2> /dev/null)
2239
2240         [ -z "$LNETCTL" ] && skip "without lnetctl support." && return
2241         local_mode && skip "in local mode."
2242
2243         stack_trap cleanup_31 EXIT
2244
2245         # umount client
2246         if [ "$MOUNT_2" ] && $(grep -q $MOUNT2' ' /proc/mounts); then
2247                 umount_client $MOUNT2 || error "umount $MOUNT2 failed"
2248         fi
2249         if $(grep -q $MOUNT' ' /proc/mounts); then
2250                 umount_client $MOUNT || error "umount $MOUNT failed"
2251         fi
2252
2253         # check exports on servers are empty for client
2254         do_facet mgs "lctl get_param -n *.MGS*.exports.'$nid'.uuid 2>/dev/null |
2255                       grep -q -" && error "export on MGS should be empty"
2256         do_nodes $(comma_list $(mdts_nodes) $(osts_nodes)) \
2257                  "lctl get_param -n *.${FSNAME}*.exports.'$nid'.uuid \
2258                   2>/dev/null | grep -q -" &&
2259                 error "export on servers should be empty"
2260
2261         # add network ${NETTYPE}999 on all nodes
2262         do_nodes $(comma_list $(all_nodes)) \
2263                  "$LNETCTL lnet configure && $LNETCTL net add --if \
2264                   \$($LNETCTL net show --net $net | awk 'BEGIN{inf=0} \
2265                   {if (inf==1) print \$2; fi; inf=0} /interfaces/{inf=1}') \
2266                   --net ${NETTYPE}999" ||
2267                 error "unable to configure NID ${NETTYPE}999"
2268
2269         # necessary to do writeconf in order to register
2270         # new @${NETTYPE}999 nid for targets
2271         KZPOOL=$KEEP_ZPOOL
2272         export KEEP_ZPOOL="true"
2273         stopall
2274         export SK_MOUNTED=false
2275         writeconf_all
2276         setupall server_only || echo 1
2277         export KEEP_ZPOOL="$KZPOOL"
2278
2279         # backup MGSNID
2280         local mgsnid_orig=$MGSNID
2281         # compute new MGSNID
2282         MGSNID=$(do_facet mgs "$LCTL list_nids | grep ${NETTYPE}999")
2283
2284         # on client, turn LNet Dynamic Discovery on
2285         lnetctl set discovery 1
2286
2287         # mount client with -o network=${NETTYPE}999 option:
2288         # should fail because of LNet Dynamic Discovery
2289         mount_client $MOUNT ${MOUNT_OPTS},network=${NETTYPE}999 &&
2290                 error "client mount with '-o network' option should be refused"
2291
2292         # on client, reconfigure LNet and turn LNet Dynamic Discovery off
2293         $LNETCTL net del --net ${NETTYPE}999 && lnetctl lnet unconfigure
2294         lustre_rmmod
2295         modprobe lnet
2296         lnetctl set discovery 0
2297         modprobe ptlrpc
2298         $LNETCTL lnet configure && $LNETCTL net add --if \
2299           $($LNETCTL net show --net $net | awk 'BEGIN{inf=0} \
2300           {if (inf==1) print $2; fi; inf=0} /interfaces/{inf=1}') \
2301           --net ${NETTYPE}999 ||
2302         error "unable to configure NID ${NETTYPE}999 on client"
2303
2304         # mount client with -o network=${NETTYPE}999 option
2305         mount_client $MOUNT ${MOUNT_OPTS},network=${NETTYPE}999 ||
2306                 error "unable to remount client"
2307
2308         # restore MGSNID
2309         MGSNID=$mgsnid_orig
2310
2311         # check export on MGS
2312         do_facet mgs "lctl get_param -n *.MGS*.exports.'$nid'.uuid 2>/dev/null |
2313                       grep -q -"
2314         [ $? -ne 0 ] || error "export for $nid on MGS should not exist"
2315
2316         do_facet mgs \
2317                 "lctl get_param -n *.MGS*.exports.'${addr}@${NETTYPE}999'.uuid \
2318                  2>/dev/null | grep -q -"
2319         [ $? -eq 0 ] ||
2320                 error "export for ${addr}@${NETTYPE}999 on MGS should exist"
2321
2322         # check {mdc,osc} imports
2323         lctl get_param mdc.${FSNAME}-*.import | grep current_connection |
2324             grep -q ${NETTYPE}999
2325         [ $? -eq 0 ] ||
2326                 error "import for mdc should use ${addr}@${NETTYPE}999"
2327         lctl get_param osc.${FSNAME}-*.import | grep current_connection |
2328             grep -q ${NETTYPE}999
2329         [ $? -eq 0 ] ||
2330                 error "import for osc should use ${addr}@${NETTYPE}999"
2331 }
2332 run_test 31 "client mount option '-o network'"
2333
2334 cleanup_32() {
2335         # umount client
2336         zconf_umount_clients ${clients_arr[0]} $MOUNT
2337
2338         # disable sk flavor enforcement on MGS
2339         set_rule _mgs any any null
2340
2341         # stop gss daemon on MGS
2342         if ! combined_mgs_mds ; then
2343                 send_sigint $mgs_HOST lsvcgssd
2344         fi
2345
2346         # re-mount client
2347         MOUNT_OPTS=$(add_sk_mntflag $MOUNT_OPTS)
2348         mountcli
2349
2350         restore_to_default_flavor
2351 }
2352
2353 test_32() {
2354         if ! $SHARED_KEY; then
2355                 skip "need shared key feature for this test"
2356         fi
2357
2358         stack_trap cleanup_32 EXIT
2359
2360         # restore to default null flavor
2361         save_flvr=$SK_FLAVOR
2362         SK_FLAVOR=null
2363         restore_to_default_flavor || error "cannot set null flavor"
2364         SK_FLAVOR=$save_flvr
2365
2366         # umount client
2367         if [ "$MOUNT_2" ] && $(grep -q $MOUNT2' ' /proc/mounts); then
2368                 umount_client $MOUNT2 || error "umount $MOUNT2 failed"
2369         fi
2370         if $(grep -q $MOUNT' ' /proc/mounts); then
2371         umount_client $MOUNT || error "umount $MOUNT failed"
2372         fi
2373
2374         # start gss daemon on MGS
2375         if combined_mgs_mds ; then
2376                 send_sigint $mds_HOST lsvcgssd
2377         fi
2378         start_gss_daemons $mgs_HOST "$LSVCGSSD -vvv -s -g"
2379
2380         # add mgs key type and MGS NIDs in key on MGS
2381         do_nodes $mgs_HOST "lgss_sk -t mgs,server -g $MGSNID -m \
2382                                 $SK_PATH/$FSNAME.key >/dev/null 2>&1" ||
2383                 error "could not modify keyfile on MGS"
2384
2385         # load modified key file on MGS
2386         do_nodes $mgs_HOST "lgss_sk -l $SK_PATH/$FSNAME.key >/dev/null 2>&1" ||
2387                 error "could not load keyfile on MGS"
2388
2389         # add MGS NIDs in key on client
2390         do_nodes ${clients_arr[0]} "lgss_sk -g $MGSNID -m \
2391                                 $SK_PATH/$FSNAME.key >/dev/null 2>&1" ||
2392                 error "could not modify keyfile on MGS"
2393
2394         # set perms for per-nodemap keys else permission denied
2395         do_nodes $(comma_list $(all_nodes)) \
2396                  "keyctl show | grep lustre | cut -c1-11 |
2397                                 sed -e 's/ //g;' |
2398                                 xargs -IX keyctl setperm X 0x3f3f3f3f"
2399
2400         # re-mount client with mgssec=skn
2401         save_opts=$MOUNT_OPTS
2402         if [ -z "$MOUNT_OPTS" ]; then
2403                 MOUNT_OPTS="-o mgssec=skn"
2404         else
2405                 MOUNT_OPTS="$MOUNT_OPTS,mgssec=skn"
2406         fi
2407         zconf_mount_clients ${clients_arr[0]} $MOUNT $MOUNT_OPTS ||
2408                 error "mount ${clients_arr[0]} with mgssec=skn failed"
2409         MOUNT_OPTS=$save_opts
2410
2411         # umount client
2412         zconf_umount_clients ${clients_arr[0]} $MOUNT ||
2413                 error "umount ${clients_arr[0]} failed"
2414
2415         # enforce ska flavor on MGS
2416         set_rule _mgs any any ska
2417
2418         # re-mount client without mgssec
2419         zconf_mount_clients ${clients_arr[0]} $MOUNT $MOUNT_OPTS &&
2420                 error "mount ${clients_arr[0]} without mgssec should fail"
2421
2422         # re-mount client with mgssec=skn
2423         save_opts=$MOUNT_OPTS
2424         if [ -z "$MOUNT_OPTS" ]; then
2425                 MOUNT_OPTS="-o mgssec=skn"
2426         else
2427                 MOUNT_OPTS="$MOUNT_OPTS,mgssec=skn"
2428         fi
2429         zconf_mount_clients ${clients_arr[0]} $MOUNT $MOUNT_OPTS &&
2430                 error "mount ${clients_arr[0]} with mgssec=skn should fail"
2431         MOUNT_OPTS=$save_opts
2432
2433         # re-mount client with mgssec=ska
2434         save_opts=$MOUNT_OPTS
2435         if [ -z "$MOUNT_OPTS" ]; then
2436                 MOUNT_OPTS="-o mgssec=ska"
2437         else
2438                 MOUNT_OPTS="$MOUNT_OPTS,mgssec=ska"
2439         fi
2440         zconf_mount_clients ${clients_arr[0]} $MOUNT $MOUNT_OPTS ||
2441                 error "mount ${clients_arr[0]} with mgssec=ska failed"
2442         MOUNT_OPTS=$save_opts
2443
2444         exit 0
2445 }
2446 run_test 32 "check for mgssec"
2447
2448 cleanup_33() {
2449         # disable sk flavor enforcement
2450         set_rule $FSNAME any cli2mdt null
2451         wait_flavor cli2mdt null
2452
2453         # umount client
2454         zconf_umount_clients ${clients_arr[0]} $MOUNT
2455
2456         # stop gss daemon on MGS
2457         if ! combined_mgs_mds ; then
2458                 send_sigint $mgs_HOST lsvcgssd
2459         fi
2460
2461         # re-mount client
2462         MOUNT_OPTS=$(add_sk_mntflag $MOUNT_OPTS)
2463         mountcli
2464
2465         restore_to_default_flavor
2466 }
2467
2468 test_33() {
2469         if ! $SHARED_KEY; then
2470                 skip "need shared key feature for this test"
2471         fi
2472
2473         stack_trap cleanup_33 EXIT
2474
2475         # restore to default null flavor
2476         save_flvr=$SK_FLAVOR
2477         SK_FLAVOR=null
2478         restore_to_default_flavor || error "cannot set null flavor"
2479         SK_FLAVOR=$save_flvr
2480
2481         # umount client
2482         if [ "$MOUNT_2" ] && $(grep -q $MOUNT2' ' /proc/mounts); then
2483                 umount_client $MOUNT2 || error "umount $MOUNT2 failed"
2484         fi
2485         if $(grep -q $MOUNT' ' /proc/mounts); then
2486         umount_client $MOUNT || error "umount $MOUNT failed"
2487         fi
2488
2489         # start gss daemon on MGS
2490         if combined_mgs_mds ; then
2491                 send_sigint $mds_HOST lsvcgssd
2492         fi
2493         start_gss_daemons $mgs_HOST "$LSVCGSSD -vvv -s -g"
2494
2495         # add mgs key type and MGS NIDs in key on MGS
2496         do_nodes $mgs_HOST "lgss_sk -t mgs,server -g $MGSNID -m \
2497                                 $SK_PATH/$FSNAME.key >/dev/null 2>&1" ||
2498                 error "could not modify keyfile on MGS"
2499
2500         # load modified key file on MGS
2501         do_nodes $mgs_HOST "lgss_sk -l $SK_PATH/$FSNAME.key >/dev/null 2>&1" ||
2502                 error "could not load keyfile on MGS"
2503
2504         # add MGS NIDs in key on client
2505         do_nodes ${clients_arr[0]} "lgss_sk -g $MGSNID -m \
2506                                 $SK_PATH/$FSNAME.key >/dev/null 2>&1" ||
2507                 error "could not modify keyfile on MGS"
2508
2509         # set perms for per-nodemap keys else permission denied
2510         do_nodes $(comma_list $(all_nodes)) \
2511                  "keyctl show | grep lustre | cut -c1-11 |
2512                                 sed -e 's/ //g;' |
2513                                 xargs -IX keyctl setperm X 0x3f3f3f3f"
2514
2515         # re-mount client with mgssec=skn
2516         save_opts=$MOUNT_OPTS
2517         if [ -z "$MOUNT_OPTS" ]; then
2518                 MOUNT_OPTS="-o mgssec=skn"
2519         else
2520                 MOUNT_OPTS="$MOUNT_OPTS,mgssec=skn"
2521         fi
2522         zconf_mount_clients ${clients_arr[0]} $MOUNT $MOUNT_OPTS ||
2523                 error "mount ${clients_arr[0]} with mgssec=skn failed"
2524         MOUNT_OPTS=$save_opts
2525
2526         # enforce ska flavor for cli2mdt
2527         set_rule $FSNAME any cli2mdt ska
2528         wait_flavor cli2mdt ska
2529
2530         # check error message
2531         $LCTL dk | grep "faked source" &&
2532                 error "MGS connection srpc flags incorrect"
2533
2534         exit 0
2535 }
2536 run_test 33 "correct srpc flags for MGS connection"
2537
2538 cleanup_34_deny() {
2539         # restore deny_unknown
2540         do_facet mgs $LCTL nodemap_modify --name default \
2541                            --property deny_unknown --value $denydefault
2542         if [ $? -ne 0 ]; then
2543                 error_noexit "cannot reset deny_unknown on default nodemap"
2544                 return
2545         fi
2546
2547         wait_nm_sync default deny_unknown
2548 }
2549
2550 test_34() {
2551         local denynew
2552         local activedefault
2553
2554         [ $MGS_VERSION -lt $(version_code 2.12.51) ] &&
2555                 skip "deny_unknown on default nm not supported before 2.12.51"
2556
2557         activedefault=$(do_facet mgs $LCTL get_param -n nodemap.active)
2558
2559         if [[ "$activedefault" != "1" ]]; then
2560                 do_facet mgs $LCTL nodemap_activate 1
2561                 wait_nm_sync active
2562                 stack_trap cleanup_active EXIT
2563         fi
2564
2565         denydefault=$(do_facet mgs $LCTL get_param -n \
2566                       nodemap.default.deny_unknown)
2567         [ -z "$denydefault" ] &&
2568                 error "cannot get deny_unknown on default nodemap"
2569         if [ "$denydefault" -eq 0 ]; then
2570                 denynew=1;
2571         else
2572                 denynew=0;
2573         fi
2574
2575         do_facet mgs $LCTL nodemap_modify --name default \
2576                         --property deny_unknown --value $denynew ||
2577                 error "cannot set deny_unknown on default nodemap"
2578
2579         [ "$(do_facet mgs $LCTL get_param -n nodemap.default.deny_unknown)" \
2580                         -eq $denynew ] ||
2581                 error "setting deny_unknown on default nodemap did not work"
2582
2583         stack_trap cleanup_34_deny EXIT
2584
2585         wait_nm_sync default deny_unknown
2586 }
2587 run_test 34 "deny_unknown on default nodemap"
2588
2589 log "cleanup: ======================================================"
2590
2591 sec_unsetup() {
2592         for num in $(seq $MDSCOUNT); do
2593                 if [ "${identity_old[$num]}" = 1 ]; then
2594                         switch_identity $num false || identity_old[$num]=$?
2595                 fi
2596         done
2597
2598         $RUNAS_CMD -u $ID0 ls $DIR
2599         $RUNAS_CMD -u $ID1 ls $DIR
2600 }
2601 sec_unsetup
2602
2603 complete $SECONDS
2604 check_and_cleanup_lustre
2605 exit_status