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