xref: /dflybsd-src/contrib/lvm2/dist/test/test-utils.sh (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
186d7f5d3SJohn Marino# Copyright (C) 2008 Red Hat, Inc. All rights reserved.
286d7f5d3SJohn Marino#
386d7f5d3SJohn Marino# This copyrighted material is made available to anyone wishing to use,
486d7f5d3SJohn Marino# modify, copy, or redistribute it subject to the terms and conditions
586d7f5d3SJohn Marino# of the GNU General Public License v.2.
686d7f5d3SJohn Marino#
786d7f5d3SJohn Marino# You should have received a copy of the GNU General Public License
886d7f5d3SJohn Marino# along with this program; if not, write to the Free Software Foundation,
986d7f5d3SJohn Marino# Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1086d7f5d3SJohn Marino
1186d7f5d3SJohn Marinotest_description="foo" # silence test-lib for now
1286d7f5d3SJohn Marino. ./test-lib.sh
1386d7f5d3SJohn Marino
1486d7f5d3SJohn Marinoaux() {
1586d7f5d3SJohn Marino        # use just "$@" for verbose operation
1686d7f5d3SJohn Marino	"$@" > /dev/null 2> /dev/null
1786d7f5d3SJohn Marino	#"$@"
1886d7f5d3SJohn Marino}
1986d7f5d3SJohn Marino
2086d7f5d3SJohn MarinoSTACKTRACE() {
2186d7f5d3SJohn Marino	trap - ERR;
2286d7f5d3SJohn Marino	i=0;
2386d7f5d3SJohn Marino	while FUNC=${FUNCNAME[$i]}; test "$FUNC" != "main"; do
2486d7f5d3SJohn Marino		echo "$i ${FUNC}() called from ${BASH_SOURCE[$i]}:${BASH_LINENO[$i]}"
2586d7f5d3SJohn Marino		i=$(($i + 1));
2686d7f5d3SJohn Marino	done
2786d7f5d3SJohn Marino}
2886d7f5d3SJohn Marino
2986d7f5d3SJohn Marinoteardown() {
3086d7f5d3SJohn Marino	echo $LOOP
3186d7f5d3SJohn Marino	echo $PREFIX
3286d7f5d3SJohn Marino
3386d7f5d3SJohn Marino	test -n "$PREFIX" && {
3486d7f5d3SJohn Marino		rm -rf $G_root_/dev/$PREFIX*
3586d7f5d3SJohn Marino		while dmsetup table | grep -q ^$PREFIX; do
3686d7f5d3SJohn Marino			for s in `dmsetup table | grep ^$PREFIX| awk '{ print substr($1,1,length($1)-1) }'`; do
3786d7f5d3SJohn Marino				dmsetup resume $s 2>/dev/null > /dev/null || true
3886d7f5d3SJohn Marino				dmsetup remove $s 2>/dev/null > /dev/null || true
3986d7f5d3SJohn Marino			done
4086d7f5d3SJohn Marino		done
4186d7f5d3SJohn Marino	}
4286d7f5d3SJohn Marino
4386d7f5d3SJohn Marino	test -n "$LOOP" && losetup -d $LOOP
4486d7f5d3SJohn Marino	test -n "$LOOPFILE" && rm -f $LOOPFILE
4586d7f5d3SJohn Marino}
4686d7f5d3SJohn Marino
4786d7f5d3SJohn Marinoteardown_() {
4886d7f5d3SJohn Marino	teardown
4986d7f5d3SJohn Marino	cleanup_ # user-overridable cleanup
5086d7f5d3SJohn Marino	testlib_cleanup_ # call test-lib cleanup routine, too
5186d7f5d3SJohn Marino}
5286d7f5d3SJohn Marino
5386d7f5d3SJohn Marinomake_ioerror() {
5486d7f5d3SJohn Marino	echo 0 10000000 error | dmsetup create ioerror
5586d7f5d3SJohn Marino	dmsetup resume ioerror
5686d7f5d3SJohn Marino	ln -s $G_dev_/mapper/ioerror $G_dev_/ioerror
5786d7f5d3SJohn Marino}
5886d7f5d3SJohn Marino
5986d7f5d3SJohn Marinoprepare_loop() {
6086d7f5d3SJohn Marino	size=$1
6186d7f5d3SJohn Marino	test -n "$size" || size=32
6286d7f5d3SJohn Marino
6386d7f5d3SJohn Marino	test -n "$LOOP" && return 0
6486d7f5d3SJohn Marino	trap 'aux teardown_' EXIT # don't forget to clean up
6586d7f5d3SJohn Marino	trap 'set +vex; STACKTRACE; set -vex' ERR
6686d7f5d3SJohn Marino	#trap - ERR
6786d7f5d3SJohn Marino
6886d7f5d3SJohn Marino	LOOPFILE="$PWD/test.img"
6986d7f5d3SJohn Marino	dd if=/dev/zero of="$LOOPFILE" bs=$((1024*1024)) count=1 seek=$(($size-1))
7086d7f5d3SJohn Marino	if LOOP=`losetup -s -f "$LOOPFILE" 2>/dev/null`; then
7186d7f5d3SJohn Marino		return 0
7286d7f5d3SJohn Marino	elif LOOP=`losetup -f` && losetup $LOOP "$LOOPFILE"; then
7386d7f5d3SJohn Marino		# no -s support
7486d7f5d3SJohn Marino		return 0
7586d7f5d3SJohn Marino	else
7686d7f5d3SJohn Marino		# no -f support
7786d7f5d3SJohn Marino		# Iterate through $G_dev_/loop{,/}{0,1,2,3,4,5,6,7}
7886d7f5d3SJohn Marino		for slash in '' /; do
7986d7f5d3SJohn Marino			for i in 0 1 2 3 4 5 6 7; do
8086d7f5d3SJohn Marino				local dev=$G_dev_/loop$slash$i
8186d7f5d3SJohn Marino				! losetup $dev >/dev/null 2>&1 || continue
8286d7f5d3SJohn Marino				# got a free
8386d7f5d3SJohn Marino				losetup "$dev" "$LOOPFILE"
8486d7f5d3SJohn Marino				LOOP=$dev
8586d7f5d3SJohn Marino				break
8686d7f5d3SJohn Marino			done
8786d7f5d3SJohn Marino			if [ -n "$LOOP" ]; then
8886d7f5d3SJohn Marino				break
8986d7f5d3SJohn Marino			fi
9086d7f5d3SJohn Marino		done
9186d7f5d3SJohn Marino		test -n "$LOOP" # confirm or fail
9286d7f5d3SJohn Marino		return 0
9386d7f5d3SJohn Marino	fi
9486d7f5d3SJohn Marino	exit 1 # should not happen
9586d7f5d3SJohn Marino}
9686d7f5d3SJohn Marino
9786d7f5d3SJohn Marinoprepare_devs() {
9886d7f5d3SJohn Marino	local n="$1"
9986d7f5d3SJohn Marino	test -z "$n" && n=3
10086d7f5d3SJohn Marino	local devsize="$2"
10186d7f5d3SJohn Marino	test -z "$devsize" && devsize=33
10286d7f5d3SJohn Marino	local pvname="$3"
10386d7f5d3SJohn Marino	test -z "$pvname" && pvname="pv"
10486d7f5d3SJohn Marino
10586d7f5d3SJohn Marino	prepare_loop $(($n*$devsize))
10686d7f5d3SJohn Marino
10786d7f5d3SJohn Marino	PREFIX="LVMTEST$$"
10886d7f5d3SJohn Marino
10986d7f5d3SJohn Marino	if ! loopsz=`blockdev --getsz $LOOP 2>/dev/null`; then
11086d7f5d3SJohn Marino  		loopsz=`blockdev --getsize $LOOP 2>/dev/null`
11186d7f5d3SJohn Marino	fi
11286d7f5d3SJohn Marino
11386d7f5d3SJohn Marino	local size=$(($loopsz/$n))
11486d7f5d3SJohn Marino
11586d7f5d3SJohn Marino	for i in `seq 1 $n`; do
11686d7f5d3SJohn Marino		local name="${PREFIX}$pvname$i"
11786d7f5d3SJohn Marino		local dev="$G_dev_/mapper/$name"
11886d7f5d3SJohn Marino		eval "dev$i=$dev"
11986d7f5d3SJohn Marino		devs="$devs $dev"
12086d7f5d3SJohn Marino		echo 0 $size linear $LOOP $((($i-1)*$size)) > $name.table
12186d7f5d3SJohn Marino		dmsetup create $name $name.table
12286d7f5d3SJohn Marino		dmsetup resume $name
12386d7f5d3SJohn Marino	done
12486d7f5d3SJohn Marino
12586d7f5d3SJohn Marino    # set up some default names
12686d7f5d3SJohn Marino	vg=${PREFIX}vg
12786d7f5d3SJohn Marino	vg1=${PREFIX}vg1
12886d7f5d3SJohn Marino	vg2=${PREFIX}vg2
12986d7f5d3SJohn Marino	lv=LV
13086d7f5d3SJohn Marino	lv1=LV1
13186d7f5d3SJohn Marino	lv2=LV2
13286d7f5d3SJohn Marino	lv3=LV3
13386d7f5d3SJohn Marino	lv4=LV4
13486d7f5d3SJohn Marino}
13586d7f5d3SJohn Marino
13686d7f5d3SJohn Marinodisable_dev() {
13786d7f5d3SJohn Marino	for dev in "$@"; do
13886d7f5d3SJohn Marino        # first we make the device inaccessible
13986d7f5d3SJohn Marino		echo 0 10000000 error | dmsetup load $dev
14086d7f5d3SJohn Marino		dmsetup resume $dev
14186d7f5d3SJohn Marino        # now let's try to get rid of it if it's unused
14286d7f5d3SJohn Marino        #dmsetup remove $dev
14386d7f5d3SJohn Marino	done
14486d7f5d3SJohn Marino}
14586d7f5d3SJohn Marino
14686d7f5d3SJohn Marinoenable_dev() {
14786d7f5d3SJohn Marino	for dev in "$@"; do
14886d7f5d3SJohn Marino		local name=`echo "$dev" | sed -e 's,.*/,,'`
14986d7f5d3SJohn Marino		dmsetup create $name $name.table || dmsetup load $name $name.table
15086d7f5d3SJohn Marino		dmsetup resume $dev
15186d7f5d3SJohn Marino	done
15286d7f5d3SJohn Marino}
15386d7f5d3SJohn Marino
15486d7f5d3SJohn Marinobackup_dev() {
15586d7f5d3SJohn Marino	for dev in "$@"; do
15686d7f5d3SJohn Marino		dd if=$dev of=$dev.backup bs=1024
15786d7f5d3SJohn Marino	done
15886d7f5d3SJohn Marino}
15986d7f5d3SJohn Marino
16086d7f5d3SJohn Marinorestore_dev() {
16186d7f5d3SJohn Marino	for dev in "$@"; do
16286d7f5d3SJohn Marino		test -e $dev.backup || {
16386d7f5d3SJohn Marino			echo "Internal error: $dev not backed up, can't restore!"
16486d7f5d3SJohn Marino			exit 1
16586d7f5d3SJohn Marino		}
16686d7f5d3SJohn Marino		dd of=$dev if=$dev.backup bs=1024
16786d7f5d3SJohn Marino	done
16886d7f5d3SJohn Marino}
16986d7f5d3SJohn Marino
17086d7f5d3SJohn Marinoprepare_pvs() {
17186d7f5d3SJohn Marino	prepare_devs "$@"
17286d7f5d3SJohn Marino	pvcreate $devs
17386d7f5d3SJohn Marino}
17486d7f5d3SJohn Marino
17586d7f5d3SJohn Marinoprepare_vg() {
17686d7f5d3SJohn Marino	prepare_pvs "$@"
17786d7f5d3SJohn Marino	vgcreate $vg $devs
17886d7f5d3SJohn Marino}
17986d7f5d3SJohn Marino
18086d7f5d3SJohn Marinoprepare_lvmconf() {
18186d7f5d3SJohn Marino	local filter="$1"
18286d7f5d3SJohn Marino	test -z "$filter" && \
18386d7f5d3SJohn Marino		filter='[ "a/dev\/mirror/", "a/dev\/mapper\/.*pv[0-9_]*$/", "r/.*/" ]'
18486d7f5d3SJohn Marino	cat > $G_root_/etc/lvm.conf <<-EOF
18586d7f5d3SJohn Marino  devices {
18686d7f5d3SJohn Marino    dir = "$G_dev_"
18786d7f5d3SJohn Marino    scan = "$G_dev_"
18886d7f5d3SJohn Marino    filter = $filter
18986d7f5d3SJohn Marino    cache_dir = "$G_root_/etc"
19086d7f5d3SJohn Marino    sysfs_scan = 0
19186d7f5d3SJohn Marino  }
19286d7f5d3SJohn Marino  log {
19386d7f5d3SJohn Marino    verbose = $verboselevel
19486d7f5d3SJohn Marino    syslog = 0
19586d7f5d3SJohn Marino    indent = 1
19686d7f5d3SJohn Marino  }
19786d7f5d3SJohn Marino  backup {
19886d7f5d3SJohn Marino    backup = 0
19986d7f5d3SJohn Marino    archive = 0
20086d7f5d3SJohn Marino  }
20186d7f5d3SJohn Marino  global {
20286d7f5d3SJohn Marino    library_dir = "$G_root_/lib"
20386d7f5d3SJohn Marino     locking_dir = "$G_root_/var/lock/lvm"
20486d7f5d3SJohn Marino  }
20586d7f5d3SJohn MarinoEOF
20686d7f5d3SJohn Marino}
20786d7f5d3SJohn Marino
20886d7f5d3SJohn Marinoset -vexE
20986d7f5d3SJohn Marinoaux prepare_lvmconf
21086d7f5d3SJohn Marino
211