diff options
-rw-r--r-- | tests/README.md | 6 | ||||
-rw-r--r-- | tests/geo-rep/compare-arequal.py | 244 | ||||
-rw-r--r-- | tests/geo-rep/compare-gfid.py | 95 | ||||
-rw-r--r-- | tests/geo-rep/geo-rep-config.rc | 14 | ||||
-rw-r--r-- | tests/geo-rep/geo-rep-helper.rc | 296 | ||||
-rw-r--r-- | tests/geo-rep/georep-rsync-changelog.t | 73 | ||||
-rw-r--r-- | tests/geo-rep/georep-rsync-hybrid.t | 65 | ||||
-rw-r--r-- | tests/geo-rep/georep-setup.t | 33 | ||||
-rw-r--r-- | tests/geo-rep/georep-tarssh-changelog.t | 73 | ||||
-rw-r--r-- | tests/geo-rep/georep-tarssh-hybrid.t | 65 | ||||
-rw-r--r-- | tests/include.rc | 10 | ||||
-rwxr-xr-x | tests/utils/create-files.py | 634 | ||||
-rw-r--r-- | tests/volume.rc | 32 |
13 files changed, 1511 insertions, 129 deletions
diff --git a/tests/README.md b/tests/README.md index 50e1a9d5005..09c98576987 100644 --- a/tests/README.md +++ b/tests/README.md @@ -5,6 +5,11 @@ Regression tests framework for GlusterFS - Build and install the version of glusterfs with your changes. Make sure the installed version is accessible from $PATH. +## Prereq for geo-rep regression tests. +- Passwordless ssh on the test system to itself +- arequal-checksum installed on the test-system. + You can find the repo here - https://github.com/raghavendrabhat/arequal + ## How-To - To mount glusterfs, NEVER use 'mount -t glusterfs', instead use 'glusterfs -s ' method. This is because with the patch build setup @@ -30,6 +35,7 @@ Regression tests framework for GlusterFS `tests/bugs/` directory. - a glob pattern (see `man 7 glob` for mor info on globs) +- To execute single ".t" file, use "prove -vf /path/to/.t" - If some test cases fail, report to GlusterFS community at `gluster-devel@gluster.org`. diff --git a/tests/geo-rep/compare-arequal.py b/tests/geo-rep/compare-arequal.py new file mode 100644 index 00000000000..6d9850337b8 --- /dev/null +++ b/tests/geo-rep/compare-arequal.py @@ -0,0 +1,244 @@ +#!/usr/bin/python + +import sys +import os +import re +import tempfile +import subprocess +from multiprocessing import Pool +import time +from optparse import OptionParser + +slave_dict = {} +master_res = '' + + +def get_arequal_checksum(me, mnt): + global slave_dict + master_cmd = ['./tests/utils/arequal-checksum', '-p', mnt] + print "Calculating "+me+" checksum ..." + print "" + p = subprocess.Popen(master_cmd, stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + ret = p.wait() + stdout, stderr = p.communicate() + if ret: + print "Failed to get the checksum of " + me + " with following error" + print stderr + return 1 + else: + return stdout + + +def get_file_count(me, mnt): + global slave_dict + master_cmd = ['find ' + mnt + ' |wc -l'] + print "Calculating " + me + " files ..." + print "" + p = subprocess.Popen(master_cmd, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, shell=True) + ret = p.wait() + stdout, stderr = p.communicate() + if ret: + print "Failed to get the count of files in " + me + + " with following error" + print stderr + return 1 + else: + return stdout.strip() + + +def compare_checksum(master_mnt, slave_dict): + proc = len(slave_dict)+1 + pool = Pool(processes=proc) + master_res = pool.apply_async(get_arequal_checksum, args=("master", + master_mnt)) + results = [(slave, pool.apply_async(get_arequal_checksum, + args=(slave_dict[slave]["vol"], + slave_dict[slave]["mnt"]))) + for slave in slave_dict] + + pool.close() + pool.join() + for slave, result in results: + slave_dict[slave]["res"] = result.get() + # exception: OSError + + master_res = master_res.get() + + print "arequal-checksum of master is : \n %s" % master_res + for slave in slave_dict: + print "arequal-checksum of geo_rep_slave %s: \n %s" % ( + slave_dict[slave]["vol"], slave_dict[slave]["res"]) + + master_files, master_total = re.findall('Total[\s]+:\s(\w+)', master_res) + master_reg_meta, master_reg = re.findall('Regular files[\s]+:\s(\w+)', + master_res)[1:] + master_dir_meta, master_dir = re.findall('Directories[\s]+:\s(\w+)', + master_res)[1:] + + ret = 0 + for slave in slave_dict: + slave_dict[slave]["files"], slave_dict[slave]["total"] = re.findall( + 'Total[\s]+:\s(\w+)', slave_dict[slave]["res"]) + slave_dict[slave]["reg_meta"], slave_dict[slave]["reg"] = re.findall( + 'Regular files[\s]+:\s(\w+)', slave_dict[slave]["res"])[1:] + slave_dict[slave]["dir_meta"], slave_dict[slave]["dir"] = re.findall( + 'Directories[\s]+:\s(\w+)', slave_dict[slave]["res"])[1:] + + if master_reg_meta != slave_dict[slave]["reg_meta"]: + print ("Meta data checksum for regular files doesn't match " + + "between master and "+slave_dict[slave]["vol"]) + ret = 67 + + if master_dir_meta != slave_dict[slave]["dir_meta"]: + print ("Meta data checksum for directories doesn't match " + + "between master and "+slave_dict[slave]["vol"]) + ret = 68 + + if master_files != slave_dict[slave]["files"]: + print ("Failed to sync all the files from master to " + + slave_dict[slave]["vol"]) + ret = 1 + + if master_total != slave_dict[slave]["total"]: + if master_reg != slave_dict[slave]["reg"]: + print ("Checksum for regular files doesn't match " + + "between master and "+slave_dict[slave]["vol"]) + ret = 1 + elif master_dir != slave_dict[slave]["dir"]: + print ("Checksum for directories doesn't match between " + + "master and "+slave_dict[slave]["vol"]) + ret = 1 + else: + print ("Checksum for symlinks or others doesn't match " + + "between master and "+slave_dict[slave]["vol"]) + ret = 1 + + if ret is 0: + print ("Successfully synced all the files from master " + + "to the "+slave_dict[slave]["vol"]) + + return ret + + +def compare_filecount(master_mnt, slave_dict): + proc = len(slave_dict)+1 + pool = Pool(processes=proc) + + master_res = pool.apply_async(get_file_count, args=("master", master_mnt)) + results = [(slave, pool.apply_async(get_file_count, + args=(slave_dict[slave]["vol"], + slave_dict[slave]["mnt"]))) + for slave in slave_dict] + + pool.close() + pool.join() + for slave, result in results: + slave_dict[slave]["res"] = result.get() + + master_res = master_res.get() + ret = 0 + for slave in slave_dict: + if not master_res == slave_dict[slave]["res"]: + print ("files count between master and " + + slave_dict[slave]["vol"]+" doesn't match yet") + ret = 1 + + return ret + + +def parse_url(url): + match = re.search(r'([\w - _ @ \.]+)::([\w - _ @ \.]+)', url) + if match: + node = match.group(1) + vol = match.group(2) + else: + print 'given url is not a valid.' + sys.exit(1) + return node, vol + + +def cleanup(master_mnt, slave_dict): + try: + os.system("umount %s" % (master_mnt)) + except: + print("Failed to unmount the master volume") + + for slave in slave_dict: + + try: + os.system("umount %s" % (slave_dict[slave]["mnt"])) + os.removedirs(slave_dict[slave]["mnt"]) + except: + print("Failed to unmount the "+slave+" volume") + + os.removedirs(master_mnt) + + +def main(): + + slaves = args[1:] + + masterurl = args[0] + master_node, mastervol = parse_url(masterurl) + master_mnt = tempfile.mkdtemp() + + i = 1 + for slave in slaves: + slave_dict["slave"+str(i)] = {} + slave_dict["slave"+str(i)]["node"], slave_dict[ + "slave"+str(i)]["vol"] = parse_url(slave) + slave_dict["slave"+str(i)]["mnt"] = tempfile.mkdtemp() + i += 1 + + try: + print ("mounting the master volume on "+master_mnt) + os.system("glusterfs -s %s --volfile-id %s %s" % (master_node, + mastervol, + master_mnt)) + time.sleep(3) + except: + print("Failed to mount the master volume") + + for slave in slave_dict: + print slave + print slave_dict[slave] + try: + print ("mounting the slave volume on "+slave_dict[slave]['mnt']) + os.system("glusterfs -s %s --volfile-id %s %s" % ( + slave_dict[slave]["node"], slave_dict[slave]["vol"], + slave_dict[slave]["mnt"])) + time.sleep(3) + except: + print("Failed to mount the "+slave+" volume") + + res = 0 + if option.check == "arequal": + res = compare_checksum(master_mnt, slave_dict) + elif option.check == "find": + res = compare_filecount(master_mnt, slave_dict) + else: + print "wrong options given" + + cleanup(master_mnt, slave_dict) + + sys.exit(res) + + +if __name__ == '__main__': + + usage = "usage: %prog [option] <master-host>::<master-vol> \ + <slave1-host>::<slave1-vol> . . ." + parser = OptionParser(usage=usage) + parser.add_option("-c", dest="check", action="store", type="string", + default="arequal", + help="size of the files to be used [default: %default]") + (option, args) = parser.parse_args() + if not args: + print "usage: <script> [option] <master-host>::<master-vol>\ + <slave1-host>::<slave1-vol> . . ." + print "" + sys.exit(1) + + main() diff --git a/tests/geo-rep/compare-gfid.py b/tests/geo-rep/compare-gfid.py new file mode 100644 index 00000000000..432c1d77f31 --- /dev/null +++ b/tests/geo-rep/compare-gfid.py @@ -0,0 +1,95 @@ +#!/usr/bin/python + +# Most of this script was written by M S Vishwanath Bhat (vbhat@redhat.com) + +import re +import os +import sys +import xattr +import tempfile + + +def parse_url(url): + match = re.search(r'([\w - _ @ \.]+)::([\w - _ @ \.]+)', url) + if match: + node = match.group(1) + vol = match.group(2) + else: + print 'given url is not a valid url.' + sys.exit(1) + return node, vol + + +def cleanup(master_mnt, slave_mnt): + try: + os.system("umount %s" % (master_mnt)) + except: + print("Failed to unmount the master volume") + try: + os.system("umount %s" % (slave_mnt)) + except: + print("Failed to unmount the slave volume") + + os.removedirs(master_mnt) + os.removedirs(slave_mnt) + + +def main(): + + masterurl = sys.argv[1] + slaveurl = sys.argv[2] + slave_node, slavevol = parse_url(slaveurl) + master_node, mastervol = parse_url(masterurl) + + master_mnt = tempfile.mkdtemp() + slave_mnt = tempfile.mkdtemp() + + try: + print "Mounting master volume on a temp mnt_pnt" + os.system("glusterfs -s %s --volfile-id %s %s" % (master_node, + mastervol, + master_mnt)) + except: + print("Failed to mount the master volume") + cleanup(master_mnt, slave_mnt) + sys.exit(1) + + try: + print "Mounting slave voluem on a temp mnt_pnt" + os.system("glusterfs -s %s --volfile-id %s %s" % (slave_node, slavevol, + slave_mnt)) + except: + print("Failed to mount the master volume") + cleanup(master_mnt, slave_mnt) + sys.exit(1) + + slave_file_list = [slave_mnt] + for top, dirs, files in os.walk(slave_mnt, topdown=False): + for subdir in dirs: + slave_file_list.append(os.path.join(top, subdir)) + for file in files: + slave_file_list.append(os.path.join(top, file)) + + # chdir and then get the gfid, so that you don't need to replace + gfid_attr = 'glusterfs.gfid' + ret = 0 + for sfile in slave_file_list: + mfile = sfile.replace(slave_mnt, master_mnt) + if xattr.getxattr(sfile, gfid_attr, True) != xattr.getxattr( + mfile, gfid_attr, True): + print ("gfid of file %s in slave is different from %s" + + " in master" % (sfile, mfile)) + ret = 1 + + cleanup(master_mnt, slave_mnt) + + sys.exit(ret) + + +if __name__ == '__main__': + if len(sys.argv[1:]) < 2: + print ("Please pass master volume name and slave url as arguments") + print ("USAGE : python <script> <master-host>::<master-vol> " + + "<slave-host>::<slave-vol>") + sys.exit(1) + main() diff --git a/tests/geo-rep/geo-rep-config.rc b/tests/geo-rep/geo-rep-config.rc new file mode 100644 index 00000000000..53489082574 --- /dev/null +++ b/tests/geo-rep/geo-rep-config.rc @@ -0,0 +1,14 @@ +#!/bin/bash + +#LOG_DIR="$DEFAULT_LOG_FILE_DIRECTORY/glusterfs/geo-rep-auto-logs" +LOG_DIR="/usr/local/var/log/geo-rep-auto-logs" +LOG_FILE="$LOG_DIR/geo-rep-auto.log.`date +%Y%m%d-%H%M%S`" +FILE_TYPE="text" # it can text, sparse or tar +nf="5" # number of files in each directory when DIR_STR is MULTI +ns="500" # number of files when DIR_STR is SINGLE +DIR_STR="MULTI" # It can be either SINGLE or MULTI + +# Not using this option for now, can be used in the future. +SYNC_MODE="rsync" # this option can take another option "tarssh" + +mkdir -p $LOG_DIR diff --git a/tests/geo-rep/geo-rep-helper.rc b/tests/geo-rep/geo-rep-helper.rc new file mode 100644 index 00000000000..de8a6817305 --- /dev/null +++ b/tests/geo-rep/geo-rep-helper.rc @@ -0,0 +1,296 @@ +#!/bin/bash + +function geo_rep_checkpoint_status() +{ + echo "Verifying the sync status using geo-rep checkpoint" >> $LOG_FILE + local timeout=300 + local temp_status="NOTOK" + echo "setting the checkpoint" >> $LOG_FILE + + $CLI volume geo-rep $GMV0 $H0::$GSV0 config checkpoint now >> $LOG_FILE 2>&1 + +# There is a bug, where in after checkpoint set, geo-rep status still +# shows the old data for the first execution of geo-rep status. Running +#geo-rep status to clear that. + $CLI volume geo-replication $GMV0 $H0::$GSV0 status >> $LOG_FILE 2>&1 + + while [ $timeout -gt 0 ] && [ $temp_status == "NOTOK" ]; + do + $CLI volume geo-replication $GMV0 $H0::$GSV0 status | \ + egrep -i "not reached yet" 2>&1 >/dev/null + test $? -ne 0 && temp_status="completed" + echo "Waiting for the files to sync ..." >> $LOG_FILE + sleep 20 + timeout=`expr $timeout - 20` + echo "temp_status is $temp_status" >> $LOG_FILE + echo "geo-rep status output:" >> $LOG_FILE + $CLI volume geo-replication $GMV0 $H0::$GSV0 status detail >> \ + $LOG_FILE 2>&1 + + done + + echo "resetting the geo-rep checkpoint" >> $LOG_FILE + $CLI volume geo-rep $GMV0 $H0::$GSV0 config \!checkpoint >> $LOG_FILE 2>&1 + + if test $temp_status = "completed" ; then + echo "geo-rep checkpoint has completed" >> $LOG_FILE + return 0 + elif test $temp_status = "NOTOK" ; then + echo "geo-rep checkpoint has failed to complete within 300 seconds" >> \ + $LOG_FILE + return 1 + fi +} + + + +function geo_rep_arequal_status() +{ + + echo "Verifying the sync status using arequal" >> $LOG_FILE + local timeout=300 + local temp_status="NOTOK" + local comp_arequal="$(dirname $0)/compare-arequal.py" + + while [ $timeout -gt 0 ] && [ $temp_status == "NOTOK" ]; + do + echo "Waiting for the files to sync ..." >> $LOG_FILE + sleep 20 + timeout=`expr $timeout - 20` + + echo "calculating and comparing arequal checksum between $GMV0 and \ +$GSV0 " >> $LOG_FILE + python $comp_arequal $H0::$GMV0 $H0::$GSV0 >> $LOG_FILE 2>&1 + + local ret=$? + # There is a bug, where sometimes metadata checksum of directories + # and regular files don't match. This is to avoid that for now. + if [[ $ret -eq 0 || $ret -eq 67 || $ret -eq 68 ]] ;then + temp_status="completed" + fi + + done + + if test $temp_status = "completed" ; then + echo "checksum between master and slave match " >> $LOG_FILE + return 0 + elif test $temp_status = "NOTOK" ; then + echo "checksum between master and slave doesn't match" >> $LOG_FILE + return 1 + fi +} + + +function geo_rep_filecount_status() +{ + + echo "Verifying the sync status through files count" >> $LOG_FILE + local timeout=300 + local temp_status="NOTOK" + local comp_arequal="$(dirname $0)/compare-arequal.py" + + while [ $timeout -gt 0 ] && [ $temp_status == "NOTOK" ]; + do + echo "Waiting for the files to sync ..." >> $LOG_FILE + sleep 20 + timeout=`expr $timeout - 20` + + echo "calculating and comparing files count between $GMV0 and \ +$GSV0 " >> $LOG_FILE + python $comp_arequal -c "find" $H0::$GMV0 $H0::$GSV0 >> $LOG_FILE 2>&1 + + if [ $? -eq 0 ];then + temp_status="completed" + fi + + done + + if test $temp_status = "completed" ; then + echo "files count between master and slave match " >> $LOG_FILE + return 0 + elif test $temp_status = "NOTOK" ; then + echo "files count between master and slave doesn't match" >> $LOG_FILE + return 1 + fi +} + + + +function check_status_arequal() +{ +# checkpoint is failing to reach even though all the files got synced in the latest build. +# Hence not using checkpoint to check for sync status. +# geo_rep_checkpoint_status + local comp_arequal="$(dirname $0)/compare-arequal.py" + local comp_gfid="$(dirname $0)/compare-gfid.py" + + geo_rep_filecount_status + + geo_rep_arequal_status + + echo "calculating and comparing gfids between $GMV0 and $GSV0 " \ + >> $LOG_FILE + python $comp_gfid $H0::$GMV0 $H0::$GSV0 >> $LOG_FILE 2>&1 + + if [ $? != 0 ]; then + return 1 + else + echo "gfids between master and slave match" >> $LOG_FILE + fi + + echo "calculating and comparing arequal checksum between $GMV0 and $GSV0 " \ + >> $LOG_FILE + python $comp_arequal $H0::$GMV0 $H0::$GSV0 >> $LOG_FILE 2>&1 + + local rett=$? + + if [[ $rett -eq 0 || $rett -eq 67 || $rett -eq 68 ]] ;then + reta=0 + else + reta=1 + fi + + return $reta + +} + + + + +function create_data() +{ + fop=$1 + MNT_PNT=$2 + create_data="$(dirname $0)/../utils/create-files.py" + + if [ $DIR_STR == "MULTI" ];then + + python $create_data -n $nf --multi -b 10 -d 10 --random --max=2K \ + --min=1K -t $FILE_TYPE --fop=$fop $MNT_PNT >> $LOG_FILE 2>&1 + + elif [ $DIR_STR == "SINGLE" ];then + + python $create_data -n $ns --random --max=2K --min=1K -t $FILE_TYPE \ + --fop=$fop $MNT_PNT >> $LOG_FILE 2>&1 + + else + + echo "Wrong option for the create-files" >> $LOG_FILE + + fi + +} + + +function result() +{ + +local ret=$1 +local test=$2 +if [ $ret -ne 0 ]; then + echo -e "\n[ FAIL ] : $test has failed" >> $LOG_FILE + exit 1 +else + echo -e "\n[ PASS ] : $test has passed" >> $LOG_FILE +fi + +} + + +## hybrid crawl test-cases + +function hybrid_mode_test() +{ + local FOP=$1 + local MNT_PNT=$2 + echo -e "\n:::::::::::::::::::::::" >> $LOG_FILE + echo "Start of hybrid-mode-$DIR_STR-$FILE_TYPE-$FOP-test with \ +$MNT_PNT client" >> $LOG_FILE + echo -e ":::::::::::::::::::::::\n" >> $LOG_FILE + + local ret=0 + echo "stopping geo-rep session before creating data" >> $LOG_FILE + + $CLI volume geo-rep $GMV0 $H0::$GSV0 stop force >> $LOG_FILE 2>&1 + + if [ $? -ne 0 ]; then + echo "stopping geo-rep session has failed" >> $LOG_FILE + return 1 + fi + + create_data $FOP $MNT_PNT + + $CLI volume geo-rep $GMV0 $H0::$GSV0 start >> $LOG_FILE 2>&1 + + if [ $? -ne 0 ]; then + echo "starting geo-rep session has failed" >> $LOG_FILE + return 1 + fi + + check_status_arequal + + if [ $? -ne 0 ]; then + ret=1 + fi + + result $ret "hybrid-mode-$DIR_STR-$FILE_TYPE-$FOP-test with $CLIENT client" + + return $ret + +} + +#### Changelog based test-cases + +function changelog_mode_test() +{ + local FOP=$1 + local MNT_PNT=$2 + echo -e "\n:::::::::::::::::::::::" >> $LOG_FILE + echo "Start of changelog-mode-$DIR_STR-$FILE_TYPE-$FOP-test with \ +$MNT_PNT client" >> $LOG_FILE + echo -e ":::::::::::::::::::::::\n" >> $LOG_FILE + + local ret=0 + + create_data $FOP $MNT_PNT + + check_status_arequal + + if [ $? -ne 0 ]; then + ret=1 + fi + + result $ret "basic-changelog-$DIR_STR-$FILE_TYPE-$FOP-test with $CLIENT \ +client" + + return $ret +} + + +function changelog_mode_remove_test() +{ + MNT_PNT=$1 + + echo -e "\n:::::::::::::::::::::::" >> $LOG_FILE + echo "Start of changelog-mode-$DIR_STR-$FILE_TYPE-remove-test with \ +$MNT_PNT client" >> $LOG_FILE + echo -e ":::::::::::::::::::::::\n" >> $LOG_FILE + + local ret=0 + + if [ ! -z $MNT_PNT ]; then + rm -rvf $MNT_PNT >> $LOG_FILE + else + echo "Value of MNT_PNT is NULL" >> $LOG_FILE + fi + + check_status_arequal + if [ $? -ne 0 ]; then + ret=1 + fi + + result $ret "chnagelog-mode-$DIR_STR-$FILE_TYPE-remove-test with \ +$MNT_PNT client" + + return $ret +} diff --git a/tests/geo-rep/georep-rsync-changelog.t b/tests/geo-rep/georep-rsync-changelog.t new file mode 100644 index 00000000000..eda06a36df6 --- /dev/null +++ b/tests/geo-rep/georep-rsync-changelog.t @@ -0,0 +1,73 @@ +#!/bin/bash + +# Following tests involves geo-rep regresseion tests with changelog +# as change detector, and rsync as sync mode on both fuse and nfs mount + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/geo-rep-helper.rc +. $(dirname $0)/geo-rep-config.rc + +cleanup; +AREQUAL_PATH=$(dirname $0)/../utils +CFLAGS="" +test "`uname -s`" != "Linux" && { + CFLAGS="$CFLAGS -I$(dirname $0)/../../../contrib/argp-standalone "; + CFLAGS="$CFLAGS -L$(dirname $0)/../../../contrib/argp-standalone -largp "; + CFLAGS="$CFLAGS -lintl"; +} +build_tester $AREQUAL_PATH/arequal-checksum.c $CFLAGS + +TEST glusterd +TEST pidof glusterd + +setup_georep ; + +# start of tests on fuse mount + +TEST glusterfs -s $H0 --volfile-id $GMV0 $M0 + +TEST changelog_mode_test "create" $M0 + +TEST changelog_mode_test "chmod" $M0 + +TEST changelog_mode_test "chown" $M0 + +TEST changelog_mode_test "chgrp" $M0 + +# Bug 1083963 +#TEST changelog_mode_test "rename" $M0 + +TEST changelog_mode_test "truncate" $M0 + +TEST changelog_mode_test "symlink" $M0 + +# Bug 1003020 +#TEST changelog_mode_test "hardlink" $M0 + +#TEST changelog_mode_remove_test $M0 + +# start of tests on nfs mount + +TEST mount -t nfs -o vers=3,nolock $H0:$GMV0 $N0 + +TEST changelog_mode_test "create" $N0 + +TEST changelog_mode_test "chmod" $N0 + +TEST changelog_mode_test "chown" $N0 + +TEST changelog_mode_test "chgrp" $N0 + +#TEST changelog_mode_test "rename" $N0 + +TEST changelog_mode_test "truncate" $N0 + +TEST changelog_mode_test "symlink" $N0 + +#TEST changelog_mode_test "hardlink" $N0 + +#TEST changelog_mode_remove_test $N0 + +TEST rm -rf $AREQUAL_PATH/arequal-checksum +cleanup_georep; diff --git a/tests/geo-rep/georep-rsync-hybrid.t b/tests/geo-rep/georep-rsync-hybrid.t new file mode 100644 index 00000000000..af23a526ffb --- /dev/null +++ b/tests/geo-rep/georep-rsync-hybrid.t @@ -0,0 +1,65 @@ +#!/bin/bash + +# Following tests involves geo-rep tests with hybrid crawl +# as change detector, and rsync as sync mode on both fuse and nfs mount + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/geo-rep-helper.rc +. $(dirname $0)/geo-rep-config.rc + +cleanup; + +AREQUAL_PATH=$(dirname $0)/../utils +CFLAGS="" +test "`uname -s`" != "Linux" && { + CFLAGS="$CFLAGS -I$(dirname $0)/../../../contrib/argp-standalone "; + CFLAGS="$CFLAGS -L$(dirname $0)/../../../contrib/argp-standalone -largp "; + CFLAGS="$CFLAGS -lintl"; +} +build_tester $AREQUAL_PATH/arequal-checksum.c $CFLAGS + +TEST glusterd +TEST pidof glusterd + +setup_georep ; + +# start of tests on fuse mount + +TEST glusterfs -s $H0 --volfile-id $GMV0 $M0 + +TEST hybrid_mode_test "create" $M0 + +TEST hybrid_mode_test "chmod" $M0 + +TEST hybrid_mode_test "chown" $M0 + +TEST hybrid_mode_test "chgrp" $M0 + +TEST hybrid_mode_test "truncate" $M0 + +TEST hybrid_mode_test "symlink" $M0 + +#TEST hybrid_mode_test "hardlink" $M0 + +# start of tests on nfs mount + +TEST mount -t nfs -o vers=3,nolock $H0:$GMV0 $N0 + +TEST hybrid_mode_test "create" $N0 + +TEST hybrid_mode_test "chmod" $N0 + +TEST hybrid_mode_test "chown" $N0 + +TEST hybrid_mode_test "chgrp" $N0 + +TEST hybrid_mode_test "truncate" $N0 + +TEST hybrid_mode_test "symlink" $N0 + +#TEST hybrid_mode_test "hardlink" $N0 + +TEST rm -rf $AREQUAL_PATH/arequal-checksum + +cleanup_georep; diff --git a/tests/geo-rep/georep-setup.t b/tests/geo-rep/georep-setup.t new file mode 100644 index 00000000000..75c379c8486 --- /dev/null +++ b/tests/geo-rep/georep-setup.t @@ -0,0 +1,33 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc + +cleanup; + +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $GMV0 replica 2 $H0:$B0/${GMV0}{1,2,3,4}; + +TEST $CLI volume start $GMV0 + +TEST $CLI volume create $GSV0 replica 2 $H0:$B0/${GSV0}{1,2,3,4}; + +TEST $CLI volume start $GSV0 + +TEST $CLI system:: execute gsec_create + +TEST $CLI volume geo-rep $GMV0 $H0::$GSV0 create push-pem + +TEST $CLI volume geo-rep $GMV0 $H0::$GSV0 start + +sleep 80 # after start geo-rep takes a minute to get stable + +TEST ! "$CLI volume geo-rep $GMV0 $H0::$GSV0 status | egrep -i 'faulty'" + +TEST "$CLI volume geo-rep $GMV0 $H0::$GSV0 status | egrep -i 'Changelog crawl'" + +TEST $CLI volume geo-rep $GMV0 $H0::$GSV0 stop + +TEST $CLI volume geo-rep $GMV0 $H0::$GSV0 delete diff --git a/tests/geo-rep/georep-tarssh-changelog.t b/tests/geo-rep/georep-tarssh-changelog.t new file mode 100644 index 00000000000..1f0e817f551 --- /dev/null +++ b/tests/geo-rep/georep-tarssh-changelog.t @@ -0,0 +1,73 @@ +#!/bin/bash + +# Following tests involves geo-rep regresseion tests with changelog +# as change detector, and rsync as sync mode on both fuse and nfs mount + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/geo-rep-helper.rc +. $(dirname $0)/geo-rep-config.rc + +cleanup; + +AREQUAL_PATH=$(dirname $0)/../utils +CFLAGS="" +test "`uname -s`" != "Linux" && { + CFLAGS="$CFLAGS -I$(dirname $0)/../../../contrib/argp-standalone "; + CFLAGS="$CFLAGS -L$(dirname $0)/../../../contrib/argp-standalone -largp "; + CFLAGS="$CFLAGS -lintl"; +} +build_tester $AREQUAL_PATH/arequal-checksum.c $CFLAGS + +TEST glusterd +TEST pidof glusterd + +setup_georep ; + +# start of tests on fuse mount + +TEST glusterfs -s $H0 --volfile-id $GMV0 $M0 + +TEST changelog_mode_test "create" $M0 + +TEST changelog_mode_test "chmod" $M0 + +TEST changelog_mode_test "chown" $M0 + +TEST changelog_mode_test "chgrp" $M0 + +#TEST changelog_mode_test "rename" $M0 + +TEST changelog_mode_test "truncate" $M0 + +TEST changelog_mode_test "symlink" $M0 + +#TEST changelog_mode_test "hardlink" $M0 + +#TEST changelog_mode_remove_test $M0 + +# start of tests on nfs mount + +TEST mount -t nfs -o vers=3,nolock $H0:$GMV0 $N0 + +TEST changelog_mode_test "create" $N0 + +TEST changelog_mode_test "chmod" $N0 + +TEST changelog_mode_test "chown" $N0 + +TEST changelog_mode_test "chgrp" $N0 + +#TEST changelog_mode_test "rename" $N0 + +TEST changelog_mode_test "truncate" $N0 + +TEST changelog_mode_test "symlink" $N0 + +#TEST changelog_mode_test "hardlink" $N0 + +#TEST changelog_mode_remove_test $N0 + +TEST rm -rf $AREQUAL_PATH/arequal-checksum + +cleanup_georep; diff --git a/tests/geo-rep/georep-tarssh-hybrid.t b/tests/geo-rep/georep-tarssh-hybrid.t new file mode 100644 index 00000000000..af23a526ffb --- /dev/null +++ b/tests/geo-rep/georep-tarssh-hybrid.t @@ -0,0 +1,65 @@ +#!/bin/bash + +# Following tests involves geo-rep tests with hybrid crawl +# as change detector, and rsync as sync mode on both fuse and nfs mount + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/geo-rep-helper.rc +. $(dirname $0)/geo-rep-config.rc + +cleanup; + +AREQUAL_PATH=$(dirname $0)/../utils +CFLAGS="" +test "`uname -s`" != "Linux" && { + CFLAGS="$CFLAGS -I$(dirname $0)/../../../contrib/argp-standalone "; + CFLAGS="$CFLAGS -L$(dirname $0)/../../../contrib/argp-standalone -largp "; + CFLAGS="$CFLAGS -lintl"; +} +build_tester $AREQUAL_PATH/arequal-checksum.c $CFLAGS + +TEST glusterd +TEST pidof glusterd + +setup_georep ; + +# start of tests on fuse mount + +TEST glusterfs -s $H0 --volfile-id $GMV0 $M0 + +TEST hybrid_mode_test "create" $M0 + +TEST hybrid_mode_test "chmod" $M0 + +TEST hybrid_mode_test "chown" $M0 + +TEST hybrid_mode_test "chgrp" $M0 + +TEST hybrid_mode_test "truncate" $M0 + +TEST hybrid_mode_test "symlink" $M0 + +#TEST hybrid_mode_test "hardlink" $M0 + +# start of tests on nfs mount + +TEST mount -t nfs -o vers=3,nolock $H0:$GMV0 $N0 + +TEST hybrid_mode_test "create" $N0 + +TEST hybrid_mode_test "chmod" $N0 + +TEST hybrid_mode_test "chown" $N0 + +TEST hybrid_mode_test "chgrp" $N0 + +TEST hybrid_mode_test "truncate" $N0 + +TEST hybrid_mode_test "symlink" $N0 + +#TEST hybrid_mode_test "hardlink" $N0 + +TEST rm -rf $AREQUAL_PATH/arequal-checksum + +cleanup_georep; diff --git a/tests/include.rc b/tests/include.rc index ed1fef0ae11..d4772bd42f4 100644 --- a/tests/include.rc +++ b/tests/include.rc @@ -5,6 +5,8 @@ N0=${N0:=/mnt/nfs/0}; # 0th mount point for NFS N1=${N1:=/mnt/nfs/1}; # 1st mount point for NFS V0=${V0:=patchy}; # volume name to use in tests V1=${V1:=patchy1}; # volume name to use in tests +GMV0=${GMV0:=master}; # master volume name to use in geo-rep tests +GSV0=${GSV0:=slave}; # slave volume name to use in geo-rep tests B0=${B0:=/d/backends}; # top level of brick directories WORKDIRS="$B0 $M0 $M1 $M2 $N0 $N1" CC=cc @@ -436,9 +438,11 @@ function cleanup() ;; esac - if [ -n "${GLUSTERD_WORKDIR}" ] ; then - rm -rf $GLUSTERD_WORKDIR/* $B0/* /etc/glusterd/*; - fi + # remove contents of "GLUSTERD_WORKDIR" except hooks directory. + find $GLUSTERD_WORKDIR/* -maxdepth 0 -name 'hooks' -prune \ + -o -exec rm -rf '{}' ';' + + rm -rf $B0/* /etc/glusterd/*; # unmount all stale mounts from /tmp, This is a temporary work around # till the stale mount in /tmp is found. diff --git a/tests/utils/create-files.py b/tests/utils/create-files.py index 05cf1279999..bef4201bf1f 100755 --- a/tests/utils/create-files.py +++ b/tests/utils/create-files.py @@ -5,107 +5,312 @@ # http://github.com/vijaykumar-koppad/crefi from __future__ import with_statement -import sys import os import re -import random -from optparse import OptionParser +import sys import time -import string import errno +import xattr +import string +import random +import logging +import tarfile +import argparse + +datsiz = 0 +timr = 0 + + +def setLogger(filename): + global logger + logger = logging.getLogger(filename) + logger.setLevel(logging.DEBUG) + return + + +def setupLogger(filename): + logger = logging.getLogger(filename) + logger.setLevel(logging.DEBUG) + formatter = logging.Formatter('%(asctime)s - %(message)s') + ch = logging.StreamHandler() + ch.setLevel(logging.INFO) + ch.setFormatter(formatter) + logger.addHandler(ch) + return logger + def os_rd(src, size): - fd = os.open(src,os.O_RDONLY) + global datsiz + fd = os.open(src, os.O_RDONLY) data = os.read(fd, size) os.close(fd) + datsiz = datsiz + size return data + def os_wr(dest, data): - fd = os.open(dest,os.O_WRONLY|os.O_CREAT|os.O_EXCL, 0644) + global timr + st = time.time() + fd = os.open(dest, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0644) os.write(fd, data) os.close(fd) + ed = time.time() + timr = timr+(ed-st) return -def create_sparse_file(fil): - if option.size: - option.random = False - size = option.size + +def create_sparse_file(fil, size, mins, maxs, rand): + if rand: + size = random.randint(mins, maxs) else: - size = random.randint(option.min, option.max) + size = size data = os_rd("/dev/zero", size) os_wr(fil, data) return -def create_binary_file(fil): - if option.size: - option.random = False - size = option.size + +def create_binary_file(fil, size, mins, maxs, rand): + if rand: + size = random.randint(mins, maxs) else: - size = random.randint(option.min, option.max) + size = size data = os_rd("/dev/urandom", size) os_wr(fil, data) return -def create_txt_file(fil): - if option.size: - option.random = False - size = option.size - else: - size = random.randint(option.min, option.max) + +def create_txt_file(fil, size, mins, maxs, rand): + if rand: + size = random.randint(mins, maxs) if size < 500*1024: data = os_rd("/etc/services", size) os_wr(fil, data) else: - data = os_rd("/etc/services", 500*1024) + data = os_rd("/etc/services", 512*1024) file_size = 0 - fd = os.open(fil,os.O_WRONLY|os.O_CREAT|os.O_EXCL, 0644) + fd = os.open(fil, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0644) while file_size < size: os.write(fd, data) file_size += 500*1024 os.close(fd) return -def get_filename(): - size = option.flen + +def create_tar_file(fil, size, mins, maxs, rand): + if rand: + size = random.randint(mins, maxs) + else: + size = size + data = os_rd("/dev/urandom", size) + os_wr(fil, data) + tar = tarfile.open(fil+".tar.gz", "w:gz") + tar.add(fil) + tar.close() + os.unlink(fil) + return + + +def get_filename(flen): + size = flen char = string.uppercase+string.digits st = ''.join(random.choice(char) for i in range(size)) ti = str((hex(int(str(time.time()).split('.')[0])))[2:]) - return ti+"~~"+st + return ti+"%%"+st + + +def text_files(files, file_count, inter, size, mins, maxs, rand, + flen, randname, dir_path): + global datsiz, timr + for k in range(files): + if not file_count % inter: + logger.info("Total files created -- "+str(file_count)) + if not randname: + fil = dir_path+"/"+"file"+str(k) + else: + fil = dir_path+"/"+get_filename(flen) + create_txt_file(fil, size, mins, maxs, rand) + file_count += 1 + return file_count -def text_files(files, file_count): + +def sparse_files(files, file_count, inter, size, mins, maxs, + rand, flen, randname, dir_path): for k in range(files): - if not file_count%option.inter: - print file_count - fil = get_filename() - create_txt_file(fil) + if not file_count % inter: + logger.info("Total files created -- "+str(file_count)) + if not randname: + fil = dir_path+"/"+"file"+str(k) + else: + fil = dir_path+"/"+get_filename(flen) + create_sparse_file(fil, size, mins, maxs, rand) file_count += 1 return file_count -def sparse_files(files, file_count): + +def binary_files(files, file_count, inter, size, mins, maxs, + rand, flen, randname, dir_path): for k in range(files): - if not file_count%option.inter: - print file_count - fil = get_filename() - create_sparse_file(fil) + if not file_count % inter: + logger.info("Total files created -- "+str(file_count)) + if not randname: + fil = dir_path+"/"+"file"+str(k) + else: + fil = dir_path+"/"+get_filename(flen) + create_binary_file(fil, size, mins, maxs, rand) file_count += 1 return file_count -def binary_files(files, file_count): + +def tar_files(files, file_count, inter, size, mins, maxs, + rand, flen, randname, dir_path): for k in range(files): - if not file_count%option.inter: - print file_count - fil = get_filename() - create_binary_file(fil) + if not file_count % inter: + logger.info("Total files created -- "+str(file_count)) + if not randname: + fil = dir_path+"/"+"file"+str(k) + else: + fil = dir_path+"/"+get_filename(flen) + create_tar_file(fil, size, mins, maxs, rand) file_count += 1 return file_count + +def setxattr_files(files, randname, dir_path): + char = string.uppercase+string.digits + if not randname: + for k in range(files): + v = ''.join(random.choice(char) for i in range(10)) + n = "user."+v + xattr.setxattr(dir_path+"/"+"file"+str(k), n, v) + else: + dirs = os.listdir(dir_path+"/") + for fil in dirs: + v = ''.join(random.choice(char) for i in range(10)) + n = "user."+v + xattr.setxattr(dir_path+"/"+fil, n, v) + return + + +def rename_files(files, flen, randname, dir_path): + if not randname: + for k in range(files): + os.rename(dir_path + "/" + "file" + str(k), + dir_path + "/" + "file" + str(files+k)) + else: + dirs = os.listdir(dir_path) + for fil in dirs: + if not os.path.isdir(fil): + newfil = get_filename(flen) + os.rename(dir_path + "/" + fil, + dir_path + "/" + newfil) + return + + +def truncate_files(files, mins, maxs, randname, dir_path): + if not randname: + for k in range(files): + byts = random.randint(mins, maxs) + fd = os.open(dir_path + "/" + "file" + str(k), os.O_WRONLY) + os.ftruncate(fd, byts) + os.close(fd) + else: + dirs = os.listdir(dir_path) + for fil in dirs: + if not os.path.isdir(dir_path+"/"+fil): + byts = random.randint(mins, maxs) + fd = os.open(dir_path+"/"+fil, os.O_WRONLY) + os.ftruncate(fd, byts) + os.close(fd) + return + + +def chmod_files(files, flen, randname, dir_path): + if not randname: + for k in range(files): + mod = random.randint(0, 511) + os.chmod(dir_path+"/"+"file"+str(k), mod) + else: + dirs = os.listdir(dir_path) + for fil in dirs: + mod = random.randint(0, 511) + os.chmod(dir_path+"/"+fil, mod) + return + +def random_og(path): + u = random.randint(1025, 65536) + g = -1 + os.chown(path, u, g) + +def chown_files(files, flen, randname, dir_path): + if not randname: + for k in range(files): + random_og(dir_path+"/"+"file"+str(k)) + else: + dirs = os.listdir(dir_path) + for fil in dirs: + random_og(dir_path+"/"+fil) + return + + +def chgrp_files(files, flen, randname, dir_path): + if not randname: + for k in range(files): + random_og(dir_path+"/"+"file"+str(k)) + else: + dirs = os.listdir(dir_path) + for fil in dirs: + random_og(dir_path+"/"+fil) + return + + +def symlink_files(files, flen, randname, dir_path): + try: + os.makedirs(dir_path+"/"+"symlink_to_files") + except OSError as ex: + if ex.errno is not errno.EEXIST: + raise + if not randname: + for k in range(files): + src_file = "file"+str(k) + os.symlink(dir_path+"/"+src_file, + dir_path+"/"+"symlink_to_files/file"+str(k)+"_sym") + else: + dirs = os.listdir(dir_path) + for fil in dirs: + newfil = get_filename(flen) + os.symlink(dir_path+"/"+fil, + dir_path+"/"+"symlink_to_files/"+newfil) + return + + +def hardlink_files(files, flen, randname, dir_path): + try: + os.makedirs(dir_path+"/"+"hardlink_to_files") + except OSError as ex: + if ex.errno is not errno.EEXIST: + raise + if not randname: + for k in range(files): + src_file = "file"+str(k) + os.link(dir_path+"/"+src_file, + dir_path+"/"+"hardlink_to_files/file"+str(k)+"_hard") + else: + dirs = os.listdir(dir_path) + for fil in dirs: + if not os.path.isdir(dir_path+"/"+fil): + newfil = get_filename(flen) + os.link(dir_path+"/"+fil, + dir_path+"/"+"hardlink_to_files/"+newfil) + return + + def human2bytes(size): size_short = { - 1024 : ['K','KB','KiB','k','kB','kiB'], - 1024*1024 : ['M','MB','MiB'], - 1024*1024*1024 : ['G','GB','GiB'] -} - num = re.search('(\d+)',size).group() + 1024: ['K', 'KB', 'KiB', 'k', 'kB', 'kiB'], + 1024*1024: ['M', 'MB', 'MiB'], + 1024*1024*1024: ['G', 'GB', 'GiB'] + } + num = re.search('(\d+)', size).group() ext = size[len(num):] num = int(num) if ext == '': @@ -115,93 +320,270 @@ def human2bytes(size): size = num*value return size -def multipledir(mnt_pnt,brdth,depth,files): + +def bytes2human(byts): + abbr = { + 1 << 30L: "GB", + 1 << 20L: "MB", + 1 << 10L: "KB", + 1: "bytes" + } + if byts == 1: + return '1 bytes' + for factor, suffix in abbr.items(): + if byts >= factor: + break + return "%.3f %s" % (byts / factor, suffix) + + +def multipledir(mnt_pnt, brdth, depth, files, fop, file_type="text", + inter="1000", size="100K", mins="10K", maxs="500K", + rand=False, l=10, randname=False): files_count = 1 + size = human2bytes(size) + maxs = human2bytes(maxs) + mins = human2bytes(mins) for i in range(brdth): - breadth = mnt_pnt+"/"+str(i) - try: - os.makedirs(breadth) - except OSError as ex: - if not ex.errno is errno.EEXIST: - raise - os.chdir(breadth) - dir_depth = breadth - print breadth + dir_path = mnt_pnt for j in range(depth): - dir_depth = dir_depth+"/"+str(j) + dir_path = dir_path+"/"+"level"+str(j)+str(i) try: - os.makedirs(dir_depth) + os.makedirs(dir_path) except OSError as ex: - if not ex.errno is errno.EEXIST: + if ex.errno is not errno.EEXIST: raise - os.chdir(dir_depth) - if option.file_type == "text": - files_count = text_files(files, files_count) - elif option.file_type == "sparse": - files_count = sparse_files(files, files_count) - elif option.file_type == "binary": - files_count = binary_files(files, files_count) - else: - print "Not a valid file type" - sys.exit(1) - -def singledir(mnt_pnt, files): + + if fop == "create": + logger.info("Entering the directory level"+str(j)+str(i)) + if file_type == "text": + files_count = text_files(files, files_count, inter, size, + mins, maxs, rand, l, randname, + dir_path) + elif file_type == "sparse": + files_count = sparse_files(files, files_count, inter, size, + mins, maxs, rand, l, randname, + dir_path) + elif file_type == "binary": + files_count = binary_files(files, files_count, inter, size, + mins, maxs, rand, l, randname, + dir_path) + elif file_type == "tar": + files_count = tar_files(files, files_count, inter, size, + mins, maxs, rand, l, randname, + dir_path) + else: + logger.error("Not a valid file type") + sys.exit(1) + + elif fop == "rename": + logger.info("Started renaming files for the files 0 to " + + str(files)+" in the directory level"+str(j) + + str(i)+" ...") + rename_files(files, l, randname, dir_path) + logger.info("Finished renaming files for the files 0 to " + + str(files)+" in the directory level"+str(j)+str(i)) + + elif fop == "chmod": + logger.info("Started changing permission of files for the " + + "files 0 to "+str(files)+" in the directory level" + + str(j)+str(i)+" ...") + chmod_files(files, l, randname, dir_path) + logger.info("Finished changing permission of files for " + + "the files 0 to "+str(files) + + " in the directory level"+str(j)+str(i)) + + elif fop == "chown": + logger.info("Started changing ownership of files for the " + + "files 0 to " + str(files) + + " in the directory level"+str(j)+str(i)+" ...") + chown_files(files, l, randname, dir_path) + logger.info("Finished changing ownership of files for " + + "the files 0 to "+str(files) + + " in the directory level"+str(j)+str(i)) + + elif fop == "chgrp": + logger.info("Started changing group ownership of files for " + + "the files 0 to " + str(files) + + " in the directory level"+str(j)+str(i)+" ...") + chgrp_files(files, l, randname, dir_path) + logger.info("Finished changing group ownership of files for " + + "the files 0 to "+str(files) + + " in the directory level"+str(j)+str(i)) + + elif fop == "symlink": + logger.info("Started creating symlink to the files 0 to " + + str(files)+" in the directory level" + + str(j)+str(i)+"...") + symlink_files(files, l, randname, dir_path) + logger.info("Finished creating symlink to the files 0 to " + + str(files) + " in the directory level" + + str(j)+str(i)) + + elif fop == "hardlink": + logger.info("Started creating hardlink to the files 0 to " + + str(files)+" in the directory level" + + str(j)+str(i)+"...") + hardlink_files(files, l, randname, dir_path) + logger.info("Finished creating hardlink to the files 0 to " + + str(files) + " in the directory level" + + str(j)+str(i)) + + elif fop == "truncate": + logger.info("Started truncating the files 0 to " + + str(files)+" in the directory level" + + str(j)+str(i)+"...") + truncate_files(files, mins, maxs, randname, dir_path) + logger.info("Finished truncating the files 0 to " + + str(files)+" in the directory level" + + str(j)+str(i)) + + elif fop == "setxattr": + logger.info("Started setxattr to the files 0 to " + + str(files)+" in the directory level" + + str(j)+str(i)+"...") + setxattr_files(files, randname, dir_path) + logger.info("Finished setxattr to the files 0 to " + + str(files)+" in the directory level" + + str(j)+str(i)) + + if fop == "create": + thrpt = datsiz / timr + logger.info("finished creating files with throughput ---- " + + bytes2human(thrpt)+"ps") + + +def singledir(mnt_pnt, files, fop, file_type="text", inter="1000", size="100K", + mins="10K", maxs="500K", rand=False, l=10, randname=False): + files_count = 1 - os.chdir(mnt_pnt) - if option.file_type == "text": - files_count = text_files(files, files_count) - elif option.file_type == "sparse": - files_count = sparse_files(files, files_count) - elif option.file_type == "binary": - files_count = binary_files(files, files_count) - else: - print "Not a valid file type" - sys.exit(1) + size = human2bytes(size) + maxs = human2bytes(maxs) + mins = human2bytes(mins) + if fop == "create": + if file_type == "text": + files_count = text_files(files, files_count, inter, size, mins, + maxs, rand, l, randname, mnt_pnt) + elif file_type == "sparse": + files_count = sparse_files(files, files_count, inter, size, mins, + maxs, rand, l, randname, mnt_pnt) + elif file_type == "binary": + files_count = binary_files(files, files_count, inter, size, mins, + maxs, rand, l, randname, mnt_pnt) + elif file_type == "tar": + files_count = tar_files(files, files_count, inter, size, mins, + maxs, rand, l, randname, mnt_pnt) + else: + logger.info("Not a valid file type") + sys.exit(1) + thrpt = datsiz / timr + logger.info("finished creating files with avg throughput ---- " + + bytes2human(thrpt)+"ps") + + elif fop == "rename": + logger.info("Started renaming files for the files 0 to " + + str(files) + "...") + rename_files(files, l, randname, mnt_pnt) + logger.info("Finished renaming files for the files 0 to "+str(files)) + + elif fop == "chmod": + logger.info("Started changing permission for the files 0 to " + + str(files)+" ...") + chmod_files(files, l, randname, mnt_pnt) + logger.info("Finished changing permission files for the files 0 to " + + str(files)) + + elif fop == "chown": + logger.info("Started changing ownership for the files 0 to " + + str(files)+"...") + chown_files(files, l, randname, mnt_pnt) + logger.info("Finished changing ownership for the files 0 to " + + str(files)) + + elif fop == "chgrp": + logger.info("Started changing group ownership for the files 0 to " + + str(files)+"...") + chgrp_files(files, l, randname, mnt_pnt) + logger.info("Finished changing group ownership for the files 0 to " + + str(files)) + + elif fop == "symlink": + logger.info("Started creating symlink to the files 0 to " + + str(files)+"...") + symlink_files(files, l, randname, mnt_pnt) + logger.info("Finished creating symlink to the files 0 to " + + str(files)) + + elif fop == "hardlink": + logger.info("Started creating hardlink to the files 0 to " + + str(files)+"...") + hardlink_files(files, l, randname, mnt_pnt) + logger.info("Finished creating hardlink to the files 0 to " + + str(files)) + + elif fop == "truncate": + logger.info("Started truncating the files 0 to " + str(files)+"...") + truncate_files(files, mins, maxs, randname, mnt_pnt) + logger.info("Finished truncating the files 0 to " + str(files)) + + elif fop == "setxattr": + logger.info("Started setxattr to the files 0 to " + str(files)+"...") + setxattr_files(files, randname, mnt_pnt) + logger.info("Finished setxattr to the files 0 to " + str(files)) + if __name__ == '__main__': usage = "usage: %prog [option] <MNT_PT>" - parser = OptionParser(usage=usage) - parser.add_option("-n", dest="files",type="int" ,default=100, - help="number of files in each level [default: %default]") - parser.add_option("--size", action = "store",type="string", - help="size of the files to be used") - parser.add_option("--random", action="store_true", default=True, - help="random size of the file between --min and --max " - "[default: %default]") - parser.add_option("--max", action = "store",type="string", default="500K", - help="maximum size of the files, if random is True " - "[default: %default]") - parser.add_option("--min", action = "store",type="string", default="10K", - help="minimum size of the files, if random is True " - "[default: %default]" ) - parser.add_option("--single", action="store_true", dest="dir",default=True, - help="create files in single directory [default: %default]" ) - parser.add_option("--multi", action="store_false", dest="dir", - help="create files in multiple directories") - parser.add_option("-b", dest="brdth",type="int",default=5, - help="number of directories in one level(works with --multi)[default: %default]") - parser.add_option("-d", dest="depth",type="int",default=5, - help="number of levels of directories(works with --multi)[default: %default]") - parser.add_option("-l", dest="flen",type="int" ,default=10, - help="number of bytes for filename " - "[default: %default]") - parser.add_option("-t","--type", action="store", type="string" , dest="file_type",default="text", - help="type of the file to be created (text, sparse, binary) [default: %default]" ) - parser.add_option("-I", dest="inter", type="int", default=100, - help="print number files created of interval [defailt: %dafault]") - (option,args) = parser.parse_args() - if not args: - print "usage: <script> [option] <MNT_PT>" - print "" - sys.exit(1) - args[0] = os.path.abspath(args[0]) - if option.size: - option.size = human2bytes(option.size) - else: - option.max = human2bytes(option.max) - option.min = human2bytes(option.min) - if option.dir: - singledir(args[0], option.files) + parser = argparse.ArgumentParser(formatter_class=argparse. + ArgumentDefaultsHelpFormatter) + parser.add_argument("-n", dest="files", type=int, default=100, + help="number of files in each level ") + parser.add_argument("--size", action="store", default="100k", + help="size of the files to be used ") + parser.add_argument("--random", action="store_true", default=False, + help="random size of the file between --min and --max") + parser.add_argument("--max", action="store", default="500K", + help="maximum size of the files, if random is True") + parser.add_argument("--min", action="store", default="10K", + help="minimum size of the files, if random is True") + parser.add_argument("--single", action="store_true", dest="dir", + default=True, help="create files in single directory") + parser.add_argument("--multi", action="store_false", dest="dir", + help="create files in multiple directories") + parser.add_argument("-b", dest="brdth", type=int, default=5, + help="number of directories in one level(works " + + "with --multi) ") + parser.add_argument("-d", dest="depth", type=int, default=5, + help="number of levels of directories (works " + + "with --multi) ") + parser.add_argument("-l", dest="flen", type=int, default=10, + help="number of bytes for filename ( Used only when " + + "randname is enabled) ") + parser.add_argument("-t", action="store", dest="file_type", + default="text", choices=["text", "sparse", "binary", + "tar"], + help="type of the file to be created ()") + parser.add_argument("-I", dest="inter", type=int, default=100, + help="print number files created of interval") + parser.add_argument("--fop", action="store", dest="fop", default="create", + choices=["create", "rename", "chmod", "chown", "chgrp", + "symlink", "hardlink", "truncate", + "setxattr"], + help="fop to be performed on the files") + parser.add_argument("-R", dest="randname", action="store_false", + default=True, help="To disable random file name " + + "(default: Enabled)") + parser.add_argument("mntpnt", help="Mount point") + + args = parser.parse_args() + logger = setupLogger("testlost") + args.mntpnt = os.path.abspath(args.mntpnt) + + if args.dir: + singledir(args.mntpnt, args.files, args.fop, args.file_type, + args.inter, args.size, args.min, args.max, + args.random, args.flen, args.randname) else: - multipledir(args[0], option.brdth, option.depth, option.files) - print "creation of files completed.\n" + multipledir(args.mntpnt, args.brdth, args.depth, args.files, + args.fop, args.file_type, args.inter, args.size, + args.min, args.max, args.random, args.flen, + args.randname) diff --git a/tests/volume.rc b/tests/volume.rc index 59a66142e9e..f2a56888fb8 100644 --- a/tests/volume.rc +++ b/tests/volume.rc @@ -474,3 +474,35 @@ function mount_get_option_value { function get_volume_mark { getfattr -n trusted.glusterfs.volume-mark -ehex $1 | sed -n 's/^trusted.glusterfs.volume-mark=0x//p' | cut -b5-36 | sed 's/\([a-f0-9]\{8\}\)\([a-f0-9]\{4\}\)\([a-f0-9]\{4\}\)\([a-f0-9]\{4\}\)/\1-\2-\3-\4-/' } + +# setup geo-rep in a single a node. + +function setup_georep { + + $CLI volume create $GMV0 replica 2 $H0:$B0/${GMV0}{1,2,3,4}; + + $CLI volume start $GMV0 + + $CLI volume create $GSV0 replica 2 $H0:$B0/${GSV0}{1,2,3,4}; + + $CLI volume start $GSV0 + + $CLI system:: execute gsec_create + + $CLI volume geo-rep $GMV0 $H0::$GSV0 create push-pem + + $CLI volume geo-rep $GMV0 $H0::$GSV0 start + + sleep 80 # after start geo-rep takes a minute to get stable + +} + + +# stop and delete geo-rep session + +function cleanup_georep { + + $CLI volume geo-rep $GMV0 $H0::$GSV0 stop + + $CLI volume geo-rep $GMV0 $H0::$GSV0 delete +} |