# set of functions used to test policy framework with assemble, incremental and Monitor set +e #create links to be able to use domains for d in 0 1 2 3 4 5 6 7 8 9 10 11 12 do eval ln -s \$dev$d /dev/disk/by-path/loop$d eval d$d="loop$d" eval mdadm --zero-superblock \$dev$d done devices="/dev/loop[0-9] /dev/loop10 /dev/loop11 /dev/loop12" # on failure print out few things before exit # uses testdsc and platform global variables err(){ echo >&2 "ERROR: $*" cat $config >&2 || true cat /proc/mdstat >&2 [ -z "$testdsc" ] || { echo >&2 $platform: $testdsc "- failed"; } ps -e | grep mdadm >&2 || true if [ $listfailed == "yes" ]; then [ "$verbose" != "yes" ] || echo ---FAILED--- flist="$flist \n $platform $testdsc" failed=1 else exit 1 fi } # set test description dsc(){ failed=0 testdsc="$*" [ "$verbose" != "yes" ] || echo $testdsc } killmonitor(){ [ -z "$monitorpid" ] || { kill -9 $monitorpid; unset monitorpid; } } tidyup(){ killmonitor mdadm -Ss || true mdadm -Ss mdadm --zero-superblock $devices || true udevadm settle rm -f $config } trap tidyup 0 1 2 3 15 # create a RAID 1 array or container and subarray(s) on 2 disks # if platform not specified imsm is used # if subsize is given, first subarray is created with given size and second one on remaining space ccv(){ # mddevno used to name created array local mddevno="$1" # numbers of devices to be used in array local devno1="$2" local devno2="$3" local platform="$4" local subsize="$5" local onearray="$6" [ -n "$platform" ] || platform="imsm" if [ "$platform" == "imsm" ] || [ "$platform" == "ddf" ]; then eval mdadm -CR /dev/md/con$mddevno -e $platform -n 2 \$dev$devno1 \$dev$devno2 udevadm settle [ -z "$subsize" ] || eval mdadm -CR sub$mddevno"_" -l 1 -n 2 /dev/md/con$mddevno -z $subsize [ -n "$onearray" ] || eval mdadm -CR sub$mddevno -l 1 -n 2 /dev/md/con$mddevno else [ -z "$subsize" ] || sizepar="-z $subsize" eval mdadm -CR arr$mddevno -e $platform -l 1 -n 2 \$dev$devno1 \$dev$devno2 $sizepar unset sizepar fi } # get container and subarray using given device from mdstat # sets global variables c and v getarray(){ local devname=`basename $1` local platformtype=`grep -A 1 $devname /proc/mdstat | awk '/active/ {getline; print $4 }' | awk -F ":" 'END {print $1}'` c=`grep "inactive.*$devname" /proc/mdstat | awk -F " " '{print $1}'` v=`grep " active.*$devname" /proc/mdstat | awk -F " " '{print $1}'` [ "$platformtype" == "external" ] || c=$v } # check if given device belongs to any container and subarray # if $2 given then only container checked chkarray(){ local devname="$1" local subcheck="$2" getarray $devname [ -n "$c" ] || err "$devname not in any container" [ -n "$subcheck" ] || [ -n "$v" ] || err " $devname not in subarray" } # test if two devices in the same container/subarray # $1 $2 - devices # $3 don't check subarrays, only containers tst(){ local device1=`basename $1` local device2=`basename $2` local subcheck="$3" chkarray $device1 $subcheck local x="$c" local y="$v" chkarray $device2 $subcheck [ "$c" == "$x" ] || err "$device1 and $device2 not in the same container" [ -n "$subcheck" ] || [ "$v" == "$y" ] || err "$device1 and $device2 not in the same subarray" } # same as tst, just use numbers of devices instead of names as parameters dtst(){ local devno1="$1" local devno2="$2" local subcheck="$3" eval tst \$dev$devno1 \$dev$devno2 $subcheck } # create containers/subarrays, check if created properly, # set global variables c$mddevno v$mddevno, usually c0=md127, v0=md126 , etc. setupdevs(){ local mddevno="$1" local devno1="$2" local devno2="$3" local p="$4" local subsize="$5" local onearray="$6" [ -n "$p" ] || p=$platform ccv $mddevno $devno1 $devno2 $p $subsize $onearray dtst $devno1 $devno2 eval c$mddevno=\"$c\" eval v$mddevno=\"$v\" } # check if given spare in container # usage: chkspare container spare [n] (n if spare shouldn't be in container) chkspare(){ local container=`basename $1` local spare=$2 local expected=$3 getarray $spare [ -n "$expected" ] || expected="y" if [ "$expected" == "y" ]; then [ "$c" == "$container" ] || err "$spare not in container $container" else [ "$c" != "$container" ] || err "$spare in container $container" fi } #check if spare was moved from one container to another # args: from_container to_container spare [yn] # n when spare should remain in original container chksparemoved(){ sleep $sleeptime from_container="$1" to_container="$2" spare="$3" expected="$4" [ -n "$expected" ] || expected="y" notexpected="n"; [ "$expected" == "y" ] || notexpected="y" chkspare $from_container $spare $notexpected [ $failed -eq 1 ] || chkspare $to_container $spare $expected } # for domains defined through policy createconfig(){ if [ "$1" != "a" ]; then { domain=$1 metadata=$2 action=$3 while [ -n "$4" ]; do echo="policy domain=$domain" [ "$metadata" == "noplatform" ] || echo="$echo metadata=$metadata" echo="$echo path=loop$4" echo="$echo action=$action" echo "$echo" shift done } >> $config else { echo "DEVICES $devlist /dev/md1*" mdadm -Ebs } > $config fi #[ "$verbose" != "yes" ] || cat $config | grep policy || true }