blob: 5a565d0f5daffe8c5355498caf157bae9433d056 [file]
import atf
import pytest
import os
spank_plugin_script = "test_147_1_spank_plugin.c"
spank_compiled_plugin = "test_147_1_spank_plugin.so"
# Setup
@pytest.fixture(scope="module", autouse=True)
def setup():
atf.require_config_parameter("JobContainerType", "job_container/tmpfs")
atf.require_config_parameter_includes("SlurmdParameters", "contain_spank")
atf.require_config_parameter_includes("PrologFlags", "Contain")
# Compile SPANK plugin
spank_plugin_script_path = (
f"{atf.properties['testsuite_scripts_dir']}/{spank_plugin_script}"
)
atf.compile_against_libslurm(
spank_plugin_script_path, spank_compiled_plugin, full=True, shared=True
)
# Ensure the SPANK plugin is included in plugstack.conf
atf.require_config_parameter(
"required",
f"{atf.module_tmp_path}/{spank_compiled_plugin}",
delimiter=" ",
source="plugstack",
)
# Setup job_container.conf
atf.require_config_parameter("AutoBasePath", "true", source="job_container")
atf.require_config_parameter(
"BasePath", "/tmp/%h_%n_base_path", source="job_container"
)
# Mount /tmp/test_147_1_private in the job container as a private mount
atf.require_config_parameter(
"Dirs", "/tmp/test_147_1_private", source="job_container"
)
atf.run_command("mkdir -p /tmp/test_147_1_private", fatal=True)
atf.require_slurm_running()
def test_spank_plugin_tmpfs():
"""
Test that SPANK plugin hooks execute correctly in the tmpfs job container.
"""
# Clear out the private mount and create a file outside the container
atf.run_command("rm -rf /tmp/test_147_1_private/*", fatal=True)
atf.run_command("touch /tmp/test_147_1_private/file_on_host", fatal=True)
atf.make_bash_script(
"job.sh",
"""
# Check to make sure job_container/tmpfs made a private mount
if [[ -f /tmp/test_147_1_private/file_on_host ]]; then
echo "job_container/tmpfs failed to create private mount"
else
echo "job_container/tmpfs created private mount"
fi
# Run step to trigger some SPANK functions we're testing
srun hostname
# Check if slurm_spank_user_init executed its functions and left behind a file
if [[ -f /tmp/test_147_1_private/slurm_spank_user_init_log ]]; then
echo "Found log for hook slurm_spank_user_init"
else
echo "Couldn't find log for hook slurm_spank_user_init"
fi
# Check if slurm_spank_task_post_fork executed its functions and left behind a file
if [[ -f /tmp/test_147_1_private/slurm_spank_task_post_fork_log ]]; then
echo "Found log for hook slurm_spank_task_post_fork"
else
echo "Couldn't find log for hook slurm_spank_task_post_fork"
fi
# Check if slurm_spank_task_exit executed its functions and left behind a file
if [[ -f /tmp/test_147_1_private/slurm_spank_task_exit_log ]]; then
echo "Found log for hook slurm_spank_task_exit"
else
echo "Couldn't find log for hook slurm_spank_task_exit"
fi
""",
)
# Wait for job to run
job_id = atf.submit_job_sbatch("--output=output job.sh", fatal=True)
assert atf.wait_for_job_state(
job_id, "COMPLETED"
), f"Job {job_id} did not complete successfully"
# Make sure output file created
atf.wait_for_file("output", timeout=5, fatal=True)
# Verify the job found files created by each SPANK plugin hook
with open("output") as output_file:
content = output_file.read()
assert (
"Found log for hook slurm_spank_user_init" in content
), "Job couldn't find file for slurm_spank_user_init hook"
assert (
"Found log for hook slurm_spank_task_post_fork" in content
), "Job couldn't find file for slurm_spank_task_post_fork hook"
assert (
"Found log for hook slurm_spank_task_exit" in content
), "Job couldn't find file for slurm_spank_task_exit hook"
assert (
"job_container/tmpfs created private mount" in content
), "job_container/tmpfs failed to create a private mount because we found a pre-existing file on the host when running a job"
assert not (
os.path.isfile("/tmp/test_147_1_private/slurm_spank_user_init_log")
or os.path.isfile("/tmp/test_147_1_private/slurm_spank_task_post_fork_log")
or os.path.isfile("/tmp/test_147_1_private/slurm_spank_task_exit_log")
), "job_container/tmpfs failed to isolate private mount; files created in container appear on host"