blob: 77a1eb760fcd9129a0a9c9a535311ba60b2c519b [file]
############################################################################
# Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
############################################################################
import pytest
import atf
sbcast_src = "sbcast_src"
sbcast_tgt = "sbcast_tgt"
job_marker = "job_marker"
def setup_module():
atf.require_nodes(1, [("CPUs", 1)])
atf.require_slurm_running()
@pytest.fixture(scope="function")
def sbcast_job(request):
"""Submit a job that waits for the sbcast target file to appear, then writes
a separate marker file. Returns the job identifier based on request.param
(JobId or SLUID) for use with sbcast -j."""
if request.param == "SLUID":
atf.require_version(
(26, 5),
"bin/sbcast",
reason="Ticket 22180: SLUID availability added in 26.05+",
)
script = "sbcast_wait.sh"
atf.make_bash_script(
script,
f"""for i in $(seq 1 30); do
if [ -f {sbcast_tgt} ]; then
echo "sbcast_tgt found" > {job_marker}
exit 0
fi
sleep 1
done
exit 1""",
)
# Create a source file to broadcast
with open(sbcast_src, "w") as f:
f.write("sbcast_ok\n")
job_id = atf.submit_job_sbatch(f"-N1 -n1 {script}", fatal=True)
atf.wait_for_job_state(job_id, "RUNNING", fatal=True)
identifier = str(atf.get_job_parameter(job_id, request.param))
return identifier, job_id
@pytest.mark.parametrize("sbcast_job", ["JobId", "SLUID"], indirect=True)
def test_sbcast(sbcast_job):
"""Verify sbcast -j <identifier> broadcasts a file to the job's nodes."""
identifier, job_id = sbcast_job
atf.run_command(f"sbcast -j {identifier} -f {sbcast_src} {sbcast_tgt}", fatal=True)
# Job should find the broadcast file and exit successfully
atf.wait_for_job_state(job_id, "DONE", fatal=True)
# Verify the job saw the broadcast file and wrote the marker
output = atf.run_command_output(f"cat {job_marker}", fatal=True)
assert (
"sbcast_tgt found" in output
), f"Expected 'sbcast_tgt found' in marker file, got: {output}"
atf.run_command(f"rm -f {job_marker} {sbcast_tgt}")