xref: /dragonfly/contrib/lvm2/dist/test/test-utils.sh (revision 86d7f5d3)
1*86d7f5d3SJohn Marino# Copyright (C) 2008 Red Hat, Inc. All rights reserved.
2*86d7f5d3SJohn Marino#
3*86d7f5d3SJohn Marino# This copyrighted material is made available to anyone wishing to use,
4*86d7f5d3SJohn Marino# modify, copy, or redistribute it subject to the terms and conditions
5*86d7f5d3SJohn Marino# of the GNU General Public License v.2.
6*86d7f5d3SJohn Marino#
7*86d7f5d3SJohn Marino# You should have received a copy of the GNU General Public License
8*86d7f5d3SJohn Marino# along with this program; if not, write to the Free Software Foundation,
9*86d7f5d3SJohn Marino# Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
10*86d7f5d3SJohn Marino
11*86d7f5d3SJohn Marinotest_description="foo" # silence test-lib for now
12*86d7f5d3SJohn Marino. ./test-lib.sh
13*86d7f5d3SJohn Marino
14*86d7f5d3SJohn Marinoaux() {
15*86d7f5d3SJohn Marino        # use just "$@" for verbose operation
16*86d7f5d3SJohn Marino	"$@" > /dev/null 2> /dev/null
17*86d7f5d3SJohn Marino	#"$@"
18*86d7f5d3SJohn Marino}
19*86d7f5d3SJohn Marino
20*86d7f5d3SJohn MarinoSTACKTRACE() {
21*86d7f5d3SJohn Marino	trap - ERR;
22*86d7f5d3SJohn Marino	i=0;
23*86d7f5d3SJohn Marino	while FUNC=${FUNCNAME[$i]}; test "$FUNC" != "main"; do
24*86d7f5d3SJohn Marino		echo "$i ${FUNC}() called from ${BASH_SOURCE[$i]}:${BASH_LINENO[$i]}"
25*86d7f5d3SJohn Marino		i=$(($i + 1));
26*86d7f5d3SJohn Marino	done
27*86d7f5d3SJohn Marino}
28*86d7f5d3SJohn Marino
29*86d7f5d3SJohn Marinoteardown() {
30*86d7f5d3SJohn Marino	echo $LOOP
31*86d7f5d3SJohn Marino	echo $PREFIX
32*86d7f5d3SJohn Marino
33*86d7f5d3SJohn Marino	test -n "$PREFIX" && {
34*86d7f5d3SJohn Marino		rm -rf $G_root_/dev/$PREFIX*
35*86d7f5d3SJohn Marino		while dmsetup table | grep -q ^$PREFIX; do
36*86d7f5d3SJohn Marino			for s in `dmsetup table | grep ^$PREFIX| awk '{ print substr($1,1,length($1)-1) }'`; do
37*86d7f5d3SJohn Marino				dmsetup resume $s 2>/dev/null > /dev/null || true
38*86d7f5d3SJohn Marino				dmsetup remove $s 2>/dev/null > /dev/null || true
39*86d7f5d3SJohn Marino			done
40*86d7f5d3SJohn Marino		done
41*86d7f5d3SJohn Marino	}
42*86d7f5d3SJohn Marino
43*86d7f5d3SJohn Marino	test -n "$LOOP" && losetup -d $LOOP
44*86d7f5d3SJohn Marino	test -n "$LOOPFILE" && rm -f $LOOPFILE
45*86d7f5d3SJohn Marino}
46*86d7f5d3SJohn Marino
47*86d7f5d3SJohn Marinoteardown_() {
48*86d7f5d3SJohn Marino	teardown
49*86d7f5d3SJohn Marino	cleanup_ # user-overridable cleanup
50*86d7f5d3SJohn Marino	testlib_cleanup_ # call test-lib cleanup routine, too
51*86d7f5d3SJohn Marino}
52*86d7f5d3SJohn Marino
53*86d7f5d3SJohn Marinomake_ioerror() {
54*86d7f5d3SJohn Marino	echo 0 10000000 error | dmsetup create ioerror
55*86d7f5d3SJohn Marino	dmsetup resume ioerror
56*86d7f5d3SJohn Marino	ln -s $G_dev_/mapper/ioerror $G_dev_/ioerror
57*86d7f5d3SJohn Marino}
58*86d7f5d3SJohn Marino
59*86d7f5d3SJohn Marinoprepare_loop() {
60*86d7f5d3SJohn Marino	size=$1
61*86d7f5d3SJohn Marino	test -n "$size" || size=32
62*86d7f5d3SJohn Marino
63*86d7f5d3SJohn Marino	test -n "$LOOP" && return 0
64*86d7f5d3SJohn Marino	trap 'aux teardown_' EXIT # don't forget to clean up
65*86d7f5d3SJohn Marino	trap 'set +vex; STACKTRACE; set -vex' ERR
66*86d7f5d3SJohn Marino	#trap - ERR
67*86d7f5d3SJohn Marino
68*86d7f5d3SJohn Marino	LOOPFILE="$PWD/test.img"
69*86d7f5d3SJohn Marino	dd if=/dev/zero of="$LOOPFILE" bs=$((1024*1024)) count=1 seek=$(($size-1))
70*86d7f5d3SJohn Marino	if LOOP=`losetup -s -f "$LOOPFILE" 2>/dev/null`; then
71*86d7f5d3SJohn Marino		return 0
72*86d7f5d3SJohn Marino	elif LOOP=`losetup -f` && losetup $LOOP "$LOOPFILE"; then
73*86d7f5d3SJohn Marino		# no -s support
74*86d7f5d3SJohn Marino		return 0
75*86d7f5d3SJohn Marino	else
76*86d7f5d3SJohn Marino		# no -f support
77*86d7f5d3SJohn Marino		# Iterate through $G_dev_/loop{,/}{0,1,2,3,4,5,6,7}
78*86d7f5d3SJohn Marino		for slash in '' /; do
79*86d7f5d3SJohn Marino			for i in 0 1 2 3 4 5 6 7; do
80*86d7f5d3SJohn Marino				local dev=$G_dev_/loop$slash$i
81*86d7f5d3SJohn Marino				! losetup $dev >/dev/null 2>&1 || continue
82*86d7f5d3SJohn Marino				# got a free
83*86d7f5d3SJohn Marino				losetup "$dev" "$LOOPFILE"
84*86d7f5d3SJohn Marino				LOOP=$dev
85*86d7f5d3SJohn Marino				break
86*86d7f5d3SJohn Marino			done
87*86d7f5d3SJohn Marino			if [ -n "$LOOP" ]; then
88*86d7f5d3SJohn Marino				break
89*86d7f5d3SJohn Marino			fi
90*86d7f5d3SJohn Marino		done
91*86d7f5d3SJohn Marino		test -n "$LOOP" # confirm or fail
92*86d7f5d3SJohn Marino		return 0
93*86d7f5d3SJohn Marino	fi
94*86d7f5d3SJohn Marino	exit 1 # should not happen
95*86d7f5d3SJohn Marino}
96*86d7f5d3SJohn Marino
97*86d7f5d3SJohn Marinoprepare_devs() {
98*86d7f5d3SJohn Marino	local n="$1"
99*86d7f5d3SJohn Marino	test -z "$n" && n=3
100*86d7f5d3SJohn Marino	local devsize="$2"
101*86d7f5d3SJohn Marino	test -z "$devsize" && devsize=33
102*86d7f5d3SJohn Marino	local pvname="$3"
103*86d7f5d3SJohn Marino	test -z "$pvname" && pvname="pv"
104*86d7f5d3SJohn Marino
105*86d7f5d3SJohn Marino	prepare_loop $(($n*$devsize))
106*86d7f5d3SJohn Marino
107*86d7f5d3SJohn Marino	PREFIX="LVMTEST$$"
108*86d7f5d3SJohn Marino
109*86d7f5d3SJohn Marino	if ! loopsz=`blockdev --getsz $LOOP 2>/dev/null`; then
110*86d7f5d3SJohn Marino  		loopsz=`blockdev --getsize $LOOP 2>/dev/null`
111*86d7f5d3SJohn Marino	fi
112*86d7f5d3SJohn Marino
113*86d7f5d3SJohn Marino	local size=$(($loopsz/$n))
114*86d7f5d3SJohn Marino
115*86d7f5d3SJohn Marino	for i in `seq 1 $n`; do
116*86d7f5d3SJohn Marino		local name="${PREFIX}$pvname$i"
117*86d7f5d3SJohn Marino		local dev="$G_dev_/mapper/$name"
118*86d7f5d3SJohn Marino		eval "dev$i=$dev"
119*86d7f5d3SJohn Marino		devs="$devs $dev"
120*86d7f5d3SJohn Marino		echo 0 $size linear $LOOP $((($i-1)*$size)) > $name.table
121*86d7f5d3SJohn Marino		dmsetup create $name $name.table
122*86d7f5d3SJohn Marino		dmsetup resume $name
123*86d7f5d3SJohn Marino	done
124*86d7f5d3SJohn Marino
125*86d7f5d3SJohn Marino    # set up some default names
126*86d7f5d3SJohn Marino	vg=${PREFIX}vg
127*86d7f5d3SJohn Marino	vg1=${PREFIX}vg1
128*86d7f5d3SJohn Marino	vg2=${PREFIX}vg2
129*86d7f5d3SJohn Marino	lv=LV
130*86d7f5d3SJohn Marino	lv1=LV1
131*86d7f5d3SJohn Marino	lv2=LV2
132*86d7f5d3SJohn Marino	lv3=LV3
133*86d7f5d3SJohn Marino	lv4=LV4
134*86d7f5d3SJohn Marino}
135*86d7f5d3SJohn Marino
136*86d7f5d3SJohn Marinodisable_dev() {
137*86d7f5d3SJohn Marino	for dev in "$@"; do
138*86d7f5d3SJohn Marino        # first we make the device inaccessible
139*86d7f5d3SJohn Marino		echo 0 10000000 error | dmsetup load $dev
140*86d7f5d3SJohn Marino		dmsetup resume $dev
141*86d7f5d3SJohn Marino        # now let's try to get rid of it if it's unused
142*86d7f5d3SJohn Marino        #dmsetup remove $dev
143*86d7f5d3SJohn Marino	done
144*86d7f5d3SJohn Marino}
145*86d7f5d3SJohn Marino
146*86d7f5d3SJohn Marinoenable_dev() {
147*86d7f5d3SJohn Marino	for dev in "$@"; do
148*86d7f5d3SJohn Marino		local name=`echo "$dev" | sed -e 's,.*/,,'`
149*86d7f5d3SJohn Marino		dmsetup create $name $name.table || dmsetup load $name $name.table
150*86d7f5d3SJohn Marino		dmsetup resume $dev
151*86d7f5d3SJohn Marino	done
152*86d7f5d3SJohn Marino}
153*86d7f5d3SJohn Marino
154*86d7f5d3SJohn Marinobackup_dev() {
155*86d7f5d3SJohn Marino	for dev in "$@"; do
156*86d7f5d3SJohn Marino		dd if=$dev of=$dev.backup bs=1024
157*86d7f5d3SJohn Marino	done
158*86d7f5d3SJohn Marino}
159*86d7f5d3SJohn Marino
160*86d7f5d3SJohn Marinorestore_dev() {
161*86d7f5d3SJohn Marino	for dev in "$@"; do
162*86d7f5d3SJohn Marino		test -e $dev.backup || {
163*86d7f5d3SJohn Marino			echo "Internal error: $dev not backed up, can't restore!"
164*86d7f5d3SJohn Marino			exit 1
165*86d7f5d3SJohn Marino		}
166*86d7f5d3SJohn Marino		dd of=$dev if=$dev.backup bs=1024
167*86d7f5d3SJohn Marino	done
168*86d7f5d3SJohn Marino}
169*86d7f5d3SJohn Marino
170*86d7f5d3SJohn Marinoprepare_pvs() {
171*86d7f5d3SJohn Marino	prepare_devs "$@"
172*86d7f5d3SJohn Marino	pvcreate $devs
173*86d7f5d3SJohn Marino}
174*86d7f5d3SJohn Marino
175*86d7f5d3SJohn Marinoprepare_vg() {
176*86d7f5d3SJohn Marino	prepare_pvs "$@"
177*86d7f5d3SJohn Marino	vgcreate $vg $devs
178*86d7f5d3SJohn Marino}
179*86d7f5d3SJohn Marino
180*86d7f5d3SJohn Marinoprepare_lvmconf() {
181*86d7f5d3SJohn Marino	local filter="$1"
182*86d7f5d3SJohn Marino	test -z "$filter" && \
183*86d7f5d3SJohn Marino		filter='[ "a/dev\/mirror/", "a/dev\/mapper\/.*pv[0-9_]*$/", "r/.*/" ]'
184*86d7f5d3SJohn Marino	cat > $G_root_/etc/lvm.conf <<-EOF
185*86d7f5d3SJohn Marino  devices {
186*86d7f5d3SJohn Marino    dir = "$G_dev_"
187*86d7f5d3SJohn Marino    scan = "$G_dev_"
188*86d7f5d3SJohn Marino    filter = $filter
189*86d7f5d3SJohn Marino    cache_dir = "$G_root_/etc"
190*86d7f5d3SJohn Marino    sysfs_scan = 0
191*86d7f5d3SJohn Marino  }
192*86d7f5d3SJohn Marino  log {
193*86d7f5d3SJohn Marino    verbose = $verboselevel
194*86d7f5d3SJohn Marino    syslog = 0
195*86d7f5d3SJohn Marino    indent = 1
196*86d7f5d3SJohn Marino  }
197*86d7f5d3SJohn Marino  backup {
198*86d7f5d3SJohn Marino    backup = 0
199*86d7f5d3SJohn Marino    archive = 0
200*86d7f5d3SJohn Marino  }
201*86d7f5d3SJohn Marino  global {
202*86d7f5d3SJohn Marino    library_dir = "$G_root_/lib"
203*86d7f5d3SJohn Marino     locking_dir = "$G_root_/var/lock/lvm"
204*86d7f5d3SJohn Marino  }
205*86d7f5d3SJohn MarinoEOF
206*86d7f5d3SJohn Marino}
207*86d7f5d3SJohn Marino
208*86d7f5d3SJohn Marinoset -vexE
209*86d7f5d3SJohn Marinoaux prepare_lvmconf
210*86d7f5d3SJohn Marino
211