From 0e32b7304dac960a09b7d425260172a47f4c762e Mon Sep 17 00:00:00 2001 From: Vijaikumar M Date: Mon, 27 Jan 2014 14:05:20 +0530 Subject: snapshot: Framework for testing snapshot This framework can be used to write functional testcase for snapshot operations Change-Id: I850d0e5021ac6c053d89c58567648e1bff273b19 Signed-off-by: Vijaikumar M Reviewed-on: http://review.gluster.org/6798 Reviewed-by: Avra Sengupta Reviewed-by: Rajesh Joseph Tested-by: Rajesh Joseph --- tests/basic/volume-snapshot.t | 78 +++++++++++++++++++ tests/cluster.rc | 4 + tests/include.rc | 4 +- tests/snapshot.rc | 173 ++++++++++++++++++++++++++++++++++++++++++ tests/volume.rc | 51 +++++++++++++ 5 files changed, 309 insertions(+), 1 deletion(-) create mode 100755 tests/basic/volume-snapshot.t create mode 100755 tests/snapshot.rc (limited to 'tests') diff --git a/tests/basic/volume-snapshot.t b/tests/basic/volume-snapshot.t new file mode 100755 index 000000000..2030efc05 --- /dev/null +++ b/tests/basic/volume-snapshot.t @@ -0,0 +1,78 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/../cluster.rc +. $(dirname $0)/../snapshot.rc + +V1="patchy2" + +function create_volumes() { + $CLI_1 volume create $V0 $H1:$L1 & + PID_1=$! + + $CLI_2 volume create $V1 $H2:$L2 $H3:$L3 & + PID_2=$! + + wait $PID_1 $PID_2 +} + +function create_snapshots() { + $CLI_1 snapshot create $V0 -n ${V0}_snap & + PID_1=$! + + $CLI_1 snapshot create $V1 -n ${V1}_snap & + PID_2=$! + + wait $PID_1 $PID_2 +} + +function delete_snapshots() { + $CLI_1 snapshot delete $V0 -s ${V0}_snap & + PID_1=$! + + $CLI_1 snapshot delete $V1 -s ${V1}_snap & + PID_2=$! + + wait $PID_1 $PID_2 +} +cleanup; + +#Create cluster with 3 nodes +TEST launch_cluster 3; +TEST setup_lvm 3 + +TEST $CLI_1 peer probe $H2; +TEST $CLI_1 peer probe $H3; +EXPECT_WITHIN 20 2 peer_count; + +create_volumes +EXPECT 'Created' volinfo_field $V0 'Status'; +EXPECT 'Created' volinfo_field $V1 'Status'; + +start_volumes 2 +EXPECT 'Started' volinfo_field $V0 'Status'; +EXPECT 'Started' volinfo_field $V1 'Status'; + +#Snapshot Operations +create_snapshots +TEST snapshot_exists ${V0}_snap +TEST snapshot_exists ${V1}_snap + +TEST $CLI_1 snapshot config $V0 snap-max-hard-limit 100 +TEST $CLI_1 snapshot config $V1 snap-max-hard-limit 100 + +#Clean up +delete_snapshots +TEST ! snapshot_exists ${V0}_snap +TEST ! snapshot_exists ${V1}_snap + +stop_force_volumes 2 +EXPECT 'Stopped' volinfo_field $V0 'Status'; +EXPECT 'Stopped' volinfo_field $V1 'Status'; + +delete_volumes 2 +TEST ! volume_exists $V0 +TEST ! volume_exists $V1 + +cleanup; diff --git a/tests/cluster.rc b/tests/cluster.rc index 1e42426f6..3b10d19f7 100755 --- a/tests/cluster.rc +++ b/tests/cluster.rc @@ -104,5 +104,9 @@ function define_clis() { eval "CLI_$i='$CLI --glusterd-sock=${!b}/glusterd/gd.sock'"; eval "CLI$i='$CLI --glusterd-sock=${!b}/glusterd/gd.sock'"; done + CLI="$CLI_1" } +function peer_count() { + $CLI_1 peer status | grep 'Peer in Cluster (Connected)' | wc -l +} diff --git a/tests/include.rc b/tests/include.rc index bb541eaa1..042626cb8 100644 --- a/tests/include.rc +++ b/tests/include.rc @@ -186,13 +186,14 @@ function cleanup() killall -15 glusterfs glusterfsd glusterd 2>/dev/null || true; killall -9 glusterfs glusterfsd glusterd 2>/dev/null || true; + type cleanup_lvm &>/dev/null && cleanup_lvm + MOUNTPOINTS=`mount | grep "$B0/" | awk '{print $3}'` for m in $MOUNTPOINTS; do umount $m done - LOOPDEVICES=`losetup -a | grep "$B0/" | awk '{print $1}' | tr -d :` for l in $LOOPDEVICES; do @@ -206,6 +207,7 @@ function cleanup() umount -l $M1 2>/dev/null || true; umount -l $N0 2>/dev/null || true; umount -l $N1 2>/dev/null || true; + } function volinfo_field() diff --git a/tests/snapshot.rc b/tests/snapshot.rc new file mode 100755 index 000000000..fa308e599 --- /dev/null +++ b/tests/snapshot.rc @@ -0,0 +1,173 @@ +#!/bin/bash + +LVM_DEFINED=0 +LVM_PREFIX="patchy_snap" +LVM_COUNT=0 +VHD_SIZE="1G" + +function init_lvm() { + if [ "$1" == "" ]; then + echo "Error: Invalid argument supplied" + return 1 + fi + LVM_COUNT=$1 + + if [ "$2" != "" ]; then + VHD_SIZE=$2 + fi + + local b + local i + + for i in `seq 1 $LVM_COUNT`; do + b="B$i" + if [ "${!b}" = "" ]; then + echo "Error: $b not defined." + echo "Please run launch_cluster before creating lvm" + return 1 + fi + + eval "L$i=${!b}/${LVM_PREFIX}_mnt" + l="L$i" + mkdir -p ${!l} + if [ $? -ne 0 ]; then + echo "Error: failed to create dir ${!l}" + return 1 + fi + + eval "VG$i=${LVM_PREFIX}_vg_${i}" + done + + LVM_DEFINED=1 + return 0 +} + +function setup_lvm() { + init_lvm $@ || return 1 + _setup_lvm + return 0 +} + +function cleanup_lvm() { + pkill gluster + if [ "$LVM_DEFINED" = "1" ]; then + _cleanup_lvm + fi + + _cleanup_lvm_again >/dev/null 2>&1 + return 0 +} + +######################################################## +# Private Functions +######################################################## +function _setup_lvm() { + local count=$LVM_COUNT + local b + local i + + for i in `seq 1 $count`; do + b="B$i" + + _create_vhd ${!b} $i + _create_lv ${!b} $i + _mount_lv $i + done +} + +function _cleanup_lvm() { + local count=$LVM_COUNT + local b + local i + + for i in `seq 1 $count`; do + b="B$i" + _umount_lv $i + _remove_lv $i + _remove_vhd ${!b} + done +} + +function _cleanup_lvm_again() { + local file + + mount | grep $LVM_PREFIX | awk '{print $3}' | xargs umount -f + + /sbin/vgs | grep $LVM_PREFIX | awk '{print $1}' | xargs vgremove -f + + find $B0 -name "${LVM_PREFIX}_loop" | xargs losetup -d + + find $B0 -name "${LVM_PREFIX}*" | xargs rm -rf + + find /run/gluster/snaps -name "*${LVM_PREFIX}*" | xargs rm -rf + + for file in `ls /run/gluster/snaps`; do + find /run/gluster/snaps/$file -mmin -2 | xargs rm -rf + done +} + +######################################################## +######################################################## +function _create_vhd() { + local dir=$1 + local num=$2 + local loop_num=`expr $2 + 8` + + fallocate -l${VHD_SIZE} $dir/${LVM_PREFIX}_vhd + mknod -m660 $dir/${LVM_PREFIX}_loop b 7 $loop_num + /sbin/losetup $dir/${LVM_PREFIX}_loop $dir/${LVM_PREFIX}_vhd +} + +function _create_lv() { + local dir=$1 + local num=$2 + local vg="VG$num" + + /sbin/pvcreate $dir/${LVM_PREFIX}_loop + /sbin/vgcreate ${!vg} $dir/${LVM_PREFIX}_loop + + /sbin/lvcreate -l 100%FREE -T /dev/${!vg}/thinpool + /sbin/lvcreate -V $VHD_SIZE -T /dev/${!vg}/thinpool -n brick_lvm + + mkfs.xfs -f /dev/${!vg}/brick_lvm +} + +function _mount_lv() { + local num=$1 + local vg="VG$num" + local l="L$num" + + mount -t xfs -o nouuid /dev/${!vg}/brick_lvm ${!l} +} + +function _umount_lv() { + local num=$1 + local l="L$num" + + umount -f ${!l} 2>/dev/null || true + rmdir ${!l} 2>/dev/null || true +} + +function _remove_lv() { + local num=$1 + local vg="VG$num" + + vgremove -f ${!vg} +} + +function _remove_vhd() { + local dir=$1 + + losetup -d $dir/${LVM_PREFIX}_loop + rm -f $dir/${LVM_PREFIX}_loop + rm -f $dir/${LVM_PREFIX}_vhd +} + +######################################################## +# Utility Functions +######################################################## +function snapshot_exists() { + local snapname=$1 + $CLI_1 snapshot list | egrep -q "\b$snapname\b" + return $? +} diff --git a/tests/volume.rc b/tests/volume.rc index 987122420..171f8d709 100644 --- a/tests/volume.rc +++ b/tests/volume.rc @@ -272,3 +272,54 @@ function get_backend_paths { getfattr -m . -n trusted.glusterfs.pathinfo $path | tr ' ' '\n' | sed -n 's/.*/\1/p' } + +function do_volume_operations() { + local operation=$1 + local count=$2 + local force=$3 + + local pids=() + local cli + local v + + for i in `seq 1 $count`; do + cli="CLI_$i" + v="V`expr $i - 1`" + ${!cli} volume $operation ${!v} $force & + pids[$i]=$! + done + + for i in `seq 1 $count`; do + wait ${pids[$i]} + done +} + +function start_volumes() { + do_volume_operations start $1 +} + +function stop_volumes() { + do_volume_operations stop $1 +} + +function start_force_volumes() { + do_volume_operations start $1 force +} + +function stop_force_volumes() { + do_volume_operations stop $1 force +} + +function delete_volumes() { + do_volume_operations delete $1 +} + +function volume_exists() { + local volname=$1 + $CLI volume info $volname 2>&1 | grep -q 'does not exist' + if [ $? -eq 0 ]; then + return 1 + else + return 0 + fi +} -- cgit