Whamcloud - gitweb
LU-8648 all: remove all Sun license and URL references
[fs/lustre-release.git] / lustre-iokit / obdfilter-survey / iokit-libecho
1 #!/bin/bash
2 # -*- mode: Bash; tab-width: 4; indent-tabs-mode: t; -*-
3 # vim:shiftwidth=4:softtabstop=4:tabstop=4:
4 #
5 # GPL HEADER START
6 #
7 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8 #
9 # This program is free software; you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License version 2 only,
11 # as published by the Free Software Foundation.
12 #
13 # This program is distributed in the hope that it will be useful, but
14 # WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 # General Public License version 2 for more details (a copy is included
17 # in the LICENSE file that accompanied this code).
18 #
19 # You should have received a copy of the GNU General Public License
20 # version 2 along with this program; If not, see
21 # http://www.gnu.org/licenses/gpl-2.0.html
22 #
23 # GPL HEADER END
24 #
25 # Copyright  2008 Sun Microsystems, Inc. All rights reserved
26 # Use is subject to license terms.
27 #
28 # Copyright (c) 2012, 2014, Intel Corporation.
29 #
30 # This file is part of Lustre, http://www.lustre.org/
31 # Lustre is a trademark of Sun Microsystems, Inc.
32 #
33 # Author: Jitendra Pawar <jitendra@clusterfs.com>
34
35
36 # binaries
37 lsmod="/sbin/lsmod"
38 modprobe="/sbin/modprobe"
39 insmod="/sbin/insmod"
40 rmmod="/sbin/rmmod"
41
42 declare -a ost_names
43 declare -a client_names
44 declare -a host_list
45 declare -a dev_list
46 declare -a unique_hosts
47 declare count
48 declare -a vmstatpids
49 declare -a do_unload_echo
50
51
52 DSH=${DSH:-"ssh"}
53 NETTYPE=${NETTYPE:-tcp}
54
55 dsh () {
56     local node="$1"
57     local user="$2"
58     shift 2
59     local command="$@"
60
61     command="export PATH=/sbin:/usr/sbin:\$PATH; $command"
62
63     case $DSH in
64         ssh)
65                 if [ -n "$user" ]; then
66                         user="$user@"
67                 fi
68                 $DSH $user$node "$command"
69                 ;;
70         rsh)
71                 if [ -n "$user" ]; then
72                         user="-l $user"
73                 fi
74                 $DSH $user $node "$command"
75                 ;;
76     esac
77 }
78
79 # how to run commands on other nodes
80 # You need to make this work on your cluster if you have specified
81 # non-local obd instances above
82 remote_shell () {
83     host=$1
84     shift
85     cmds="$@"
86     if [ "$host" = "localhost" -o "$host" = `uname -n` ]; then
87                 eval "$cmds"
88     else
89                 # split $host into $host and $user
90                 local user=""
91                 if [[ $host == *@* ]]; then
92                         user=${host%@*}
93                         host=${host#*@}
94                 fi
95                 dsh $host "$user" "$cmds"
96         fi
97 }
98
99 # checks whether obdecho module is loded on given host.
100 # parameter: 1. hostname
101 obdecho_loaded() {
102     local host=$1
103     remote_shell $host $lsmod | grep obdecho > /dev/null 2>&1
104 }
105
106 # load obdecho.ko or obdecho.o module on host kernel.
107 load_obdecho () {
108     local index=$1
109     local host=${unique_hosts[$index]}
110
111     do_unload_echo[$index]=0
112     if obdecho_loaded $host; then
113         return 0
114     fi
115     if [ -z "$lustre_root" ]; then
116         remote_shell $host $modprobe obdecho
117     elif [ -f ${lustre_root}/obdecho/obdecho.ko ]; then
118         remote_shell $host $insmod ${lustre_root}/obdecho/obdecho.ko
119     else
120         remote_shell $host $insmod ${lustre_root}/obdecho/obdecho.o
121     fi
122     if obdecho_loaded $host; then
123         do_unload_echo[$index]=1
124     else
125         echo Could not install obdecho on $host
126         return 1
127     fi
128     return 0
129 }
130
131 load_obdechos () {
132         for ((i = 0; i < ${#unique_hosts[@]}; i++)); do
133                 load_obdecho $i || cleanup 1
134         done
135 }
136
137 # unload obdecho module from host kernel.
138 unload_obdecho () {
139     local index=$1
140     local host=${unique_hosts[$index]}
141     if ((${do_unload_echo[$index]})); then
142         remote_shell $host $rmmod obdecho
143         do_unload_echo[$index]=0
144     fi
145 }
146
147 # returns the device number which is displayed in "lctl device_list"
148 #
149 # parameter: 1. hostname
150 #            2. type of device ex: echo_client
151 #            3. name of device ex: ECHO_matrix.linsyssoft.com
152 get_devno () {
153     local host=$1
154     local type=$2
155     local name=$3
156
157     remote_shell $host $lctl device_list |
158                 awk "{if (\$2 == \"UP\" && \$3 == \"$type\" && \$4 == \"$name\") {\
159                   print \$1; exit}}"
160 }
161
162 get_devnos () {
163     local i=0
164     local host
165     for ((i = 0; i < $count; i++)); do
166         ost=${ost_names[$i]}
167         host=${host_list[$i]}
168         dev=$(get_devno $host obdfilter $ost)
169         dev_list[$i]=$dev
170         if [ -z "$dev" ]; then
171                         echo "Cannot find device for $ost on $host"
172             return 1
173         fi
174     done
175     return 0
176 }
177
178 # do cleanup for netdisk case.
179 cleanup_netdisk () {
180         for osc in $@; do
181                 $lctl <<-EOF
182                         cfg_device $osc
183                         cleanup
184                         detach
185                 EOF
186         done
187 }
188
189 # do cleanup for network case.
190 cleanup_network () {
191         local clean_srv_OSS=$1
192
193         $lctl <<-EOF
194                 cfg_device echotmp
195                 cleanup
196                 detach
197         EOF
198         remote_shell "root@$server_nid" \
199         "$lctl <<-EOF
200                 cfg_device echo_srv
201                 cleanup
202                 detach
203         EOF"
204         if [ $clean_srv_OSS ]; then
205                 remote_shell "root@$server_nid" \
206                 "$lctl <<-EOF
207                         cfg_device OSS
208                         cleanup
209                         detach
210                 EOF"
211         fi
212 }
213
214 # do cleanup and exit.
215 cleanup () {
216         local exit_status=$1
217         local host
218
219         case=${case:-"disk"}
220         shift
221         for ((i = 0; i < $ndevs; i++)); do
222                 host=${host_names[$i]}
223                 if [[ -n "${do_teardown_ec[$i]}" ]]; then
224                         teardown_ec_devno $host ${client_names[$i]}
225                 fi
226         done
227         pidcount=0
228         for ((i = 0; i < ${#unique_hosts[@]}; i++)); do
229                 host=${unique_hosts[$i]}
230                 remote_shell $host "killall -q vmstat >/dev/null 2>&1" &
231                 pid=$!
232                 kill -term ${vmstatpids[$pidcount]} 2>/dev/null
233                 kill -kill ${vmstatpids[$pidcount]} 2>/dev/null
234                 wait $pid
235                 pidcount=$((pidcount + 1))
236                 if ((${do_unload_echo[$i]})); then
237                         unload_obdecho $i
238                 fi
239         done
240         if [ $case == "network" ]; then
241                 cleanup_network $1
242         fi
243         if [ $case == "netdisk" ]; then
244                 shift
245                 cleanup_netdisk $@
246         fi
247         if [ $exit_status ]; then
248                 if [ $exit_status -ne 0 ]; then
249                 echo "program exited with error "
250                 else
251                 echo "done!"
252                 fi
253         else
254                 echo "Terminated"
255         fi
256         exit $exit_status
257 }
258 trap 'cleanup 0 $clean_srv_OSS $cleanup_oscs' SIGHUP SIGINT SIGTERM
259
260 # gets echoclient device number and attach it to the client UUID
261 # Results are  returned by an echo followed by an exit
262 # This must run in a subshell.
263 #
264 # parameter: 1. hostname
265 #            2. client name, ex:- ns8:ECHO_ns8
266 #            3. name of ost instances, ex:- lustre-OST0001
267 get_ec_devno () {
268         exec 8>&1 1>&2
269         local host=$1
270         local client_name="$2"
271         local ost_name="$3"
272         local dev_type="${4:-obdfilter}"
273         local stack_type="${5:-}"
274
275         if [ -z "$client_name" ]; then
276                 if [ -z "$ost_name" ]; then
277                         echo "client and ost name both null"
278                         exit 1
279                 fi
280                 client_name=${ost_name}_ecc
281         fi
282         ec=$(get_devno $host echo_client $client_name)
283         if [ -n "$ec" ]; then
284                 echo $ec $client_name $client_name >&8
285                 exit 0
286         fi
287         if [ -z "$ost_name" ]; then
288                 echo "no echo client and ost_name not set, client:" \
289                         "$client_name, host: $host"
290                 exit 1
291         fi
292         ost=$(get_devno $host $dev_type $ost_name)
293         if [ -z "$ost" ]; then
294                 echo "OST $ost_name not setup"
295                 exit 1
296         fi
297         client_name=${ost_name}_ecc
298         remote_shell $host \
299                 "$lctl <<-EOF
300                         attach echo_client $client_name ${client_name}_UUID
301                         setup $ost_name $stack_type
302                 EOF"
303         ec=$(get_devno $host echo_client $client_name)
304         if [ -z "$ec" ]; then
305                 echo "Can't setup echo-client"
306                 exit 1
307         fi
308         echo $ec $client_name 1 >&8
309         exit 0
310 }
311
312 # Create echo-clients using osc_names and osc_uuid
313 # It creates echoclients for all osc listed using #lctl device_list command
314 ec_using_osc () {
315         local osc_name=$1
316
317         $lctl <<-EOF
318                 attach echo_client ${osc_name}_ecc ${osc_name}_ecc_UUID
319                 cfg_device ${osc_name}_ecc
320                 setup $osc_name
321         EOF
322
323 }
324
325 # create echo client using server nid.
326 ec_using_srv_nid () {
327         local server_nid=$1
328         local ocsname=$2
329         local oscuuid=$3
330
331         $lctl add_uuid echo_UUID $server_nid@$NETTYPE >/dev/null 2>&1
332         $lctl <<-EOF
333                 attach osc $ocsname $oscuuid
334                 cfg_device $ocsname
335                 setup echo_srv_UUID echo_UUID
336         EOF
337         $lctl <<-EOF
338                 attach echo_client ${ocsname}_ecc $oscuuid
339                 setup $ocsname
340         EOF
341 }
342
343 setup_osc_for_remote_ost () {
344         local ost_nid=$1
345         local obdfilter_name=$2
346         local host_name=host_$3
347
348         $lctl add_uuid ${host_name}_UUID $ost_nid@$NETTYPE >/dev/null 2>&1
349         $lctl <<-EOF
350                 attach osc ${obdfilter_name}_osc ${obdfilter_name}_osc_UUID
351                 cfg_device ${obdfilter_name}_osc
352                 setup ${obdfilter_name}_UUID ${host_name}_UUID
353         EOF
354 }
355
356 # setup obdecho on server
357 setup_srv_obd () {
358         local server_nid=$1
359         local test_ostfsnm=$2
360
361         remote_shell "root@$server_nid" \
362         "$lctl <<-EOF
363                 attach obdecho $test_ostfsnm ${test_ostfsnm}_UUID
364                 cfg_device $test_ostfsnm
365                 setup
366         EOF"
367 }
368
369 # setup OSS on server
370 setup_OSS () {
371         local server_nid=$1
372
373         remote_shell "root@$server_nid" \
374         "$lctl <<-EOF
375                 attach ost OSS OSS_UUID
376                 cfg_device OSS
377                 setup
378         EOF"
379 }
380
381 # cleanup and detach the echo-clients that we have created during the test.
382 # parameter: 1. hostname
383 #            2. client name, ex:- ns8:ECHO_ns8
384 teardown_ec_devno () {
385         local host=$1
386         local client_name=$2
387
388         remote_shell $host \
389         "$lctl <<-EOF
390                 cfg $client_name
391                 cleanup
392                 detach
393         EOF"
394 }
395
396 unique () {
397         echo "$@" | xargs -n1 echo | sort -u
398 }
399
400 split_hostname () {
401         local name=$1
402
403         case $name in
404         *:*) host=$(echo $name | sed 's/:.*$//')
405                 name=$(echo $name | sed 's/[^:]*://')
406                 ;;
407         *)   host=localhost
408                 ;;
409         esac
410         echo "$host $name"
411 }
412
413 check_cleanup () {
414         local type_obj="$1"
415         local osc_names_str=$($lctl dl | grep $type_obj)
416         local count=0;
417
418         for name in $osc_names_str; do
419                 count=$((count + 1))
420         done
421
422         if [ $count != 0 ]; then
423                 echo "$type_obj could not be cleanup";
424                 exit 0;
425         fi
426
427 }
428
429 check_setup () {
430         local type_obj="$1"
431         local osc_names_str=$($lctl dl | grep $type_obj)
432         local count=0;
433
434         for name in $osc_names_str; do
435                 count=$((count + 1))
436                         done
437
438         if [ $count == 0 ]; then
439                 echo "$type_obj could not be setup";
440                 exit 0;
441         fi
442
443 }
444
445 # added from bugzill req.
446 get_targets () {
447         if [ -z "$ost_names" ]; then
448                 targets=$($lctl device_list | awk "{if (\$2 == \"UP\" && \
449                           \$3 == \"obdfilter\") {print \$4} }")
450         fi
451         if [ -z "$targets" ]; then
452                 echo "Can't find any OSTs to test.  Please set targets=..."
453                 exit 1
454         fi
455
456         local count=0
457         for name in $targets; do
458                 ost_names[$count]=$name
459                 str=($(split_hostname $name))
460                 host_names[$count]=${str[0]}
461                 count=$((count + 1))
462         done
463 }
464
465 get_hosts () {
466         # split out hostnames from ost names
467         for ((i = 0; i < count; i++)); do
468                 local str=($(split_hostname ${targets[$i]}))
469                 host_list[$i]=${str[0]}
470                 ost_names[$i]=${str[1]}
471         done
472 }