Whamcloud - gitweb
b=2623
[fs/lustre-release.git] / lustre / tests / conf-sanity.sh
1 #!/bin/bash
2 # requirement:
3 #       add uml1 uml2 uml3 in your /etc/hosts
4
5 set -e
6
7 SRCDIR=`dirname $0`
8 PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH
9
10 LUSTRE=${LUSTRE:-`dirname $0`/..}
11 RLUSTRE=${RLUSTRE:-$LUSTRE}
12
13 . $LUSTRE/tests/test-framework.sh
14
15 init_test_env $@
16
17 . ${CONFIG:=$LUSTRE/tests/cfg/local.sh}
18
19 FORCE=${FORCE:-" --force"}
20
21 if [ "$VERBOSE" == "true" ]; then
22         CMDVERBOSE=""
23 else
24         CMDVERBOSE=" > /dev/null"
25 fi
26
27 gen_config() {
28         rm -f $XMLCONFIG
29
30         add_mds mds --dev $MDSDEV --size $MDSSIZE
31         add_lov lov1 mds --stripe_sz $STRIPE_BYTES\
32             --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
33         add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE
34         add_client client mds --lov lov1 --path $MOUNT
35 }
36
37 gen_second_config() {
38         rm -f $XMLCONFIG
39
40         add_mds mds2 --dev $MDSDEV --size $MDSSIZE
41         add_lov lov2 mds2 --stripe_sz $STRIPE_BYTES\
42             --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
43         add_ost ost2 --lov lov2 --dev $OSTDEV --size $OSTSIZE
44         add_client client mds2 --lov lov2 --path $MOUNT2
45 }
46
47 start_mds() {
48         echo "start mds service on `facet_active_host mds`"
49         start mds --reformat $MDSLCONFARGS $CMDVERBOSE || return 94
50 }
51 stop_mds() {
52         echo "stop mds service on `facet_active_host mds`"
53         stop mds $@ $CMDVERBOSE || return 97 
54 }
55
56 start_ost() {
57         echo "start ost service on `facet_active_host ost`"
58         start ost --reformat $OSTLCONFARGS $CMDVERBOSE || return 95
59 }
60
61 stop_ost() {
62         echo "stop ost service on `facet_active_host ost`"
63         stop ost $@ $CMDVERBOSE || return 98 
64 }
65
66 mount_client() {
67         local MOUNTPATH=$1
68         echo "mount lustre on ${MOUNTPATH}....."
69         zconf_mount $MOUNTPATH $CMDVERBOSE || return 96
70 }
71
72 umount_client() {
73         local MOUNTPATH=$1
74         echo "umount lustre on ${MOUNTPATH}....."
75         zconf_umount $MOUNTPATH $CMDVERBOSE || return 97
76 }
77
78 manual_umount_client(){
79         echo "manual umount lustre on ${MOUNTPATH}...."
80         do_facet  client "umount $MOUNT"
81 }
82
83 setup() {
84         start_ost
85         start_mds
86         mount_client $MOUNT 
87 }
88
89 cleanup() {
90         umount_client $MOUNT || return 200
91         stop_mds  || return 201
92         stop_ost || return 202
93         # catch case where these return just fine, but modules are still not unloaded
94         /sbin/lsmod | grep -q portals 
95         if [ 1 -ne $? ]; then
96                 echo "modules still loaded..."
97                 return 203
98         fi
99 }
100
101 check_mount() {
102         do_facet client "touch $DIR/a" || return 71     
103         do_facet client "rm $DIR/a" || return 72        
104         echo "setup single mount lustre success"
105 }
106
107 check_mount2() {
108         do_facet client "touch $DIR/a" || return 71     
109         do_facet client "rm $DIR/a" || return 72        
110         do_facet client "touch $DIR2/a" || return 73    
111         do_facet client "rm $DIR2/a" || return 74       
112         echo "setup double mount lustre success"
113 }
114
115 build_test_filter
116
117 #create single point mountpoint
118
119 gen_config
120
121
122 test_0() {
123         start_ost
124         start_mds       
125         mount_client $MOUNT  
126         check_mount || return 41
127         cleanup || return $?
128 }
129 run_test 0 "single mount setup"
130
131 test_1() {
132         start_ost
133         echo "start ost second time..."
134         start ost --reformat $OSTLCONFARGS $CMDVERBOSE 
135         start_mds       
136         mount_client $MOUNT
137         check_mount || return 42
138         cleanup || return $?
139 }
140 run_test 1 "start up ost twice"
141
142 test_2() {
143         start_ost
144         start_mds       
145         echo "start mds second time.."
146         start mds --reformat $MDSLCONFARGS $CMDVERBOSE 
147         
148         mount_client $MOUNT  
149         check_mount || return 43
150         cleanup || return $?
151 }
152 run_test 2 "start up mds twice"
153
154 test_3() {
155         setup
156         mount_client $MOUNT
157
158         check_mount || return 44
159         
160         umount_client $MOUNT    
161         cleanup  || return $?
162 }
163 run_test 3 "mount client twice"
164
165 test_4() {
166         setup
167         touch $DIR/$tfile || return 85
168         stop_ost ${FORCE}
169         cleanup 
170         eno=$?
171         # ok for ost to fail shutdown
172         if [ 202 -ne $eno ]; then
173                 return $eno;
174         fi
175         return 0
176 }
177 run_test 4 "force cleanup ost, then cleanup"
178
179 test_5() {
180         setup
181         touch $DIR/$tfile || return 86
182         stop_mds ${FORCE} || return 98
183         cleanup 
184         eno=$?
185         # ok for mds to fail shutdown
186         if [ 201 -ne $eno ]; then
187                 return $eno;
188         fi
189         return 0
190 }
191 run_test 5 "force cleanup mds, then cleanup"
192
193 test_6() {
194         setup
195         manual_umount_client
196         mount_client ${MOUNT} || return 87
197         touch $DIR/a || return 86
198         cleanup  || return $?
199 }
200 run_test 6 "manual umount, then mount again"
201
202 test_7() {
203         setup
204         manual_umount_client
205         cleanup || return $?
206 }
207 run_test 7 "manual umount, then cleanup"
208
209 test_8() {
210         start_ost
211         start_mds
212
213         mount_client $MOUNT  
214         mount_client $MOUNT2 
215
216         check_mount2 || return 45
217         umount $MOUNT
218         umount_client $MOUNT2  
219         
220         stop_mds
221         stop_ost
222 }
223 run_test 8 "double mount setup"
224
225 test_9() {
226         # backup the old values of PTLDEBUG and SUBSYSTEM
227         OLDPTLDEBUG=$PTLDEBUG
228         OLDSUBSYSTEM=$SUBSYSTEM
229         
230         # generate new configuration file with lmc --ptldebug and --subsystem
231         PTLDEBUG="trace"
232         SUBSYSTEM="mdc"
233         gen_config
234
235         # check the result of lmc --ptldebug/subsystem
236         start_ost
237         start_mds
238         mount_client $MOUNT
239         CHECK_PTLDEBUG="`cat /proc/sys/portals/debug`"
240         if [ $CHECK_PTLDEBUG = "1" ]; then
241            echo "lmc --debug success"
242         else
243            echo "lmc --debug: want 1, have $CHECK_PTLDEBUG"
244            return 1
245         fi
246         CHECK_SUBSYSTEM="`cat /proc/sys/portals/subsystem_debug`"
247         if [ $CHECK_SUBSYSTEM = "2" ]; then
248            echo "lmc --subsystem success"
249         else
250            echo "lmc --subsystem: want 2, have $CHECK_SUBSYSTEM"
251            return 1
252         fi
253         check_mount || return 41
254         cleanup || return $?
255
256         # the new PTLDEBUG/SUBSYSTEM used for lconf --ptldebug/subsystem
257         PTLDEBUG="inode+trace"
258         SUBSYSTEM="mds+ost"
259
260         # check lconf --ptldebug/subsystem overriding lmc --ptldebug/subsystem
261         start_ost
262         start_mds
263         CHECK_PTLDEBUG="`do_facet mds cat /proc/sys/portals/debug`"
264         if [ $CHECK_PTLDEBUG = "3" ]; then
265            echo "lconf --debug success"
266         else
267            echo "lconf --debug: want 3, have $CHECK_PTLDEBUG"
268            return 1
269         fi
270         CHECK_SUBSYSTEM="`do_facet mds cat /proc/sys/portals/subsystem_debug`"
271         if [ $CHECK_SUBSYSTEM = "20" ]; then
272            echo "lconf --subsystem success"
273         else
274            echo "lconf --subsystem: want 20, have $CHECK_SUBSYSTEM"
275            return 1
276         fi
277         mount_client $MOUNT
278         check_mount || return 41
279         cleanup || return $?
280
281         # resume the old configuration
282         PTLDEBUG=$OLDPTLDEBUG
283         SUBSYSTEM=$OLDSUBSYSTEM
284         gen_config
285 }
286
287 run_test 9 "test --ptldebug and --subsystem for lmc and lconf"
288
289 test_10() {
290         OLDXMLCONFIG=$XMLCONFIG
291         XMLCONFIG="broken.xml"
292         [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
293         SAMENAME="mds1"
294         do_lmc --add node --node $SAMENAME
295         do_lmc --add net --node $SAMENAME --nid $SAMENAME --nettype tcp
296         do_lmc --add mds --node $SAMENAME --mds $SAMENAME --nid $SAMENAME \
297                --fstype ext3 --dev /dev/mds1 || return $?
298         do_lmc --add lov --lov lov1 --mds $SAMENAME --stripe_sz 65536 \
299                --stripe_cnt 1 --stripe_pattern 0 || return $?
300         echo "Success!"
301         XMLCONFIG=$OLDXMLCONFIG
302 }
303 run_test 10 "use lmc with the same name for node and mds"
304
305 test_11() {
306         OLDXMLCONFIG=$XMLCONFIG
307         XMLCONFIG="conf11.xml"
308
309         [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
310         add_mds mds --dev $MDSDEV --size $MDSSIZE
311         add_ost ost --dev $OSTDEV --size $OSTSIZE
312         add_client client mds --path $MOUNT --ost ost_svc || return $?
313         echo "Default lov config success!"
314         
315         [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
316         add_mds mds --dev $MDSDEV --size $MDSSIZE
317         add_ost ost --dev $OSTDEV --size $OSTSIZE
318         add_client client mds --path $MOUNT && return $?
319         echo "--add mtpt with neither --lov nor --ost will return error"
320
321         echo ""
322         echo "Success!"
323         XMLCONFIG=$OLDXMLCONFIG
324 }
325 run_test 11 "use default lov configuration (should return error)"
326
327 test_12() {
328         OLDXMLCONFIG=$XMLCONFIG
329         XMLCONFIG="batch.xml"
330         BATCHFILE="batchfile"
331
332         # test double quote
333         [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
334         [ -f "$BATCHFILE" ] && rm -f $BATCHFILE
335         echo "--add net --node  localhost --nid localhost.localdomain --nettype tcp" > $BATCHFILE
336         echo "--add mds --node localhost --mds mds1 --mkfsoptions \"-I 128\"" >> $BATCHFILE
337         # --mkfsoptions "-I 128"
338         do_lmc -m $XMLCONFIG --batch $BATCHFILE || return $?
339         if [ `sed -n '/>-I 128</p' $XMLCONFIG | wc -l` -eq 1 ]; then
340                 echo "matched double quote success"
341         else
342                 echo "matched double quote fail"
343                 return 1
344         fi 
345         rm -f $XMLCONFIG
346         rm -f $BATCHFILE
347         echo "--add net --node  localhost --nid localhost.localdomain --nettype tcp" > $BATCHFILE
348         echo "--add mds --node localhost --mds mds1 --mkfsoptions \"-I 128" >> $BATCHFILE
349         # --mkfsoptions "-I 128
350         do_lmc -m $XMLCONFIG --batch $BATCHFILE && return $?
351         echo "unmatched double quote should return error"
352
353         # test single quote
354         rm -f $BATCHFILE
355         echo "--add net --node  localhost --nid localhost.localdomain --nettype tcp" > $BATCHFILE
356         echo "--add mds --node localhost --mds mds1 --mkfsoptions '-I 128'" >> $BATCHFILE
357         # --mkfsoptions '-I 128'
358         do_lmc -m $XMLCONFIG --batch $BATCHFILE || return $?
359         if [ `sed -n '/>-I 128</p' $XMLCONFIG | wc -l` -eq 1 ]; then
360                 echo "matched single quote success"
361         else
362                 echo "matched single quote fail"
363                 return 1
364         fi
365         rm -f $XMLCONFIG
366         rm -f $BATCHFILE
367         echo "--add net --node  localhost --nid localhost.localdomain --nettype tcp" > $BATCHFILE
368         echo "--add mds --node localhost --mds mds1 --mkfsoptions '-I 128" >> $BATCHFILE
369         # --mkfsoptions '-I 128
370         do_lmc -m $XMLCONFIG --batch $BATCHFILE && return $?
371         echo "unmatched single quote should return error"
372
373         # test backslash
374         rm -f $BATCHFILE
375         echo "--add net --node  localhost --nid localhost.localdomain --nettype tcp" > $BATCHFILE
376         echo "--add mds --node localhost --mds mds1 --mkfsoptions \-\I\ \128" >> $BATCHFILE
377         # --mkfsoptions \-\I\ \128
378         do_lmc -m $XMLCONFIG --batch $BATCHFILE || return $?
379         if [ `sed -n '/>-I 128</p' $XMLCONFIG | wc -l` -eq 1 ]; then
380                 echo "backslash followed by a whitespace/letter success"
381         else
382                 echo "backslash followed by a whitespace/letter fail"
383                 return 1
384         fi
385         rm -f $XMLCONFIG
386         rm -f $BATCHFILE
387         echo "--add net --node  localhost --nid localhost.localdomain --nettype tcp" > $BATCHFILE
388         echo "--add mds --node localhost --mds mds1 --mkfsoptions -I\ 128\\" >> $BATCHFILE
389         # --mkfsoptions -I\ 128\
390         do_lmc -m $XMLCONFIG --batch $BATCHFILE && return $?
391         echo "backslash followed by nothing should return error"
392
393         rm -f $BATCHFILE
394         XMLCONFIG=$OLDXMLCONFIG
395 }
396 run_test 12 "lmc --batch, with single/double quote, backslash in batchfile"
397
398 test_13() {
399         OLDXMLCONFIG=$XMLCONFIG
400         XMLCONFIG="conf13-1.xml"
401         SECONDXMLCONFIG="conf13-2.xml"
402
403         # check long uuid will be truncated properly and uniquely
404         echo "To generate XML configuration file(with long ost name): $XMLCONFIG"
405         [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
406         do_lmc --add net --node localhost --nid localhost.localdomain --nettype tcp
407         do_lmc --add mds --node localhost --mds mds1_name_longer_than_31characters
408         do_lmc --add mds --node localhost --mds mds2_name_longer_than_31characters
409         if [ ! -f "$XMLCONFIG" ]; then
410                 echo "Error:no file $XMLCONFIG created!"
411                 return 1
412         fi
413         EXPECTEDMDS1UUID="e_longer_than_31characters_UUID"
414         EXPECTEDMDS2UUID="longer_than_31characters_UUID_2"
415         FOUNDMDS1UUID=`awk -F"'" '/<mds uuid=/{print $2}' $XMLCONFIG | sed -n '1p'`
416         FOUNDMDS2UUID=`awk -F"'" '/<mds uuid=/{print $2}' $XMLCONFIG | sed -n '2p'`
417         if [ $EXPECTEDMDS1UUID != $FOUNDMDS1UUID ]; then
418                 echo "Error:expected uuid for mds1: $EXPECTEDMDS1UUID; found: $FOUNDMDS1UUID"
419                 return 1
420         fi
421         if [ $EXPECTEDMDS2UUID != $FOUNDMDS2UUID ]; then
422                 echo "Error:expected uuid for mds2: $EXPECTEDMDS2UUID; found: $FOUNDMDS2UUID"
423                 return 1
424         fi
425         echo "Success:long uuid truncated successfully and being unique."
426
427         # check multiple invocations for lmc generate same XML configuration file
428         rm -f $XMLCONFIG
429         echo "Generate the first XML configuration file"
430         gen_config
431         echo "mv $XMLCONFIG to $SECONDXMLCONFIG"
432         mv $XMLCONFIG $SECONDXMLCONFIG || return $?
433         echo "Generate the second XML configuration file"
434         gen_config
435         if [ `diff $XMLCONFIG $SECONDXMLCONFIG | wc -l` -eq 0 ]; then
436                 echo "Success:multiple invocations for lmc generate same XML file"
437         else
438                 echo "Error: multiple invocations for lmc generate different XML file"
439                 return 1
440         fi
441
442         rm -f $XMLCONFIG
443         rm -f $SECONDXMLCONFIG
444         XMLCONFIG=$OLDXMLCONFIG
445 }
446 run_test 13 "check new_uuid of lmc operating correctly"
447
448 test_14() {
449         rm -f $XMLCONFIG
450
451         # create xml file with --mkfsoptions for ost
452         echo "create xml file with --mkfsoptions for ost"
453         add_mds mds --dev $MDSDEV --size $MDSSIZE
454         add_lov lov1 mds --stripe_sz $STRIPE_BYTES\
455             --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
456         add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE \
457             --mkfsoptions -V
458         add_client client mds --lov lov1 --path $MOUNT
459
460         FOUNDSTRING=`awk -F"<" '/<mkfsoptions>/{print $2}' $XMLCONFIG`
461         EXPECTEDSTRING="mkfsoptions>-V"
462         if [ $EXPECTEDSTRING != $FOUNDSTRING ]; then
463                 echo "Error:expected string: $EXPECTEDSTRING; found: $FOUNDSTRING"
464                 return 1
465         fi
466         echo "Success:mkfsoptions for ost written to xml file correctly."
467
468         # mount lustre to test lconf mkfsoptions-parsing
469         echo "mount lustre"
470         start_ost
471         start_mds
472         mount_client $MOUNT || return $?
473         cleanup
474         echo "lconf mkfsoptions-parsing for ost success"
475
476         gen_config
477 }
478 run_test 14 "test mkfsoptions of ost for lmc and lconf"
479
480 equals_msg "Done"