diff --git a/src/tests/ftest/dfuse/bash.py b/src/tests/ftest/dfuse/bash.py index e220eecd13f..720b2d12feb 100644 --- a/src/tests/ftest/dfuse/bash.py +++ b/src/tests/ftest/dfuse/bash.py @@ -1,14 +1,12 @@ """ - (C) Copyright 2020-2023 Intel Corporation. + (C) Copyright 2020-2024 Intel Corporation. SPDX-License-Identifier: BSD-2-Clause-Patent """ import os -import general_utils -from ClusterShell.NodeSet import NodeSet from dfuse_test_base import DfuseTestBase -from exception_utils import CommandFailure +from run_utils import run_remote class Cmd(DfuseTestBase): @@ -43,19 +41,11 @@ def run_bashcmd(self, il_lib=None, compatible_mode=False): Remove a directory and more """ - dir_name = self.params.get("dirname", '/run/bashcmd/*') - file_name1 = self.params.get("filename1", '/run/bashcmd/*') - file_name2 = self.params.get("filename2", '/run/bashcmd/*') - dd_count = self.params.get("dd_count", '/run/bashcmd/*') - dd_blocksize = self.params.get("dd_blocksize", '/run/bashcmd/*') - pool_count = self.params.get("pool_count", '/run/pool/*') - cont_count = self.params.get("cont_count", '/run/container/*') + dd_count = 512 + dd_blocksize = 512 if il_lib is not None: - # no need to run multiple pools and containers with interception lib loaded - pool_count = 1 - cont_count = 1 - lib_path = os.path.join(self.prefix, 'lib64', il_lib) + lib_path = os.path.join(self.prefix, "lib64", il_lib) if compatible_mode: env_str = f"export LD_PRELOAD={lib_path}; export D_IL_COMPATIBLE=1; " else: @@ -64,109 +54,91 @@ def run_bashcmd(self, il_lib=None, compatible_mode=False): env_str = "" # Create a pool if one does not already exist. - for _ in range(pool_count): - self.add_pool(connect=False) - # perform test for multiple containers. - for count in range(cont_count): - self.add_container(self.pool) - mount_dir = f"/tmp/{self.pool.uuid}_daos_dfuse{count}" - self.start_dfuse( - self.hostlist_clients, self.pool, self.container, mount_dir=mount_dir) - if il_lib is not None: - # unmount dfuse and mount again with caching disabled - self.dfuse.unmount(tries=1) - self.dfuse.update_params(disable_caching=True) - self.dfuse.update_params(disable_wb_cache=True) - self.dfuse.run() - - fuse_root_dir = self.dfuse.mount_dir.value - abs_dir_path = os.path.join(fuse_root_dir, dir_name) - abs_file_path1 = os.path.join(abs_dir_path, file_name1) - abs_file_path2 = os.path.join(abs_dir_path, file_name2) - - with open(os.path.join(fuse_root_dir, 'src.c'), 'w') as fd: - fd.write('#include \n\nint main(void) {\nprintf("Hello World!");\n}\n') - link_name = os.path.join(fuse_root_dir, 'link_c') - - with open(os.path.join(fuse_root_dir, 'src_a.c'), 'w') as fd: - fd.write('#include \n\nvoid fun_a(void) {\nprintf("fun_a()");\n}\n') - with open(os.path.join(fuse_root_dir, 'src_b.c'), 'w') as fd: - fd.write('#include \n\nvoid fun_b(void) {\nprintf("fun_b()");\n}\n') - # list of commands to be executed. - commands = [f"mkdir -p {abs_dir_path}", - f"touch {abs_file_path1}", - f"ls -a {abs_file_path1}", - f"rm {abs_file_path1}", - f"dd if=/dev/zero of={abs_file_path1} count={dd_count}" - f" bs={dd_blocksize}", - f"ls -al {abs_file_path1}", - f"filesize=$(stat -c%s '{abs_file_path1}');" - f"if (( filesize != {dd_count}*{dd_blocksize} )); then exit 1; fi", - f"cp -r {abs_file_path1} {abs_file_path2}", - f"diff {abs_file_path1} {abs_file_path2}", - f"cmp --silent {abs_file_path1} {abs_file_path2}", - f"rm {abs_file_path2}", - f"mv {abs_file_path1} {abs_file_path2}", - f"ls -al {abs_file_path2}", - f"ls -al {abs_dir_path}/.", - f"ls -al {abs_dir_path}/..", - f"rm {abs_file_path2}", - f"rmdir {abs_dir_path}", - f"wc -l {fuse_root_dir}/src.c", - f"xxd {fuse_root_dir}/src.c", - f'ln -s src.c {link_name}', - f'readlink {link_name}', - f'realpath {link_name}', - f'head {fuse_root_dir}/src.c', - f'tail {fuse_root_dir}/src.c', - # f'more {fuse_root_dir}/src.c', # more hangs over ssh somehow - f'dos2unix {fuse_root_dir}/src.c', - f"gcc -o {fuse_root_dir}/output {fuse_root_dir}/src.c", - f'size {fuse_root_dir}/output', - f'readelf -s {fuse_root_dir}/output', - f'strip -s {fuse_root_dir}/output', - f"g++ -o {fuse_root_dir}/output {fuse_root_dir}/src.c", - f"gcc -c -o {fuse_root_dir}/obj_a.o {fuse_root_dir}/src_a.c", - f"gcc -c -o {fuse_root_dir}/obj_b.o {fuse_root_dir}/src_b.c", - f"ar -rc {fuse_root_dir}/lib.a {fuse_root_dir}/obj_a.o " - f"{fuse_root_dir}/obj_b.o", - f"objdump -d {fuse_root_dir}/obj_a.o", - f"grep print {fuse_root_dir}/src.c", - "awk '{print $1}' " + fuse_root_dir + '/src.c', - f"base64 {fuse_root_dir}/src.c", - f"md5sum {fuse_root_dir}/src.c", - f"cksum {fuse_root_dir}/src.c", - f"bzip2 -z {fuse_root_dir}/lib.a", - f"chmod u-r {fuse_root_dir}/lib.a.bz2", - "fio --readwrite=randwrite --name=test --size=\"2M\" --directory "\ - f"{fuse_root_dir}/ --bs=1M --numjobs=\"4\" --ioengine=psync "\ - "--group_reporting --exitall_on_error --continue_on_error=none", - f"curl \"https://www.google.com\" -o {fuse_root_dir}/download.html"] - for cmd in commands: - try: - # execute bash cmds - ret_code = general_utils.pcmd( - self.hostlist_clients, env_str + cmd, timeout=30) - if 0 not in ret_code: - error_hosts = NodeSet( - ",".join( - [str(node_set) for code, node_set in - list(ret_code.items()) if code != 0])) - raise CommandFailure( - f"Error running '{cmd}' on the following hosts: {error_hosts}") - # report error if any command fails - except CommandFailure as error: - self.log.error("BashCmd Test Failed: %s", - str(error)) - self.fail("Test was expected to pass but " - "it failed.\n") - - # stop dfuse - self.stop_dfuse() - # destroy container - self.container.destroy() - # destroy pool - self.pool.destroy() + self.add_pool(connect=False) + self.add_container(self.pool) + mount_dir = f"/tmp/{self.pool.identifier}_daos_dfuse" + self.start_dfuse(self.hostlist_clients, self.pool, self.container, mount_dir=mount_dir) + if il_lib is not None: + # unmount dfuse and mount again with caching disabled + self.dfuse.unmount(tries=1) + self.dfuse.update_params(disable_caching=True) + self.dfuse.update_params(disable_wb_cache=True) + self.dfuse.run() + + fuse_root_dir = self.dfuse.mount_dir.value + abs_dir_path = os.path.join(fuse_root_dir, "test") + abs_file_path1 = os.path.join(abs_dir_path, "testfile1.txt") + abs_file_path2 = os.path.join(abs_dir_path, "testfile2.txt") + + with open(os.path.join(fuse_root_dir, "src.c"), "w") as fd: + fd.write('#include \n\nint main(void) {\nprintf("Hello World!");\n}\n') + link_name = os.path.join(fuse_root_dir, "link_c") + + with open(os.path.join(fuse_root_dir, "src_a.c"), "w") as fd: + fd.write('#include \n\nvoid fun_a(void) {\nprintf("fun_a()");\n}\n') + with open(os.path.join(fuse_root_dir, "src_b.c"), "w") as fd: + fd.write('#include \n\nvoid fun_b(void) {\nprintf("fun_b()");\n}\n') + # list of commands to be executed. + commands = [ + f"mkdir -p {abs_dir_path}", + f"touch {abs_file_path1}", + f"ls -a {abs_file_path1}", + f"rm {abs_file_path1}", + f"dd if=/dev/zero of={abs_file_path1} count={dd_count}" f" bs={dd_blocksize}", + f"ls -al {abs_file_path1}", + f"filesize=$(stat -c%s '{abs_file_path1}');" + f"if (( filesize != {dd_count}*{dd_blocksize} )); then exit 1; fi", + f"cp -r {abs_file_path1} {abs_file_path2}", + f"diff {abs_file_path1} {abs_file_path2}", + f"cmp --silent {abs_file_path1} {abs_file_path2}", + f"rm {abs_file_path2}", + f"mv {abs_file_path1} {abs_file_path2}", + f"ls -al {abs_file_path2}", + f"ls -al {abs_dir_path}/.", + f"ls -al {abs_dir_path}/..", + f"rm {abs_file_path2}", + f"rmdir {abs_dir_path}", + f"wc -l {fuse_root_dir}/src.c", + f"xxd {fuse_root_dir}/src.c", + f"ln -s src.c {link_name}", + f"readlink {link_name}", + f"realpath {link_name}", + f"head {fuse_root_dir}/src.c", + f"tail {fuse_root_dir}/src.c", + # f'more {fuse_root_dir}/src.c', # more hangs over ssh somehow + f"dos2unix {fuse_root_dir}/src.c", + f"gcc -o {fuse_root_dir}/output {fuse_root_dir}/src.c", + f"size {fuse_root_dir}/output", + f"readelf -s {fuse_root_dir}/output", + f"strip -s {fuse_root_dir}/output", + f"g++ -o {fuse_root_dir}/output {fuse_root_dir}/src.c", + f"gcc -c -o {fuse_root_dir}/obj_a.o {fuse_root_dir}/src_a.c", + f"gcc -c -o {fuse_root_dir}/obj_b.o {fuse_root_dir}/src_b.c", + f"ar -rc {fuse_root_dir}/lib.a {fuse_root_dir}/obj_a.o " f"{fuse_root_dir}/obj_b.o", + f"objdump -d {fuse_root_dir}/obj_a.o", + f"grep print {fuse_root_dir}/src.c", + "awk '{print $1}' " + fuse_root_dir + "/src.c", + f"base64 {fuse_root_dir}/src.c", + f"md5sum {fuse_root_dir}/src.c", + f"cksum {fuse_root_dir}/src.c", + f"bzip2 -z {fuse_root_dir}/lib.a", + f"chmod u-r {fuse_root_dir}/lib.a.bz2", + 'fio --readwrite=randwrite --name=test --size="2M" --directory ' + f'{fuse_root_dir}/ --bs=1M --numjobs="4" --ioengine=psync ' + "--group_reporting --exitall_on_error --continue_on_error=none", + f'curl "https://www.google.com" -o {fuse_root_dir}/download.html', + ] + for cmd in commands: + result = run_remote(self.log, self.hostlist_clients, env_str + cmd) + if not result.passed: + self.fail(f'"{cmd}" failed on {result.failed_hosts}') + + # stop dfuse + self.stop_dfuse() + # destroy container + self.container.destroy() + # destroy pool + self.pool.destroy() def test_bashcmd(self): """ @@ -176,9 +148,9 @@ def test_bashcmd(self): for different container and pool sizes and perform basic bash commands. - :avocado: tags=all,pr,daily_regression - :avocado: tags=hw,medium - :avocado: tags=dfuse + :avocado: tags=all,daily_regression + :avocado: tags=vm + :avocado: tags=dfuse,dfs :avocado: tags=Cmd,test_bashcmd """ self.run_bashcmd() @@ -192,8 +164,8 @@ def test_bashcmd_ioil(self): commands. :avocado: tags=all,pr,daily_regression - :avocado: tags=hw,medium - :avocado: tags=dfuse,il + :avocado: tags=vm + :avocado: tags=dfuse,il,dfs :avocado: tags=Cmd,test_bashcmd_ioil """ self.run_bashcmd(il_lib="libioil.so") @@ -206,9 +178,9 @@ def test_bashcmd_pil4dfs(self): for different container and pool sizes and perform basic bash commands. - :avocado: tags=all - :avocado: tags=hw,medium - :avocado: tags=dfuse,pil4dfs + :avocado: tags=all,daily_regression + :avocado: tags=vm + :avocado: tags=dfuse,pil4dfs,dfs :avocado: tags=Cmd,test_bashcmd_pil4dfs """ self.run_bashcmd(il_lib="libpil4dfs.so") diff --git a/src/tests/ftest/dfuse/bash.yaml b/src/tests/ftest/dfuse/bash.yaml index 02822a907a1..0ba0c9a6145 100644 --- a/src/tests/ftest/dfuse/bash.yaml +++ b/src/tests/ftest/dfuse/bash.yaml @@ -6,22 +6,16 @@ server_config: engines_per_host: 1 engines: 0: + targets: 4 + nr_xs_helpers: 0 storage: 0: - class: dcpm - scm_list: ["/dev/pmem0"] + class: ram scm_mount: /mnt/daos + system_ram_reserved: 1 pool: scm_size: 1000000000 control_method: dmg - pool_count: 5 container: type: POSIX control_method: daos - cont_count: 5 -bashcmd: - dirname: test - filename1: testfile1.txt - filename2: testfile2.txt - dd_count: 512 - dd_blocksize: 512