1#! /usr/bin/atf-sh
2#	$NetBSD: t_raid.sh,v 1.12 2013/02/19 21:08:24 joerg 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
29rawpart=`sysctl -n kern.rawpartition | tr '01234' 'abcde'`
30rawraid=/dev/rraid0${rawpart}
31raidserver="rump_server -lrumpvfs -lrumpdev -lrumpdev_disk -lrumpdev_raidframe"
32
33makecfg()
34{
35	level=${1}
36	ncol=${2}
37
38	printf "START array\n1 ${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
49atf_test_case smalldisk cleanup
50smalldisk_head()
51{
52	atf_set "descr" "Checks the raidframe works on small disks " \
53	    "(PR kern/44239)"
54	atf_set "require.progs" "rump_server"
55}
56
57smalldisk_body()
58{
59	makecfg 1 2
60	export RUMP_SERVER=unix://sock
61	atf_check -s exit:0 ${raidserver}			\
62	    -d key=/disk0,hostpath=disk0.img,size=1m		\
63	    -d key=/disk1,hostpath=disk1.img,size=1m		\
64	    ${RUMP_SERVER}
65
66	atf_check -s exit:0 rump.raidctl -C raid.conf raid0
67}
68
69smalldisk_cleanup()
70{
71	export RUMP_SERVER=unix://sock
72	rump.halt
73}
74
75
76# make this smaller once 44239 is fixed
77export RAID_MEDIASIZE=32m
78
79atf_test_case raid1_compfail cleanup
80raid1_compfail_head()
81{
82	atf_set "descr" "Checks that RAID1 works after component failure"
83	atf_set "require.progs" "rump_server"
84}
85
86raid1_compfail_body()
87{
88	makecfg 1 2
89	export RUMP_SERVER=unix://sock
90	atf_check -s exit:0 ${raidserver}				\
91	    -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE}	\
92	    -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE}	\
93	    ${RUMP_SERVER}
94
95	atf_check -s exit:0 rump.raidctl -C raid.conf raid0
96	atf_check -s exit:0 rump.raidctl -I 12345 raid0
97	atf_check -s exit:0 -o ignore rump.raidctl -iv raid0
98
99	# put some data there
100	atf_check -s exit:0 -e ignore \
101	    dd if=$(atf_get_srcdir)/t_raid of=testfile count=4
102	atf_check -s exit:0 -e ignore -x \
103	    "dd if=testfile | rump.dd of=${rawraid} conv=sync"
104
105	# restart server with failed component
106	rump.halt
107	rm disk1.img # FAIL
108	atf_check -s exit:0 ${raidserver}				\
109	    -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE}	\
110	    -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE}	\
111	    ${RUMP_SERVER}
112
113	atf_check -s exit:0 rump.raidctl -c raid.conf raid0
114
115	# check if we we get what we wrote
116	atf_check -s exit:0 -o file:testfile -e ignore \
117	    rump.dd if=${rawraid} count=4
118}
119
120raid1_compfail_cleanup()
121{
122	export RUMP_SERVER=unix://sock
123	rump.halt
124}
125
126
127
128atf_test_case raid1_comp0fail cleanup
129raid1_comp0fail_head()
130{
131	atf_set "descr" "Checks configuring RAID1 after component 0 fails" \
132		"(PR kern/44251)"
133	atf_set "require.progs" "rump_server"
134}
135
136raid1_comp0fail_body()
137{
138	makecfg 1 2
139	export RUMP_SERVER=unix://sock
140	atf_check -s exit:0 ${raidserver}				\
141	    -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE}	\
142	    -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE}	\
143	    ${RUMP_SERVER}
144
145	atf_check -s exit:0 rump.raidctl -C raid.conf raid0
146	atf_check -s exit:0 rump.raidctl -I 12345 raid0
147	atf_check -s exit:0 -o ignore rump.raidctl -iv raid0
148
149	# restart server with failed component
150	rump.halt
151	rm disk0.img # FAIL
152	atf_check -s exit:0 ${raidserver} 				\
153	    -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE}	\
154	    -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE}	\
155	    ${RUMP_SERVER}
156
157	atf_check -s exit:0 rump.raidctl -c raid.conf raid0
158}
159
160raid1_comp0fail_cleanup()
161{
162	export RUMP_SERVER=unix://sock
163	rump.halt
164}
165
166atf_test_case raid1_normal cleanup
167raid1_normal_head()
168{
169	atf_set "descr" "Checks that RAID1 -c configurations work " \
170		"in the normal case"
171	atf_set "require.progs" "rump_server"
172}
173
174raid1_normal_body()
175{
176	makecfg 1 2
177	export RUMP_SERVER=unix://sock
178        atf_check -s exit:0 ${raidserver}                               \
179            -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE}     \
180            -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE}     \
181            ${RUMP_SERVER}
182
183        atf_check -s exit:0 rump.raidctl -C raid.conf raid0
184        atf_check -s exit:0 rump.raidctl -I 12345 raid0
185        atf_check -s exit:0 -o ignore rump.raidctl -iv raid0
186
187        # put some data there
188        atf_check -s exit:0 -e ignore \
189            dd if=$(atf_get_srcdir)/t_raid of=testfile count=4
190        atf_check -s exit:0 -e ignore -x \
191            "dd if=testfile | rump.dd of=${rawraid} conv=sync"
192
193        # restart server, disks remain normal
194        rump.halt
195
196        atf_check -s exit:0 ${raidserver}                               \
197            -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE}     \
198            -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE}     \
199            ${RUMP_SERVER}
200
201        atf_check -s exit:0 rump.raidctl -c raid.conf raid0
202
203        # check if we we get what we wrote
204        atf_check -s exit:0 -o file:testfile -e ignore \
205            rump.dd if=${rawraid} count=4
206
207}
208
209raid1_normal_cleanup()
210{
211        export RUMP_SERVER=unix://sock
212        rump.halt
213}
214
215
216atf_test_case raid5_compfail cleanup
217raid5_compfail_head()
218{
219	atf_set "descr" "Checks that RAID5 works after component failure"
220	atf_set "require.progs" "rump_server"
221}
222
223raid5_compfail_body()
224{
225	makecfg 5 3
226	export RUMP_SERVER=unix://sock
227	atf_check -s exit:0 ${raidserver}				\
228	    -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE}	\
229	    -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE}	\
230	    -d key=/disk2,hostpath=disk2.img,size=${RAID_MEDIASIZE}	\
231	    ${RUMP_SERVER}
232
233	atf_check -s exit:0 rump.raidctl -C raid.conf raid0
234	atf_check -s exit:0 rump.raidctl -I 12345 raid0
235	atf_check -s exit:0 -o ignore rump.raidctl -iv raid0
236
237	# put some data there
238	atf_check -s exit:0 -e ignore \
239	    dd if=$(atf_get_srcdir)/t_raid of=testfile count=4
240	atf_check -s exit:0 -e ignore -x \
241	    "dd if=testfile | rump.dd of=${rawraid} conv=sync"
242
243	# restart server with failed component
244	rump.halt
245	rm disk2.img # FAIL
246	atf_check -s exit:0 ${raidserver}				\
247	    -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE}	\
248	    -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE}	\
249	    -d key=/disk2,hostpath=disk2.img,size=${RAID_MEDIASIZE}	\
250	    ${RUMP_SERVER}
251
252	atf_check -s exit:0 rump.raidctl -c raid.conf raid0
253
254	# check if we we get what we wrote
255	atf_check -s exit:0 -o file:testfile -e ignore \
256	    rump.dd if=${rawraid} count=4
257}
258
259raid5_compfail_cleanup()
260{
261	export RUMP_SERVER=unix://sock
262	rump.halt
263}
264
265atf_test_case raid5_normal cleanup
266raid5_normal_head()
267{
268        atf_set "descr" "Checks that RAID5 works after normal shutdown " \
269		"and 'raidctl -c' startup"
270	atf_set "require.progs" "rump_server"
271}
272
273raid5_normal_body()
274{
275        makecfg 5 3
276        export RUMP_SERVER=unix://sock
277        atf_check -s exit:0 ${raidserver}                               \
278            -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE}     \
279            -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE}     \
280            -d key=/disk2,hostpath=disk2.img,size=${RAID_MEDIASIZE}     \
281            ${RUMP_SERVER}
282
283        atf_check -s exit:0 rump.raidctl -C raid.conf raid0
284        atf_check -s exit:0 rump.raidctl -I 12345 raid0
285        atf_check -s exit:0 -o ignore rump.raidctl -iv raid0
286
287        # put some data there
288        atf_check -s exit:0 -e ignore \
289            dd if=$(atf_get_srcdir)/t_raid of=testfile count=4
290        atf_check -s exit:0 -e ignore -x \
291            "dd if=testfile | rump.dd of=${rawraid} conv=sync"
292
293        # restart server after normal shutdown
294        rump.halt
295
296        atf_check -s exit:0 ${raidserver}                               \
297            -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE}     \
298            -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE}     \
299            -d key=/disk2,hostpath=disk2.img,size=${RAID_MEDIASIZE}     \
300            ${RUMP_SERVER}
301
302        atf_check -s exit:0 rump.raidctl -c raid.conf raid0
303
304        # check if we we get what we wrote
305        atf_check -s exit:0 -o file:testfile -e ignore \
306            rump.dd if=${rawraid} count=4
307}
308
309raid5_normal_cleanup()
310{
311        export RUMP_SERVER=unix://sock
312        rump.halt
313}
314
315atf_init_test_cases()
316{
317	atf_add_test_case smalldisk
318	atf_add_test_case raid1_normal
319	atf_add_test_case raid1_comp0fail
320	atf_add_test_case raid1_compfail
321	atf_add_test_case raid5_normal
322	atf_add_test_case raid5_compfail
323}
324