t_raid.sh revision 1.14 1 #! /usr/bin/atf-sh
2 # $NetBSD: t_raid.sh,v 1.14 2019/07/10 06:10:54 martin Exp $
3 #
4 # Copyright (c) 2010 The NetBSD Foundation, Inc.
5 # All rights reserved.
6 #
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions
9 # are met:
10 # 1. Redistributions of source code must retain the above copyright
11 # notice, this list of conditions and the following disclaimer.
12 # 2. Redistributions in binary form must reproduce the above copyright
13 # notice, this list of conditions and the following disclaimer in the
14 # documentation and/or other materials provided with the distribution.
15 #
16 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 # POSSIBILITY OF SUCH DAMAGE.
27 #
28
29 rawpart=`sysctl -n kern.rawpartition | tr '01234' 'abcde'`
30 rawraid=/dev/rraid0${rawpart}
31 raidserver="rump_server -lrumpvfs -lrumpdev -lrumpdev_disk -lrumpdev_raidframe"
32
33 makecfg()
34 {
35 level=${1}
36 ncol=${2}
37
38 printf "START array\n${ncol} 0\nSTART disks\n" > raid.conf
39 diskn=0
40 while [ ${ncol} -gt ${diskn} ] ; do
41 echo "/disk${diskn}" >> raid.conf
42 diskn=$((diskn+1))
43 done
44
45 printf "START layout\n32 1 1 ${level}\nSTART queue\nfifo 100\n" \
46 >> raid.conf
47 }
48
49 makecfg_old()
50 {
51 level=${1}
52 ncol=${2}
53
54 printf "START array\n1 ${ncol} 0\nSTART disks\n" > raid.conf
55 diskn=0
56 while [ ${ncol} -gt ${diskn} ] ; do
57 echo "/disk${diskn}" >> raid.conf
58 diskn=$((diskn+1))
59 done
60
61 printf "START layout\n32 1 1 ${level}\nSTART queue\nfifo 100\n" \
62 >> raid.conf
63 }
64
65 atf_test_case smalldisk cleanup
66 smalldisk_head()
67 {
68 atf_set "descr" "Checks the raidframe works on small disks " \
69 "(PR kern/44239)"
70 atf_set "require.progs" "rump_server"
71 }
72
73 smalldisk_body_backend()
74 {
75 export RUMP_SERVER=unix://sock
76 atf_check -s exit:0 ${raidserver} \
77 -d key=/disk0,hostpath=disk0.img,size=1m \
78 -d key=/disk1,hostpath=disk1.img,size=1m \
79 ${RUMP_SERVER}
80
81 atf_check -s exit:0 rump.raidctl -C raid.conf raid0
82 }
83
84 smalldisk_body()
85 {
86 makecfg 1 2
87 smalldisk_body_backend
88 }
89
90 smalldisk_cleanup()
91 {
92 export RUMP_SERVER=unix://sock
93 rump.halt
94 }
95
96 # The old configuration test case uses the smalldisk backend
97 atf_test_case old_numrows_config cleanup
98 old_numrows_config_head()
99 {
100 atf_set "descr" "Checks the old numRows configuration works"
101 atf_set "require.progs" "rump_server"
102 }
103
104 old_numrows_config_body()
105 {
106 makecfg_old 1 2
107 smalldisk_body_backend
108 }
109
110 old_numrows_config_cleanup()
111 {
112 export RUMP_SERVER=unix://sock
113 rump.halt
114 }
115
116 export RAID_MEDIASIZE=4m
117
118 atf_test_case raid1_compfail cleanup
119 raid1_compfail_head()
120 {
121 atf_set "descr" "Checks that RAID1 works after component failure"
122 atf_set "require.progs" "rump_server"
123 }
124
125 raid1_compfail_body()
126 {
127 makecfg 1 2
128 export RUMP_SERVER=unix://sock
129 atf_check -s exit:0 ${raidserver} \
130 -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
131 -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
132 ${RUMP_SERVER}
133
134 atf_check -s exit:0 rump.raidctl -C raid.conf raid0
135 atf_check -s exit:0 rump.raidctl -I 12345 raid0
136 atf_check -s exit:0 -o ignore rump.raidctl -iv raid0
137
138 # put some data there
139 atf_check -s exit:0 -e ignore \
140 dd if=$(atf_get_srcdir)/t_raid of=testfile count=4
141 atf_check -s exit:0 -e ignore -x \
142 "dd if=testfile | rump.dd of=${rawraid} conv=sync"
143
144 # restart server with failed component
145 rump.halt
146 rm disk1.img # FAIL
147 atf_check -s exit:0 ${raidserver} \
148 -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
149 -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
150 ${RUMP_SERVER}
151
152 atf_check -s exit:0 rump.raidctl -c raid.conf raid0
153
154 # check if we we get what we wrote
155 atf_check -s exit:0 -o file:testfile -e ignore \
156 rump.dd if=${rawraid} count=4
157 }
158
159 raid1_compfail_cleanup()
160 {
161 export RUMP_SERVER=unix://sock
162 rump.halt
163 }
164
165
166
167 atf_test_case raid1_comp0fail cleanup
168 raid1_comp0fail_head()
169 {
170 atf_set "descr" "Checks configuring RAID1 after component 0 fails" \
171 "(PR kern/44251)"
172 atf_set "require.progs" "rump_server"
173 }
174
175 raid1_comp0fail_body()
176 {
177 makecfg 1 2
178 export RUMP_SERVER=unix://sock
179 atf_check -s exit:0 ${raidserver} \
180 -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
181 -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
182 ${RUMP_SERVER}
183
184 atf_check -s exit:0 rump.raidctl -C raid.conf raid0
185 atf_check -s exit:0 rump.raidctl -I 12345 raid0
186 atf_check -s exit:0 -o ignore rump.raidctl -iv raid0
187
188 # restart server with failed component
189 rump.halt
190 rm disk0.img # FAIL
191 atf_check -s exit:0 ${raidserver} \
192 -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
193 -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
194 ${RUMP_SERVER}
195
196 atf_check -s exit:0 rump.raidctl -c raid.conf raid0
197 }
198
199 raid1_comp0fail_cleanup()
200 {
201 export RUMP_SERVER=unix://sock
202 rump.halt
203 }
204
205 atf_test_case raid1_normal cleanup
206 raid1_normal_head()
207 {
208 atf_set "descr" "Checks that RAID1 -c configurations work " \
209 "in the normal case"
210 atf_set "require.progs" "rump_server"
211 }
212
213 raid1_normal_body()
214 {
215 makecfg 1 2
216 export RUMP_SERVER=unix://sock
217 atf_check -s exit:0 ${raidserver} \
218 -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
219 -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
220 ${RUMP_SERVER}
221
222 atf_check -s exit:0 rump.raidctl -C raid.conf raid0
223 atf_check -s exit:0 rump.raidctl -I 12345 raid0
224 atf_check -s exit:0 -o ignore rump.raidctl -iv raid0
225
226 # put some data there
227 atf_check -s exit:0 -e ignore \
228 dd if=$(atf_get_srcdir)/t_raid of=testfile count=4
229 atf_check -s exit:0 -e ignore -x \
230 "dd if=testfile | rump.dd of=${rawraid} conv=sync"
231
232 # restart server, disks remain normal
233 rump.halt
234
235 atf_check -s exit:0 ${raidserver} \
236 -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
237 -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
238 ${RUMP_SERVER}
239
240 atf_check -s exit:0 rump.raidctl -c raid.conf raid0
241
242 # check if we we get what we wrote
243 atf_check -s exit:0 -o file:testfile -e ignore \
244 rump.dd if=${rawraid} count=4
245
246 }
247
248 raid1_normal_cleanup()
249 {
250 export RUMP_SERVER=unix://sock
251 rump.halt
252 }
253
254
255 atf_test_case raid5_compfail cleanup
256 raid5_compfail_head()
257 {
258 atf_set "descr" "Checks that RAID5 works after component failure"
259 atf_set "require.progs" "rump_server"
260 }
261
262 raid5_compfail_body()
263 {
264 makecfg 5 3
265 export RUMP_SERVER=unix://sock
266 atf_check -s exit:0 ${raidserver} \
267 -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
268 -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
269 -d key=/disk2,hostpath=disk2.img,size=${RAID_MEDIASIZE} \
270 ${RUMP_SERVER}
271
272 atf_check -s exit:0 rump.raidctl -C raid.conf raid0
273 atf_check -s exit:0 rump.raidctl -I 12345 raid0
274 atf_check -s exit:0 -o ignore rump.raidctl -iv raid0
275
276 # put some data there
277 atf_check -s exit:0 -e ignore \
278 dd if=$(atf_get_srcdir)/t_raid of=testfile count=4
279 atf_check -s exit:0 -e ignore -x \
280 "dd if=testfile | rump.dd of=${rawraid} conv=sync"
281
282 # restart server with failed component
283 rump.halt
284 rm disk2.img # FAIL
285 atf_check -s exit:0 ${raidserver} \
286 -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
287 -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
288 -d key=/disk2,hostpath=disk2.img,size=${RAID_MEDIASIZE} \
289 ${RUMP_SERVER}
290
291 atf_check -s exit:0 rump.raidctl -c raid.conf raid0
292
293 # check if we we get what we wrote
294 atf_check -s exit:0 -o file:testfile -e ignore \
295 rump.dd if=${rawraid} count=4
296 }
297
298 raid5_compfail_cleanup()
299 {
300 export RUMP_SERVER=unix://sock
301 rump.halt
302 }
303
304 atf_test_case raid5_normal cleanup
305 raid5_normal_head()
306 {
307 atf_set "descr" "Checks that RAID5 works after normal shutdown " \
308 "and 'raidctl -c' startup"
309 atf_set "require.progs" "rump_server"
310 }
311
312 raid5_normal_body()
313 {
314 makecfg 5 3
315 export RUMP_SERVER=unix://sock
316 atf_check -s exit:0 ${raidserver} \
317 -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
318 -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
319 -d key=/disk2,hostpath=disk2.img,size=${RAID_MEDIASIZE} \
320 ${RUMP_SERVER}
321
322 atf_check -s exit:0 rump.raidctl -C raid.conf raid0
323 atf_check -s exit:0 rump.raidctl -I 12345 raid0
324 atf_check -s exit:0 -o ignore rump.raidctl -iv raid0
325
326 # put some data there
327 atf_check -s exit:0 -e ignore \
328 dd if=$(atf_get_srcdir)/t_raid of=testfile count=4
329 atf_check -s exit:0 -e ignore -x \
330 "dd if=testfile | rump.dd of=${rawraid} conv=sync"
331
332 # restart server after normal shutdown
333 rump.halt
334
335 atf_check -s exit:0 ${raidserver} \
336 -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
337 -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
338 -d key=/disk2,hostpath=disk2.img,size=${RAID_MEDIASIZE} \
339 ${RUMP_SERVER}
340
341 atf_check -s exit:0 rump.raidctl -c raid.conf raid0
342
343 # check if we we get what we wrote
344 atf_check -s exit:0 -o file:testfile -e ignore \
345 rump.dd if=${rawraid} count=4
346 }
347
348 raid5_normal_cleanup()
349 {
350 export RUMP_SERVER=unix://sock
351 rump.halt
352 }
353
354 atf_init_test_cases()
355 {
356 atf_add_test_case smalldisk
357 atf_add_test_case old_numrows_config
358 atf_add_test_case raid1_normal
359 atf_add_test_case raid1_comp0fail
360 atf_add_test_case raid1_compfail
361 atf_add_test_case raid5_normal
362 atf_add_test_case raid5_compfail
363 }
364