2 # -*- mode: Bash; tab-width: 4; indent-tabs-mode: t; -*-
3 # vim:shiftwidth=4:softtabstop=4:tabstop=4:
7 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
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.
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).
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
25 # Copyright 2008 Sun Microsystems, Inc. All rights reserved
26 # Use is subject to license terms.
28 # Copyright (c) 2012, 2017, Intel Corporation.
30 # This file is part of Lustre, http://www.lustre.org/
32 # Author: Jitendra Pawar <jitendra@clusterfs.com>
37 modprobe="/sbin/modprobe"
42 declare -a client_names
45 declare -a unique_hosts
48 declare -a do_unload_echo
52 NETTYPE=${NETTYPE:-tcp}
60 command="export PATH=/sbin:/usr/sbin:\$PATH; $command"
64 if [ -n "$user" ]; then
67 $DSH $user$node "$command"
70 if [ -n "$user" ]; then
73 $DSH $user $node "$command"
78 # how to run commands on other nodes
79 # You need to make this work on your cluster if you have specified
80 # non-local obd instances above
85 if [ "$host" = "localhost" -o "$host" = `uname -n` ]; then
88 # split $host into $host and $user
90 if [[ $host == *@* ]]; then
94 dsh $host "$user" "$cmds"
98 # checks whether obdecho module is loded on given host.
99 # parameter: 1. hostname
102 remote_shell $host $lsmod | grep obdecho > /dev/null 2>&1
105 # load obdecho.ko or obdecho.o module on host kernel.
108 local host=${unique_hosts[$index]}
110 do_unload_echo[$index]=0
111 if obdecho_loaded $host; then
114 if [ -z "$lustre_root" ]; then
115 remote_shell $host $modprobe obdecho
116 elif [ -f ${lustre_root}/obdecho/obdecho.ko ]; then
117 remote_shell $host $insmod ${lustre_root}/obdecho/obdecho.ko
119 remote_shell $host $insmod ${lustre_root}/obdecho/obdecho.o
121 if obdecho_loaded $host; then
122 do_unload_echo[$index]=1
124 echo Could not install obdecho on $host
131 for ((i = 0; i < ${#unique_hosts[@]}; i++)); do
132 load_obdecho $i || cleanup 1
136 # unload obdecho module from host kernel.
139 local host=${unique_hosts[$index]}
140 if ((${do_unload_echo[$index]})); then
141 remote_shell $host $rmmod obdecho
142 do_unload_echo[$index]=0
146 # returns the device number which is displayed in "lctl device_list"
148 # parameter: 1. hostname
149 # 2. type of device ex: echo_client
150 # 3. name of device ex: ECHO_matrix.linsyssoft.com
156 remote_shell $host $LCTL device_list |
157 awk "{if (\$2 == \"UP\" && \$3 == \"$type\" && \$4 == \"$name\") {\
164 for ((i = 0; i < $count; i++)); do
166 host=${host_list[$i]}
167 dev=$(get_devno $host obdfilter $ost)
169 if [ -z "$dev" ]; then
170 echo "Cannot find device for $ost on $host"
177 # do cleanup for network case.
179 local clean_srv_OSS=$1
182 --device echotmp cleanup
183 --device echotmp detach
185 remote_shell "root@$server_nid" \
187 --device echo_srv cleanup
188 --device echo_srv detach
190 if [ $clean_srv_OSS ]; then
191 remote_shell "root@$server_nid" \
199 # do cleanup and exit.
208 for ((i = 0; i < $ndevs; i++)); do
209 host=${host_names[$i]}
210 if [[ -n "${do_teardown_ec[$i]}" ]]; then
211 teardown_ec_devno $host ${client_names[$i]}
215 for ((i = 0; i < ${#unique_hosts[@]}; i++)); do
216 host=${unique_hosts[$i]}
217 remote_shell $host "killall -q vmstat >/dev/null 2>&1" &
219 kill -term ${vmstatpids[$pidcount]} 2>/dev/null
220 kill -kill ${vmstatpids[$pidcount]} 2>/dev/null
222 pidcount=$((pidcount + 1))
223 if ((${do_unload_echo[$i]})); then
227 if [ $case == "network" ]; then
230 if [ $exit_status ]; then
231 if [ $exit_status -ne 0 ]; then
232 echo "program exited with error "
241 trap 'cleanup 0 $clean_srv_OSS' EXIT SIGHUP SIGINT SIGTERM
243 # gets echoclient device number and attach it to the client UUID
244 # Results are returned by an echo followed by an exit
245 # This must run in a subshell.
247 # parameter: 1. hostname
248 # 2. client name, ex:- ns8:ECHO_ns8
249 # 3. name of ost instances, ex:- lustre-OST0001
253 local client_name="$2"
255 local dev_type="${4:-obdfilter}"
256 local stack_type="${5:-}"
258 if [ -z "$client_name" ]; then
259 if [ -z "$ost_name" ]; then
260 echo "client and ost name both null"
263 client_name=${ost_name}_ecc
265 ec=$(get_devno $host echo_client $client_name)
266 if [ -n "$ec" ]; then
267 echo $ec $client_name $client_name >&8
270 if [ -z "$ost_name" ]; then
271 echo "no echo client and ost_name not set, client:" \
272 "$client_name, host: $host"
275 ost=$(get_devno $host $dev_type $ost_name)
276 if [ -z "$ost" ]; then
277 echo "OST $ost_name not setup"
280 client_name=${ost_name}_ecc
281 # Only 'attach' if '{client_name}_uuid' not already present
282 if ! [[ $($LCTL dl) =~ $client_name ]]; then
285 attach echo_client $client_name \
287 setup $ost_name $stack_type
290 ec=$(get_devno $host echo_client $client_name)
291 if [ -z "$ec" ]; then
292 echo "Can't setup echo-client"
295 echo $ec $client_name 1 >&8
299 # create echo client using server nid.
300 ec_using_srv_nid () {
305 $LCTL add_uuid echo_UUID $server_nid@$NETTYPE >/dev/null 2>&1
307 attach osc $oscname $oscuuid
308 --device $oscname setup echo_srv_UUID echo_UUID
311 attach echo_client ${oscname}_ecc $oscuuid
312 --device ${oscname}_ecc setup $oscname
316 # setup obdecho on server
319 local test_ostfsnm=$2
321 remote_shell "root@$server_nid" \
323 attach obdecho $test_ostfsnm ${test_ostfsnm}_UUID
324 --device $test_ostfsnm setup
328 # setup OSS on server
332 remote_shell "root@$server_nid" \
334 attach ost OSS OSS_UUID
339 # cleanup and detach the echo-clients that we have created during the test.
340 # parameter: 1. hostname
341 # 2. client name, ex:- ns8:ECHO_ns8
342 teardown_ec_devno () {
348 --device $client_name cleanup
349 --device $client_name detach
354 echo "$@" | xargs -n1 echo | sort -u
361 *:*) host=$(echo $name | sed 's/:.*$//')
362 name=$(echo $name | sed 's/[^:]*://')
372 local osc_names_str=$($LCTL dl | grep $type_obj)
375 for name in $osc_names_str; do
379 if [ $count != 0 ]; then
380 echo "$type_obj could not be cleanup";
388 local osc_names_str=$($LCTL dl | grep $type_obj)
391 for name in $osc_names_str; do
395 if [ $count == 0 ]; then
396 echo "$type_obj could not be setup";
402 # added from bugzill req.
404 if [ -z "$ost_names" ]; then
405 targets=$($LCTL device_list | awk "{if (\$2 == \"UP\" && \
406 \$3 == \"obdfilter\") {print \$4} }")
408 if [ -z "$targets" ]; then
409 echo "Can't find any OSTs to test. Please set targets=..."
414 for name in $targets; do
415 ost_names[$count]=$name
416 str=($(split_hostname $name))
417 host_names[$count]=${str[0]}
423 # split out hostnames from ost names
424 for ((i = 0; i < count; i++)); do
425 local str=($(split_hostname ${targets[$i]}))
426 host_list[$i]=${str[0]}
427 ost_names[$i]=${str[1]}