summaryrefslogtreecommitdiffstats
path: root/TestUnits
diff options
context:
space:
mode:
Diffstat (limited to 'TestUnits')
-rw-r--r--TestUnits/xlators/cluster/afr/basic/testcases.py897
-rw-r--r--TestUnits/xlators/cluster/afr/basic/testcaseslist22
-rw-r--r--TestUnits/xlators/cluster/afr/basic/testenv.cfg81
-rw-r--r--TestUnits/xlators/cluster/afr/basic/testunit.py129
4 files changed, 1129 insertions, 0 deletions
diff --git a/TestUnits/xlators/cluster/afr/basic/testcases.py b/TestUnits/xlators/cluster/afr/basic/testcases.py
new file mode 100644
index 0000000..e2b3f95
--- /dev/null
+++ b/TestUnits/xlators/cluster/afr/basic/testcases.py
@@ -0,0 +1,897 @@
+"""testcases for afr/basic
+"""
+
+import sys
+import time
+import os
+import hostutils
+import managerutils
+import glusterutils
+import atfutils
+import clientutils
+import serverutils
+import parser
+import validate
+
+write_op = ">"
+append_op = ">>"
+mounts = ['mount1']
+commands = {
+ 'ls' : 'ls',
+ 'stat' : 'stat',
+ 'echo' : 'echo',
+ 'cat' : 'cat',
+ 'touch' : 'touch',
+ 'rename': 'mv',
+ 'unlink': 'rm',
+ 'mkdir' : 'mkdir -p',
+ 'hardlink' : 'ln',
+ 'symlink' : 'ln -s',
+ 'setattr' : 'setfattr',
+ 'getattr' : 'getfattr',
+ 'truncate' : 'truncate',
+ 'unlink_force' : 'rm -f',
+ 'unlink_dir_force' : 'rm -rf'
+ }
+
+def reset_testenv():
+ return_status = clientutils.umountall()
+ if return_status:
+ return return_status
+ glusterutils.volume_stop("server1", force=True)
+ glusterutils.volume_delete("server1")
+ glusterutils.glusterd_stop_allservers()
+ glusterutils.glusterd_remove_dir_allservers()
+ glusterutils.glusterd_remove_logs_allservers()
+ return 0
+
+def setup_testenv():
+ """
+ """
+ return_status = glusterutils.glusterd_start_allservers(force=True)
+ if return_status:
+ return return_status
+
+ return_status = glusterutils.peer_probe("server1")
+ if return_status:
+ return return_status
+
+ return_status = glusterutils.create_brick_allservers()
+ if return_status:
+ return return_status
+
+ return_status = glusterutils.volume_create("server1")
+ if return_status:
+ return return_status
+
+ glusterutils.volume_set("server1", key="diagnostics.client-log-level", value="DEBUG")
+
+ return_status = glusterutils.volume_start("server1")
+ if return_status:
+ return return_status
+
+ return_status = clientutils.mountall()
+ if return_status:
+ return return_status
+
+ return 0
+
+def file_write():
+ """
+ Description: Test 'write' operation
+ """
+ return_status = 1
+ data = "Hello World. This is testing write file operation"
+ filename = "write.txt"
+ bricks = ['brick1', 'brick2']
+
+ command = ' '.join([commands['echo'], data, write_op, filename])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['ls'], filename])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = filename
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ return_status = validate.validate_md5sums(mounts, bricks)
+ if return_status is not 0:
+ return return_status
+
+ return 0
+
+def file_lookup():
+ """
+ Description: Test 'lookup' operation
+ """
+ return_status = 1
+ filename = "stat.txt"
+ bricks = ['brick1', 'brick2']
+
+ command = ' '.join([commands['touch'], filename])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['stat'], filename])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = "regular empty file"
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ return_status = validate.validate_md5sums(mounts, bricks)
+ if return_status is not 0:
+ return return_status
+
+ return 0
+
+def file_read():
+ """
+ Description: Test 'read' operation
+ """
+ return_status = 1
+ data = "Hello World. This is testing read file operation"
+ filename = "read.txt"
+ bricks = ['brick1', 'brick2']
+
+ command = ' '.join([commands['echo'], data, write_op, filename])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['cat'], filename])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = data
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ return_status = validate.validate_md5sums(mounts, bricks)
+ if return_status is not 0:
+ return return_status
+ return 0
+
+def file_append():
+ """
+ Description: Test 'append' operation
+ """
+ return_status = 1
+ data1 = "Hello World. This is testing append file operation."
+ data2 = "Appending data to file."
+ filename = "append.txt"
+ bricks = ['brick1', 'brick2']
+
+ command = ' '.join([commands['echo'], data1, write_op, filename])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['cat'], filename])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = data1
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['echo'], data2, append_op, filename])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['cat'], filename])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = str([data1 + "\n", data2 + "\n"])
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ return_status = validate.validate_md5sums(mounts, bricks)
+ if return_status is not 0:
+ return return_status
+
+ return 0
+
+def file_truncate():
+ """
+ """
+ return_status = 1
+ data = "Hello World. This is testing truncate file operation"
+ filename = "truncate.txt"
+ bricks = ['brick1', 'brick2']
+
+ command = ' '.join([commands['echo'], data, write_op, filename])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['cat'], filename])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = data
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['truncate'], "-s 0", filename])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ return_status = validate.validate_md5sums(mounts, bricks)
+ if return_status is not 0:
+ return return_status
+
+ return 0
+
+def file_hardlink():
+ """
+ """
+ return_status = 1
+ filename1 = "testlink.txt"
+ filename2 = "hardlink_to_testlink.txt"
+ data = "Hello World. This is testing file hard link operation"
+ bricks = ['brick1', 'brick2']
+
+ # Create a file
+ command = ' '.join([commands['echo'], data, write_op, filename1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ # Check whether the file has been created on mount, bricks
+ command = ' '.join([commands['cat'], filename1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = data
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ # Create Hardlink
+ command = ' '.join([commands['hardlink'], filename1, filename2])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ # Check whether the hardlink has been created on mount, bricks
+ # Check the Link Count
+ # Cat the data of new hard_link
+ for filename in [filename1, filename2]:
+ command = ' '.join([commands['stat'], filename])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = "Links: 2"
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['cat'], filename])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = data
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ return_status = validate.validate_md5sums(mounts, bricks)
+ if return_status is not 0:
+ return return_status
+
+ return 0
+
+def file_symlink():
+ """
+ """
+ return_status = 1
+ filename1 = "testsymlink.txt"
+ filename2 = "symlink_to_testsymlink.txt"
+ data = "Hello World. This is testing file sym link operation"
+ bricks = ['brick1', 'brick2']
+
+ # Create a file
+ command = ' '.join([commands['echo'], data, write_op, filename1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ # Check whether the file has been created on mount, bricks
+ command = ' '.join([commands['cat'], filename1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = data
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ # Create Symlink
+ command = ' '.join([commands['symlink'], filename1, filename2])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ # Check whether the symlink has been created on mount, bricks
+ # Check the Sym Link in stat structure
+ # Cat the data of sym_link and output's the original file data
+ command = ' '.join([commands['stat'], filename2])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = "symbolic link"
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['cat'], filename2])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = data
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ return_status = validate.validate_md5sums(mounts, bricks)
+ if return_status is not 0:
+ return return_status
+
+ return 0
+
+def file_set_get_fattr():
+ """
+ """
+ return_status = 1
+ name = "trusted.name"
+ value = "set_get_attr_test"
+ data = "Hello World. This is testing set_get_attr file operation"
+ filename = "set_get_fattr.txt"
+ bricks = ['brick1', 'brick2']
+
+ command = ' '.join([commands['echo'], data, write_op, filename])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['setattr'],"-n", name, "-v", value, filename])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['getattr'], "-n", name, filename])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = value
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ return_status = validate.validate_md5sums(mounts, bricks)
+ if return_status is not 0:
+ return return_status
+
+ return 0
+
+def file_rename():
+ """
+ """
+ return_status = 1
+ data = "Hello World. This is testing rename file operation"
+ filename1 = "rename_me.txt"
+ filename2 = "rename_to.txt"
+ bricks = ['brick1', 'brick2']
+
+ command = ' '.join([commands['echo'], data, write_op, filename1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['ls'], filename1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = filename1
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['rename'], filename1, filename2])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['ls'], filename1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = "No such file or directory"
+ return_status = atfutils.validate_output(output, 1, expected_output, stream="stderr")
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 1, expected_output, stream="stderr")
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['ls'], filename2])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = filename2
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['cat'], filename2])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = data
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ return_status = validate.validate_md5sums(mounts, bricks)
+ if return_status is not 0:
+ return return_status
+
+ return 0
+
+def file_unlink():
+ """
+ """
+ return_status = 1
+ data = "Hello World. This is testing unlink file operation"
+ filename1 = "unlink_me.txt"
+ bricks = ['brick1', 'brick2']
+
+ command = ' '.join([commands['echo'], data, write_op, filename1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['ls'], filename1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = filename1
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['unlink_force'], filename1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['ls'], filename1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = "No such file or directory"
+ return_status = atfutils.validate_output(output, 1, expected_output, stream="stderr")
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 1, expected_output, stream="stderr")
+ if return_status is not 0:
+ return return_status
+
+ return_status = validate.validate_md5sums(mounts, bricks)
+ if return_status is not 0:
+ return return_status
+
+ return 0
+
+def dir_mkdir():
+ """
+ """
+ return_status = 1
+ dirname = "dir_mkdir"
+ bricks = ['brick1', 'brick2']
+
+ command = ' '.join([commands['mkdir'], dirname])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['stat'], dirname])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = dirname
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ return_status = validate.validate_md5sums(mounts, bricks)
+ if return_status is not 0:
+ return return_status
+
+ return 0
+
+def dir_lookup():
+ """
+ """
+ return_status = 1
+ dirname = "dir_lookup"
+ bricks = ['brick1', 'brick2']
+
+ command = ' '.join([commands['mkdir'], dirname])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['stat'], dirname])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = "directory"
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ return_status = validate.validate_md5sums(mounts, bricks)
+ if return_status is not 0:
+ return return_status
+
+ return 0
+
+def dir_read():
+ """
+ """
+ return_status = 1
+ dirname = "dir_read"
+ bricks = ['brick1', 'brick2']
+ subdirlist = []
+
+ command = ' '.join([commands['mkdir'], dirname])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ subdirs = os.path.join(dirname, "{1..4}")
+ command = ' '.join([commands['mkdir'], subdirs])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ for x in range(1,5):
+ subdirlist.append(str(x) + "\n")
+
+ command = ' '.join([commands['ls'], dirname])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = str(subdirlist)
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ return_status = validate.validate_md5sums(mounts, bricks)
+ if return_status is not 0:
+ return return_status
+
+ return 0
+
+def dir_hardlink():
+ """
+ """
+ return_status = 1
+ dirname1 = "dir_hlink"
+ dirname2 = "hardlink_to_dir_hlink"
+ bricks = ['brick1', 'brick2']
+
+ command = ' '.join([commands['mkdir'], dirname1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['stat'], dirname1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = dirname1
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['hardlink'], dirname1, dirname2])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = "hard link not allowed for directory"
+ return_status = atfutils.validate_output(output, 1, expected_output, stream="stderr")
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['stat'], dirname2])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = "No such file or directory"
+ return_status = atfutils.validate_output(output, 1, expected_output, stream="stderr")
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 1, expected_output, stream="stderr")
+ if return_status is not 0:
+ return return_status
+
+ return_status = validate.validate_md5sums(mounts, bricks)
+ if return_status is not 0:
+ return return_status
+
+ return 0
+
+def dir_symlink():
+ """
+ """
+ return_status = 1
+ dirname1 = "dir_symlink"
+ dirname2 = "symlink_to_dir_symlink"
+ bricks = ['brick1', 'brick2']
+
+ command = ' '.join([commands['mkdir'], dirname1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['stat'], dirname1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = dirname1
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['symlink'], dirname1, dirname2])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['stat'], dirname2])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = "symbolic link"
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ return_status = validate.validate_md5sums(mounts, bricks)
+ if return_status is not 0:
+ return return_status
+
+ return 0
+
+def dir_set_get_fattr():
+ """
+ """
+ return_status = 1
+ name = "trusted.name"
+ value = "set_get_attr_test"
+ dirname = "set_get_attr"
+ bricks = ['brick1', 'brick2']
+
+ command = ' '.join([commands['mkdir'], dirname])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['stat'], dirname])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = dirname
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['setattr'], "-n", name, "-v", value, dirname])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['getattr'], "-n", name, dirname])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = value
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ return_status = validate.validate_md5sums(mounts, bricks)
+ if return_status is not 0:
+ return return_status
+
+ return 0
+
+def dir_rename():
+ """
+ """
+ return_status = 1
+ dirname1 = "dir_rename_me"
+ dirname2 = "dir_rename_to"
+ bricks = ['brick1', 'brick2']
+
+ command = ' '.join([commands['mkdir'], dirname1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['stat'], dirname1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = dirname1
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['rename'], dirname1, dirname2])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['stat'], dirname1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = "No such file or directory"
+ if atfutils.validate_output(output, 1, expected_output, stream="stderr"):
+ return return_status
+ if validate.validate_on_bricks(bricks, command, 1, expected_output, stream="stderr"):
+ return return_status
+
+ command = ' '.join([commands['stat'], dirname2])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = dirname2
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ return_status = validate.validate_md5sums(mounts, bricks)
+ if return_status is not 0:
+ return return_status
+
+ return 0
+
+def dir_unlink():
+ """
+ """
+ return_status = 1
+ dirname1 = "dir_unlink_me"
+ bricks = ['brick1', 'brick2']
+
+ command = ' '.join([commands['mkdir'], dirname1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['stat'], dirname1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = dirname1
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+ return_status = validate.validate_on_bricks(bricks, command, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['unlink_dir_force'], dirname1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = ""
+ return_status = atfutils.validate_output(output, 0, expected_output)
+ if return_status is not 0:
+ return return_status
+
+ command = ' '.join([commands['stat'], dirname1])
+ output = clientutils.execute_on_mount("mount1", command)
+ expected_output = "No such file or directory"
+ if atfutils.validate_output(output, 1, expected_output, stream="stderr"):
+ return return_status
+ if validate.validate_on_bricks(bricks, command, 1, expected_output, stream="stderr"):
+ return return_status
+
+ return_status = validate.validate_md5sums(mounts, bricks)
+ if return_status is not 0:
+ return return_status
+
+ return 0
diff --git a/TestUnits/xlators/cluster/afr/basic/testcaseslist b/TestUnits/xlators/cluster/afr/basic/testcaseslist
new file mode 100644
index 0000000..027b4f1
--- /dev/null
+++ b/TestUnits/xlators/cluster/afr/basic/testcaseslist
@@ -0,0 +1,22 @@
+#################################################################
+# List of testcases for the basic feature of afr.
+# TestCaseId : Version : Keyword
+##################################################################
+file_write : >= 3.2 : art
+file_lookup : >= 3.2 : art
+file_read : >= 3.2 : art
+file_append : >= 3.2 : art
+file_truncate : >= 3.2 : art
+file_hardlink : >= 3.2 : art
+file_symlink : >= 3.2 : art
+file_set_get_fattr : >= 3.2 : art
+file_rename : >= 3.2 : art
+file_unlink : >= 3.2 : art
+dir_mkdir : >= 3.2 : art
+dir_lookup : >= 3.2 : art
+dir_read : >= 3.2 : art
+dir_hardlink : >= 3.2 : art
+dir_symlink : >= 3.2 : art
+dir_set_get_fattr : >= 3.2 : art
+dir_rename : >= 3.2 : art
+dir_unlink : >= 3.2 : art
diff --git a/TestUnits/xlators/cluster/afr/basic/testenv.cfg b/TestUnits/xlators/cluster/afr/basic/testenv.cfg
new file mode 100644
index 0000000..a38571e
--- /dev/null
+++ b/TestUnits/xlators/cluster/afr/basic/testenv.cfg
@@ -0,0 +1,81 @@
+[DEFAULT]
+user =
+password =
+glusterversion =
+installpath =
+downloadpath =
+
+# ExportDir Section.
+# Necessary Options: dir
+# Optional: fstype, device
+[export1]
+dir =
+fstype =
+device =
+options =
+
+[export2]
+dir =
+fstype =
+device =
+
+# Server Section
+# Necessary Options: hostname, username, password, glusterversion.
+# The username, password, glusterversion defaults from DEFAULTS Section and
+# can be overridden
+# Optional: installpath
+[server1]
+hostname =
+
+[server2]
+hostname =
+
+# Brick Section
+# Necessary Options: hostname, path
+[brick1]
+hostname = server1.hostname
+path = export1
+
+[brick2]
+hostname = server2.hostname
+path = export2
+
+# Volume Section
+# Necessary Options: volumename, bricks
+# Optional replica=<Count>, stripe=<Count>
+#
+[volume1]
+volumename = replicate
+replica=2
+stripe=
+transporttype = tcp
+bricks = brick1, brick2
+
+# Client Section
+# Necessary Options: hostname, username, password, glusterversion.
+# The username, password, glusterversion defaults from DEFAULTS Section and
+# can be overridden
+# Optional: installpath
+[client1]
+hostname =
+
+# MountDevice Section
+# Necessary Options: hostname, volume
+# The Server1.hostname could be a VIP also. Need not be a server hostname
+# IN a general case,(without NFS) we keep the 1st server from serverpool
+# The volume specified in this section is the "active_volume" onto which all
+# clients will be mounting to. This active volume and hostname can be changed
+# during testrun.
+[mountdevice1]
+hostname = server1.hostname
+volumename = volume1.volumename
+
+# Mount Section
+# addMount(dir, type, client, device=master.volume, logfile=None)
+[mount1]
+dir =
+client =
+device =
+type =
+logfile =
+options =
diff --git a/TestUnits/xlators/cluster/afr/basic/testunit.py b/TestUnits/xlators/cluster/afr/basic/testunit.py
new file mode 100644
index 0000000..1f8e7d2
--- /dev/null
+++ b/TestUnits/xlators/cluster/afr/basic/testunit.py
@@ -0,0 +1,129 @@
+"""testunit.py is the main module for the testunit.
+
+This module "main" function is called from atfexecute to execute the testunit.
+"""
+from atfglobals import GlobalObj
+import os
+import parser
+import atfutils
+import managerutils
+import testcases
+
+reload(testcases)
+
+filename = os.path.abspath(__file__)
+dir_path = os.path.dirname(filename)
+
+def initialize():
+ """
+ """
+ logger = GlobalObj.getLoggerObj()
+ return_status = 1
+ testenv_file = GlobalObj.testenv_file
+ testenv_abspath = os.path.join(dir_path, testenv_file)
+
+ if not (os.path.isfile(testenv_abspath)):
+ logger.error("%s not found in %s" % (testenv_file, dir_path))
+
+ if parser.parse_testenv_configfile(testenv_abspath):
+ return return_status
+ if managerutils.ssh_connect_allhosts():
+ return return_status
+
+ return 0
+
+def setup():
+ """
+ """
+ return_status = 1
+ if atfutils.set_active_volume("volume1"):
+ return return_status
+ return 0
+
+def execute():
+ """
+ """
+ logger = GlobalObj.getLoggerObj()
+ return_status = 1
+ testcaseslist_file = GlobalObj.testcaseslist_file
+ testcaseslist_abspath = os.path.join(dir_path, testcaseslist_file)
+
+ if not (os.path.isfile(testcaseslist_abspath)):
+ logger.error("%s not found in %s" % (testcaseslist_file, dir_path))
+ return return_status
+
+ else:
+ testcaseslist = []
+ testcaseslist = parser.parse_testcaseslist_file(testcaseslist_abspath)
+ if not testcaseslist:
+ logger.error("Skipping TestUnit %s. No testcases to execute"
+ % dir_path)
+ return 0
+ else:
+ passedtestcases = 0
+ failedtestcases = 0
+ selectedtestcases = len(testcaseslist)
+
+ logger.info("Starting TestUnit: '%s' test execution" % dir_path)
+
+ return_status = testcases.reset_testenv()
+ if return_status is not 0:
+ return return_status
+
+ return_status = testcases.setup_testenv()
+ if return_status is not 0:
+ return return_status
+
+ for testcase in testcaseslist:
+ function_obj = getattr(testcases, testcase)
+ if function_obj:
+ logger.debug("Starting Test: ' %s '" % testcase)
+
+ return_status = function_obj()
+ if return_status:
+ logger.debug("TestCase '%s' Failed" % testcase)
+ failedtestcases += 1
+ else:
+ logger.debug("TestCase '%s' Passed" % testcase)
+ passedtestcases += 1
+
+ logger.debug("Ending Test: '%s'" % testcase)
+
+ else:
+ logger.info("TestCase %s not defined in 'testcases' module"
+ % testcase)
+ continue
+
+ logger.info("Selected %d : Passed %d, Failed %d"
+ % (selectedtestcases,
+ passedtestcases,
+ failedtestcases))
+ logger.info("Ending TestUnit: '%s' test execution" % dir_path)
+
+ return 0
+
+def cleanup():
+ """
+ """
+ pass
+
+def main():
+ """
+ """
+ return_status = initialize()
+ if return_status is not 0:
+ return return_status
+
+ return_status = setup()
+ if return_status is not 0:
+ return return_status
+
+ return_status = execute()
+ if return_status is not 0:
+ return return_status
+
+ return_status = cleanup()
+ if return_status is not 0:
+ return return_status
+
+ return 0