1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-27 07:22:49 +03:00
lvm2/test/test-utils.sh
Petr Rockai 4d534dd7e4 Add a workaround for missing losetup -s by jstava, and a print a stacktrace
on errors (also by jstava). Currently requires bash, a fix for that may come
later -- explicitly using bash to run tests in the meantime.
2008-10-06 16:55:30 +00:00

179 lines
3.9 KiB
Bash

# Copyright (C) 2008 Red Hat, Inc. All rights reserved.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions
# of the GNU General Public License v.2.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
test_description="foo" # silence test-lib for now
. ./test-lib.sh
aux() {
# use just "$@" for verbose operation
"$@" > /dev/null 2> /dev/null
#"$@"
}
not () { "$@" && exit 1 || return 0; }
STACKTRACE() {
trap - ERR;
i=0;
while FUNC=${FUNCNAME[$i]}; test "$FUNC" != "main"; do
echo "$i ${FUNC}() called from ${BASH_SOURCE[$i]}:${BASH_LINENO[$i]}"
i=$(($i + 1));
done
}
teardown() {
echo $LOOP
echo $PREFIX
test -n "$PREFIX" && {
rm -rf /dev/$PREFIX*
while dmsetup table | grep -q ^$PREFIX; do
for s in `dmsetup table | grep ^$PREFIX| cut -f1 -d:`; do
dmsetup resume $s 2>/dev/null > /dev/null || true
dmsetup remove $s 2>/dev/null > /dev/null || true
done
done
}
test -n "$LOOP" && losetup -d $LOOP
test -n "$LOOPFILE" && rm -f $LOOPFILE
cleanup_ # user-overridable cleanup
testlib_cleanup_ # call test-lib cleanup routine, too
}
make_ioerror() {
echo 0 10000000 error | dmsetup create ioerror
dmsetup resume ioerror
ln -s /dev/mapper/ioerror /dev/ioerror
}
prepare_loop() {
size=$1
test -n "$size" || size=32
test -n "$LOOP" && return 0
trap 'aux teardown' EXIT # don't forget to clean up
trap 'set +vex; STACKTRACE; set -vex' ERR
#trap - ERR
LOOPFILE="$PWD/test.img"
dd if=/dev/zero of="$LOOPFILE" bs=$((1024*1024)) count=1 seek=$(($size-1))
if LOOP=`losetup -s -f "$LOOPFILE" 2>/dev/null`; then
return 0
elif LOOP=`losetup -f` && losetup $LOOP "$LOOPFILE"; then
# no -s support
return 0
else
# no -f support
# Iterate through $G_dev_/loop{,/}{0,1,2,3,4,5,6,7,8,9}
for slash in '' /; do
for i in 0 1 2 3 4 5 6 7 8 9; do
local dev=$G_dev_/loop$slash$i
! losetup $dev >/dev/null 2>&1 || continue
# got a free
losetup "$dev" "$LOOPFILE"
LOOP=$dev
done
done
test -n "LOOP" # confirm or fail
fi
exit 1 # should not be accesible
}
prepare_devs() {
local n="$1"
test -z "$n" && n=3
local devsize="$2"
test -z "$devsize" && devsize=33
prepare_loop $(($n*$devsize))
PREFIX="LVMTEST$$"
local loopsz=`blockdev --getsz $LOOP`
local size=$(($loopsz/$n))
for i in `seq 1 $n`; do
local name="${PREFIX}pv$i"
local dev="$G_dev_/mapper/$name"
eval "dev$i=$dev"
devs="$devs $dev"
echo 0 $size linear $LOOP $((($i-1)*$size)) > $name.table
dmsetup create $name $name.table
dmsetup resume $name
done
# set up some default names
vg=${PREFIX}vg
vg1=${PREFIX}vg1
vg2=${PREFIX}vg2
lv=LV
lv1=LV1
lv2=LV2
lv3=LV3
}
disable_dev() {
for dev in "$@"; do
# first we make the device inaccessible
echo 0 10000000 error | dmsetup load $dev
dmsetup resume $dev
# now let's try to get rid of it if it's unused
#dmsetup remove $dev
done
}
enable_dev() {
for dev in "$@"; do
local name=`echo "$dev" | sed -e 's,.*/,,'`
dmsetup create $name $name.table || dmsetup load $name $name.table
dmsetup resume $dev
done
}
prepare_pvs() {
prepare_devs "$@"
pvcreate $devs
}
prepare_vg() {
prepare_pvs "$@"
vgcreate $vg $devs
}
prepare_lvmconf() {
cat > $G_root_/etc/lvm.conf <<-EOF
devices {
dir = "$G_dev_"
scan = "$G_dev_"
filter = [ "a/dev\/mirror/", "a/dev\/mapper/", "r/.*/" ]
cache_dir = "$G_root_/etc"
sysfs_scan = 0
}
log {
verbose = $verboselevel
syslog = 0
indent = 1
}
backup {
backup = 0
archive = 0
}
global {
library_dir = "$G_root_/lib"
}
EOF
}
set -vexE
aux prepare_lvmconf