]> git.ipfire.org Git - thirdparty/mdadm.git/blame - tests/utils
super1: Avoid if and return on the same line
[thirdparty/mdadm.git] / tests / utils
CommitLineData
97691508
AC
1# set of functions used to test policy framework with assemble, incremental and Monitor
2
3set +e
4#create links to be able to use domains
5for d in 0 1 2 3 4 5 6 7 8 9 10 11 12
6do
7 eval ln -s \$dev$d /dev/disk/by-path/loop$d
8 eval d$d="loop$d"
9 eval mdadm --zero-superblock \$dev$d
10done
11
12devices="/dev/loop[0-9] /dev/loop10 /dev/loop11 /dev/loop12"
13
14# on failure print out few things before exit
15# uses testdsc and platform global variables
16err(){
17 echo >&2 "ERROR: $*"
ed02d9cc 18 cat $config >&2 || true
97691508
AC
19 cat /proc/mdstat >&2
20 [ -z "$testdsc" ] || { echo >&2 $platform: $testdsc "- failed"; }
21 ps -e | grep mdadm >&2 || true
22 if [ $listfailed == "yes" ]; then
23 [ "$verbose" != "yes" ] || echo ---FAILED---
24 flist="$flist \n $platform $testdsc"
25 failed=1
26 else
27 exit 1
28 fi
29}
30
31# set test description
32dsc(){
33 failed=0
34 testdsc="$*"
35 [ "$verbose" != "yes" ] || echo $testdsc
36}
37
38killmonitor(){
39 [ -z "$monitorpid" ] || { kill -9 $monitorpid; unset monitorpid; }
40}
41
42tidyup(){
43 killmonitor
44 mdadm -Ss || true
45 mdadm -Ss
46 mdadm --zero-superblock $devices || true
47 udevadm settle
ed02d9cc 48 rm -f $config
97691508
AC
49}
50
51trap tidyup 0 1 2 3 15
52
53# create a RAID 1 array or container and subarray(s) on 2 disks
54# if platform not specified imsm is used
55# if subsize is given, first subarray is created with given size and second one on remaining space
56ccv(){
57 # mddevno used to name created array
58 local mddevno="$1"
59 # numbers of devices to be used in array
60 local devno1="$2"
61 local devno2="$3"
62 local platform="$4"
63 local subsize="$5"
64 local onearray="$6"
65 [ -n "$platform" ] || platform="imsm"
66 if [ "$platform" == "imsm" ] || [ "$platform" == "ddf" ]; then
67 eval mdadm -CR /dev/md/con$mddevno -e $platform -n 2 \$dev$devno1 \$dev$devno2
68 udevadm settle
69 [ -z "$subsize" ] || eval mdadm -CR sub$mddevno"_" -l 1 -n 2 /dev/md/con$mddevno -z $subsize
70 [ -n "$onearray" ] || eval mdadm -CR sub$mddevno -l 1 -n 2 /dev/md/con$mddevno
71 else
72 [ -z "$subsize" ] || sizepar="-z $subsize"
73 eval mdadm -CR arr$mddevno -e $platform -l 1 -n 2 \$dev$devno1 \$dev$devno2 $sizepar
74 unset sizepar
75 fi
76}
77
78# get container and subarray using given device from mdstat
79# sets global variables c and v
80getarray(){
81 local devname=`basename $1`
82 local platformtype=`grep -A 1 $devname /proc/mdstat | awk '/active/ {getline; print $4 }' | awk -F ":" 'END {print $1}'`
83 c=`grep "inactive.*$devname" /proc/mdstat | awk -F " " '{print $1}'`
84 v=`grep " active.*$devname" /proc/mdstat | awk -F " " '{print $1}'`
85 [ "$platformtype" == "external" ] || c=$v
86}
87
88# check if given device belongs to any container and subarray
89# if $2 given then only container checked
90chkarray(){
91 local devname="$1"
92 local subcheck="$2"
93 getarray $devname
94 [ -n "$c" ] || err "$devname not in any container"
95 [ -n "$subcheck" ] || [ -n "$v" ] || err " $devname not in subarray"
96}
97
98# test if two devices in the same container/subarray
99# $1 $2 - devices
100# $3 don't check subarrays, only containers
101tst(){
102 local device1=`basename $1`
103 local device2=`basename $2`
104 local subcheck="$3"
105 chkarray $device1 $subcheck
106 local x="$c"
107 local y="$v"
108 chkarray $device2 $subcheck
109 [ "$c" == "$x" ] || err "$device1 and $device2 not in the same container"
110 [ -n "$subcheck" ] || [ "$v" == "$y" ] || err "$device1 and $device2 not in the same subarray"
111}
112
113# same as tst, just use numbers of devices instead of names as parameters
114dtst(){
115 local devno1="$1"
116 local devno2="$2"
117 local subcheck="$3"
118 eval tst \$dev$devno1 \$dev$devno2 $subcheck
119}
120
121# create containers/subarrays, check if created properly,
122# set global variables c$mddevno v$mddevno, usually c0=md127, v0=md126 , etc.
123setupdevs(){
124 local mddevno="$1"
125 local devno1="$2"
126 local devno2="$3"
127 local p="$4"
128 local subsize="$5"
129 local onearray="$6"
130 [ -n "$p" ] || p=$platform
131 ccv $mddevno $devno1 $devno2 $p $subsize $onearray
132 dtst $devno1 $devno2
133 eval c$mddevno=\"$c\"
134 eval v$mddevno=\"$v\"
135}
136
137# check if given spare in container
138# usage: chkspare container spare [n] (n if spare shouldn't be in container)
139chkspare(){
140 local container=`basename $1`
141 local spare=$2
142 local expected=$3
143 getarray $spare
144 [ -n "$expected" ] || expected="y"
145 if [ "$expected" == "y" ]; then
146 [ "$c" == "$container" ] || err "$spare not in container $container"
147 else
148 [ "$c" != "$container" ] || err "$spare in container $container"
149 fi
150}
151
152#check if spare was moved from one container to another
153# args: from_container to_container spare [yn]
154# n when spare should remain in original container
155chksparemoved(){
156 sleep $sleeptime
157 from_container="$1"
158 to_container="$2"
159 spare="$3"
160 expected="$4"
161 [ -n "$expected" ] || expected="y"
162 notexpected="n"; [ "$expected" == "y" ] || notexpected="y"
163 chkspare $from_container $spare $notexpected
164 [ $failed -eq 1 ] || chkspare $to_container $spare $expected
165}
166
167
168# for domains defined through policy
169createconfig(){
97691508
AC
170if [ "$1" != "a" ]; then
171{
172 domain=$1
173 metadata=$2
174 action=$3
175 while [ -n "$4" ]; do
176 echo="policy domain=$domain"
177 [ "$metadata" == "noplatform" ] || echo="$echo metadata=$metadata"
178 echo="$echo path=loop$4"
179 echo="$echo action=$action"
180 echo "$echo"
181 shift
182 done
ed02d9cc 183} >> $config
97691508
AC
184else
185{
186 echo "DEVICES $devlist /dev/md1*"
187 mdadm -Ebs
ed02d9cc 188} > $config
97691508 189fi
ed02d9cc 190#[ "$verbose" != "yes" ] || cat $config | grep policy || true
97691508 191}