From d2da726fe76e61f4c499421d8d2bd588ca41b770 Mon Sep 17 00:00:00 2001 From: Emmanuel Dreyfus Date: Thu, 9 Oct 2014 09:08:57 +0200 Subject: Regression test portability: loopback devices Introduce functions to deal with loopback devices setup, mount and umount. Remove test for xfsprogs for non Linux systems, as loopback devices can be populated with other filesystems (e.g.: FFS for NetBSD) While there, remove mount.nfs test for non Linux systems. At least NetBSD has it in base system as mount_nfs. BUG: 1129939 Change-Id: I816b36e1d3e6933f92acf19d9be8eeaaa333356e Signed-off-by: Emmanuel Dreyfus Reviewed-on: http://review.gluster.org/8914 Tested-by: Gluster Build System Reviewed-by: Vijay Bellur --- run-tests.sh | 20 ++-- tests/bugs/bug-1099890.t | 19 ++-- tests/bugs/bug-858488-min-free-disk.t | 15 ++- tests/bugs/bug-948729/bug-948729-force.t | 55 ++++++--- tests/bugs/bug-948729/bug-948729-mode-script.t | 29 +++-- tests/bugs/bug-948729/bug-948729.t | 30 +++-- tests/features/weighted-rebalance.t | 14 +-- tests/include.rc | 150 +++++++++++++++++++++++++ 8 files changed, 267 insertions(+), 65 deletions(-) diff --git a/run-tests.sh b/run-tests.sh index 823814db85f..f95c8f978cb 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -31,10 +31,12 @@ function check_dependencies() MISSING="$MISSING rpmbuild" fi - # Check for nfs-utils - env mount.nfs -V > /dev/null 2>&1 - if [ $? -ne 0 ]; then - MISSING="$MISSING nfs-utils" + # Check for nfs-utils (Linux-only: built-in NetBSD with different name) + if [ "x`uname -s`" = "xLinux" ] ; then + env mount.nfs -V > /dev/null 2>&1 + if [ $? -ne 0 ]; then + MISSING="$MISSING nfs-utils" + fi fi # Check for the Perl Test Harness @@ -48,10 +50,12 @@ function check_dependencies() MISSING="$MISSING json_verify" fi - # Check for XFS programs - env mkfs.xfs -V > /dev/null 2>&1 - if [ $? -ne 0 ]; then - MISSING="$MISSING xfsprogs" + # Check for XFS programs (Linux Only: NetBSD does without) + if [ "x`uname -s`" = "xLinux" ] ; then + env mkfs.xfs -V > /dev/null 2>&1 + if [ $? -ne 0 ]; then + MISSING="$MISSING xfsprogs" + fi fi # Check for attr diff --git a/tests/bugs/bug-1099890.t b/tests/bugs/bug-1099890.t index a27d4e74fbf..c4be2cf56ba 100644 --- a/tests/bugs/bug-1099890.t +++ b/tests/bugs/bug-1099890.t @@ -17,16 +17,16 @@ TEST pidof glusterd; TEST truncate -s 100M $B0/brick1 TEST truncate -s 100M $B0/brick2 -TEST L1=`losetup --find --show $B0/brick1` -TEST mkfs.xfs $L1 +TEST L1=`SETUP_LOOP $B0/brick1` +TEST MKFS_LOOP $L1 -TEST L2=`losetup --find --show $B0/brick2` -TEST mkfs.xfs $L2 +TEST L2=`SETUP_LOOP $B0/brick2` +TEST MKFS_LOOP $L2 TEST mkdir -p $B0/${V0}{1,2} -TEST mount -t xfs $L1 $B0/${V0}1 -TEST mount -t xfs $L2 $B0/${V0}2 +TEST MOUNT_LOOP $L1 $B0/${V0}1 +TEST MOUNT_LOOP $L2 $B0/${V0}2 # Create a plain distribute volume with 2 subvols. TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}; @@ -117,4 +117,9 @@ EXPECT "$V0-client-1" dht_get_linkto_target "$B0/${V0}1/zz" EXPECT "1" is_dht_linkfile "$B0/${V0}1/zz" -cleanup; +force_umount $M0 +$CLI volume stop $V0 +UMOUNT_LOOP ${B0}/${V0}{1,2} +rm -f ${B0}/brick{1,2} + +cleanup diff --git a/tests/bugs/bug-858488-min-free-disk.t b/tests/bugs/bug-858488-min-free-disk.t index babb27c4e25..1933f707e9c 100644 --- a/tests/bugs/bug-858488-min-free-disk.t +++ b/tests/bugs/bug-858488-min-free-disk.t @@ -13,13 +13,13 @@ TEST $CLI volume info; ## Lets create partitions for bricks TEST truncate -s 100M $B0/brick1 TEST truncate -s 200M $B0/brick2 -TEST LO1=`losetup --find --show $B0/brick1` -TEST mkfs.xfs $LO1 -TEST LO2=`losetup --find --show $B0/brick2` -TEST mkfs.xfs $LO2 +TEST LO1=`SETUP_LOOP $B0/brick1` +TEST MKFS_LOOP $LO1 +TEST LO2=`SETUP_LOOP $B0/brick2` +TEST MKFS_LOOP $LO2 TEST mkdir -p $B0/${V0}1 $B0/${V0}2 -TEST mount -t xfs $LO1 $B0/${V0}1 -TEST mount -t xfs $LO2 $B0/${V0}2 +TEST MOUNT_LOOP $LO1 $B0/${V0}1 +TEST MOUNT_LOOP $LO2 $B0/${V0}2 ## Lets create volume TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}; @@ -102,4 +102,7 @@ TEST $CLI volume stop $V0; EXPECT 'Stopped' volinfo_field $V0 'Status'; $CLI volume delete $V0; +UMOUNT_LOOP ${B0}/${V0}{1,2} +rm -f ${B0}/brick{1,2} + cleanup; diff --git a/tests/bugs/bug-948729/bug-948729-force.t b/tests/bugs/bug-948729/bug-948729-force.t index b68b8b88bdd..b4106a58736 100644 --- a/tests/bugs/bug-948729/bug-948729-force.t +++ b/tests/bugs/bug-948729/bug-948729-force.t @@ -1,6 +1,7 @@ #!/bin/bash . $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc . $(dirname $0)/../../cluster.rc function check_peers { @@ -35,27 +36,27 @@ TEST truncate -s 16M $B4/brick4 TEST truncate -s 16M $B5/brick5 TEST truncate -s 16M $B6/brick6 -TEST LD1=`losetup --find --show $B1/brick1` -TEST mkfs.xfs $LD1 -TEST LD2=`losetup --find --show $B2/brick2` -TEST mkfs.xfs $LD2 -TEST LD3=`losetup --find --show $B3/brick3` -TEST mkfs.xfs $LD3 -TEST LD4=`losetup --find --show $B4/brick4` -TEST mkfs.xfs $LD4 -TEST LD5=`losetup --find --show $B5/brick5` -TEST mkfs.xfs $LD5 -TEST LD6=`losetup --find --show $B6/brick6` -TEST mkfs.xfs $LD6 +TEST LD1=`SETUP_LOOP $B1/brick1` +TEST MKFS_LOOP $LD1 +TEST LD2=`SETUP_LOOP $B2/brick2` +TEST MKFS_LOOP $LD2 +TEST LD3=`SETUP_LOOP $B3/brick3` +TEST MKFS_LOOP $LD3 +TEST LD4=`SETUP_LOOP $B4/brick4` +TEST MKFS_LOOP $LD4 +TEST LD5=`SETUP_LOOP $B5/brick5` +TEST MKFS_LOOP $LD5 +TEST LD6=`SETUP_LOOP $B6/brick6` +TEST MKFS_LOOP $LD6 mkdir -p $B1/$V0 $B2/$V0 $B3/$V0 $B4/$V0 $B5/$V0 $B6/$V0 -TEST mount -t xfs $LD1 $B1/$V0 -TEST mount -t xfs $LD2 $B2/$V0 -TEST mount -t xfs $LD3 $B3/$V0 -TEST mount -t xfs $LD4 $B4/$V0 -TEST mount -t xfs $LD5 $B5/$V0 -TEST mount -t xfs $LD6 $B6/$V0 +TEST MOUNT_LOOP $LD1 $B1/$V0 +TEST MOUNT_LOOP $LD2 $B2/$V0 +TEST MOUNT_LOOP $LD3 $B3/$V0 +TEST MOUNT_LOOP $LD4 $B4/$V0 +TEST MOUNT_LOOP $LD5 $B5/$V0 +TEST MOUNT_LOOP $LD6 $B6/$V0 #Case 0: Parent directory of the brick is absent TEST ! $CLI1 volume create $V0 $H1:$B1/$V0/nonexistent/b1 $H2:$B2/$V0/nonexistent/b2 force @@ -81,4 +82,22 @@ TEST $CLI1 volume add-brick $V2 $H1:$B4/$V0/brick3 force rmdir /$uuid1 /$uuid2 /$uuid3; +$CLI volume stop $V0 +$CLI volume stop $V1 +$CLI volume stop $V2 + +UMOUNT_LOOP $B1/$V0 +UMOUNT_LOOP $B2/$V0 +UMOUNT_LOOP $B3/$V0 +UMOUNT_LOOP $B4/$V0 +UMOUNT_LOOP $B5/$V0 +UMOUNT_LOOP $B6/$V0 + +rm -f $B1/brick1 +rm -f $B2/brick2 +rm -f $B3/brick3 +rm -f $B4/brick4 +rm -f $B5/brick5 +rm -f $B6/brick6 + cleanup; diff --git a/tests/bugs/bug-948729/bug-948729-mode-script.t b/tests/bugs/bug-948729/bug-948729-mode-script.t index 5ac133a5bfe..6264e18f1bd 100644 --- a/tests/bugs/bug-948729/bug-948729-mode-script.t +++ b/tests/bugs/bug-948729/bug-948729-mode-script.t @@ -1,6 +1,7 @@ #!/bin/bash . $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc . $(dirname $0)/../../cluster.rc function check_peers { @@ -26,18 +27,18 @@ TEST truncate -s 16M $B1/brick1 TEST truncate -s 16M $B2/brick2 TEST truncate -s 16M $B3/brick3 -TEST LD1=`losetup --find --show $B1/brick1` -TEST mkfs.xfs $LD1 -TEST LD2=`losetup --find --show $B2/brick2` -TEST mkfs.xfs $LD2 -TEST LD3=`losetup --find --show $B3/brick3` -TEST mkfs.xfs $LD3 +TEST LD1=`SETUP_LOOP $B1/brick1` +TEST MKFS_LOOP $LD1 +TEST LD2=`SETUP_LOOP $B2/brick2` +TEST MKFS_LOOP $LD2 +TEST LD3=`SETUP_LOOP $B3/brick3` +TEST MKFS_LOOP $LD3 mkdir -p $B1/$V0 $B2/$V0 $B3/$V0 -TEST mount -t xfs $LD1 $B1/$V0 -TEST mount -t xfs $LD2 $B2/$V0 -TEST mount -t xfs $LD3 $B3/$V0 +TEST MOUNT_LOOP $LD1 $B1/$V0 +TEST MOUNT_LOOP $LD2 $B2/$V0 +TEST MOUNT_LOOP $LD3 $B3/$V0 cli1=$(echo $CLI1 | sed 's/ --wignore//') @@ -63,4 +64,14 @@ TEST $cli1 volume add-brick $V0 $H1:$B3/$V0/brick3 #FIX-ME : replace-brick does not currently work in the newly introduced #####cluster test framework +$CLI1 volume stop $V0 + +UMOUNT_LOOP $B1/$V0 +UMOUNT_LOOP $B2/$V0 +UMOUNT_LOOP $B3/$V0 + +rm -f $B1/brick1 +rm -f $B2/brick2 +rm -f $B3/brick3 + cleanup; diff --git a/tests/bugs/bug-948729/bug-948729.t b/tests/bugs/bug-948729/bug-948729.t index 8a0620a7d60..46cdb3d8e8c 100644 --- a/tests/bugs/bug-948729/bug-948729.t +++ b/tests/bugs/bug-948729/bug-948729.t @@ -1,6 +1,7 @@ #!/bin/bash . $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc . $(dirname $0)/../../cluster.rc function check_peers { @@ -27,18 +28,18 @@ TEST truncate -s 16M $B1/brick1 TEST truncate -s 16M $B2/brick2 TEST truncate -s 16M $B3/brick3 -TEST LD1=`losetup --find --show $B1/brick1` -TEST mkfs.xfs $LD1 -TEST LD2=`losetup --find --show $B2/brick2` -TEST mkfs.xfs $LD2 -TEST LD3=`losetup --find --show $B3/brick3` -TEST mkfs.xfs $LD3 +TEST LD1=`SETUP_LOOP $B1/brick1` +TEST MKFS_LOOP $LD1 +TEST LD2=`SETUP_LOOP $B2/brick2` +TEST MKFS_LOOP $LD2 +TEST LD3=`SETUP_LOOP $B3/brick3` +TEST MKFS_LOOP $LD3 mkdir -p $B1/$V0 $B2/$V0 $B3/$V0 -TEST mount -t xfs $LD1 $B1/$V0 -TEST mount -t xfs $LD2 $B2/$V0 -TEST mount -t xfs $LD3 $B3/$V0 +TEST MOUNT_LOOP $LD1 $B1/$V0 +TEST MOUNT_LOOP $LD2 $B2/$V0 +TEST MOUNT_LOOP $LD3 $B3/$V0 #Tests without options 'mode=script' and 'wignore' cli1=$(echo $CLI1 | sed 's/ --mode=script//') @@ -65,4 +66,15 @@ TEST $cli1 volume add-brick $V0 $H1:$B3/$V0/brick3 #FIX-ME: Replace-brick does not work currently in the newly introduced cluster #####test framework. +$CLI1 volume stop $V0 + +UMOUNT_LOOP $B1/$V0 +UMOUNT_LOOP $B2/$V0 +UMOUNT_LOOP $B3/$V0 + +rm -f $B1/brick1 +rm -f $B2/brick2 +rm -f $B3/brick3 + + cleanup; diff --git a/tests/features/weighted-rebalance.t b/tests/features/weighted-rebalance.t index 3964fb22290..fbda32e50a2 100755 --- a/tests/features/weighted-rebalance.t +++ b/tests/features/weighted-rebalance.t @@ -47,12 +47,12 @@ TEST $CLI volume info TEST mkdir ${B0}/${V0}{1,2} TEST truncate -s $((40*1024*1024)) ${B0}/disk1 -TEST mkfs.xfs -f -i size=512 ${B0}/disk1 -TEST mount -o loop ${B0}/disk1 ${B0}/${V0}1 +TEST MKFS_LOOP -i 512 ${B0}/disk1 +TEST MOUNT_LOOP ${B0}/disk1 ${B0}/${V0}1 TEST truncate -s $((80*1024*1024)) ${B0}/disk2 -TEST mkfs.xfs -f -i size=512 ${B0}/disk2 -TEST mount -o loop ${B0}/disk2 ${B0}/${V0}2 +TEST MKFS_LOOP -i 512 ${B0}/disk2 +TEST MOUNT_LOOP ${B0}/disk2 ${B0}/${V0}2 TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2} EXPECT "$V0" volinfo_field $V0 'Volume Name' @@ -65,7 +65,7 @@ EXPECT 'Started' volinfo_field $V0 'Status' TEST $GFS -s $H0 --volfile-id $V0 $M0 TEST mkdir $M0/dir TEST touch_files -TEST umount $M0 +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 # Check that the larger brick got more of the files. nfiles=$(count_files ${B0}/${V0}2) @@ -82,10 +82,8 @@ nfiles=$(count_files ${B0}/${V0}2) #echo $nfiles $(get_xattr ${B0}/${V0}1) $(get_xattr ${B0}/${V0}2) 3>&2 2>&1 1>&3 3>&- TEST [ $nfiles -le 580 ] -exit 0 - $CLI volume stop $V0 -umount ${B0}/${V0}{1,2} +UMOUNT_LOOP ${B0}/${V0}{1,2} rm -f ${B0}/disk{1,2} cleanup diff --git a/tests/include.rc b/tests/include.rc index 3af4764b1e4..1a0fb06002f 100644 --- a/tests/include.rc +++ b/tests/include.rc @@ -652,3 +652,153 @@ fi # probably the safest option there and on anything we don't recognize, but # if you want to reduce the noise level and know the correct option for # your favorite platform please feel free to add it here. + +function SETUP_LOOP () +{ + if [ $# != 1 ] ; then + echo "SETUP_LOOP usage" >&2 + exit 1; + fi + + backend=$1 + + case ${OSTYPE} in + Linux) + losetup --find --show ${backend} + ;; + NetBSD) + vnd=`vnconfig -l|awk -F: '/not in use/{print $1; exit}'` + if [ "x${vnd}" = "x" ] ; then + echo "no more vnd" >&2 + exit 1; + fi + vnconfig ${vnd} ${backend} + echo ${vnd} + ;; + *) + echo "Please define SETUP_LOOP for ${OSTYPE} in include.rc" >&2 + exit 1; + ;; + esac +} + +function MKFS_LOOP () +{ + args=`getopt i: $*` + if [ $? -ne 0 ] ; then + echo "MKFS_LOOP usage" >&2 + exit 1; + fi + set -- ${args} + + isize="" + while test $# -gt 0; do + case "$1" in + -i) isize=$2; shift ;; + --) shift; break ;; + esac + shift + done + + dev=$1 + + case ${OSTYPE} in + Linux) + test "x${isize}" != "x" && isize="-i size=${isize}" + mkfs.xfs -f ${isize} ${dev} + ;; + NetBSD) + test "x${isize}" != "x" && isize="-i ${isize}" + + echo ${dev} | grep -q '^vnd' + if [ $? -ne 0 ] ; then + vnd=`vnconfig -l|awk -F: '/not in use/{print $1; exit}'` + if [ "x${vnd}" = "x" ] ; then + echo "no more vnd" >&2 + exit 1; + fi + vnconfig ${vnd} ${dev} + else + vnd=${dev} + fi + newfs ${isize} /dev/r${vnd}a + ;; + *) + echo "Please define MKFS_LOOP for ${OSTYPE} in include.rc" >&2 + exit 1; + ;; + esac +} + +function MOUNT_LOOP () +{ + if [ $# != 2 ] ; then + echo "MOUNT_LOOP usage" >&2 + exit 1; + fi + + dev=$1 + target=$2 + + case ${OSTYPE} in + Linux) + echo ${dev} | grep -q '^/dev/loop' + if [ $? -eq 0 ] ; then + mount -t xfs ${dev} ${target} + else + mount -o loop ${dev} ${target} + fi + ;; + NetBSD) + echo ${dev} | grep -q '^vnd' + if [ $? -ne 0 ] ; then + ino=`/usr/bin/stat -f %i ${dev}` + dev=`vnconfig -l | awk -v ino=${ino} -F'[: ]*' '($5 == ino) {print $1}'` + fi + + mount /dev/${dev}a ${target} >&2 + if [ $? -ne 0 ] ; then + echo "failed to mount /dev/${dev}a on ${target}" >&2 + exit 1 + fi + + mkdir -p ${target}/.attribute/system ${target}/.attribute/user + mount -u -o extattr ${target} >&2 + + ;; + *) + echo "Please define MOUNT_LOOP for ${OSTYPE} in include.rc" >&2 + exit 1; + ;; + esac +} + +function UMOUNT_LOOP () +{ + case ${OSTYPE} in + Linux) + force_umount $* + ;; + NetBSD) + for target in $* ; do + dev=`mount | awk -v target=${target} '($3 == target) {print $1}'` + force_umount ${target} + echo ${dev} | grep -q '^/dev/vnd' + if [ $? -eq 0 ] ; then + dev=`echo ${dev} | sed 's|^/dev/||; s|a$||'` + vnconfig -u ${dev} + else + ino=`/usr/bin/stat -f %i ${dev}` + dev=`vnconfig -l | awk -v ino=${ino} -F'[: ]*' '($5 == ino) {print $1}'` + if [ "x${dev}" != "x" ] ; then + vnconfig -u ${dev} + fi + fi + done + ;; + *) + echo "Please define UMOUNT_LOOP for ${OSTYPE} in include.rc" >&2 + exit 1; + ;; + esac +} -- cgit