| ############################################################################ | |
| # Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | |
| ############################################################################ | |
| import re | |
| import pytest | |
| import atf | |
| @pytest.fixture(scope="module", autouse=True) | |
| def setup(): | |
| atf.require_version( | |
| (26, 5), "bin/sprio", reason="Ticket 22180: SLUID availability added in 26.05+" | |
| ) | |
| atf.require_accounting() | |
| atf.require_config_parameter("PriorityType", "priority/multifactor") | |
| atf.require_slurm_running() | |
| @pytest.fixture(scope="module") | |
| def default_partition(): | |
| return atf.default_partition() | |
| @pytest.fixture(scope="function") | |
| def queued_job(default_partition): | |
| nodes_dict = atf.get_nodes() | |
| total_cpus = 0 | |
| for node_name in nodes_dict: | |
| node_dict = nodes_dict[node_name] | |
| node_partitions = node_dict["partitions"] | |
| if default_partition in node_partitions and "IDLE" in node_dict["state"]: | |
| total_cpus += node_dict["cpus"] | |
| atf.submit_job_sbatch( | |
| f'--output=/dev/null --error=/dev/null -n {total_cpus} --exclusive --wrap="sleep infinity"', | |
| fatal=True, | |
| ) | |
| queued_job_id = atf.submit_job_sbatch( | |
| f'--output=/dev/null --error=/dev/null -n {total_cpus} --exclusive --wrap="sleep infinity"', | |
| fatal=True, | |
| ) | |
| return queued_job_id | |
| def test_sprio_sluid(queued_job, default_partition): | |
| """Verify sprio can query by SLUID, filter, and print with %s option.""" | |
| sluid = atf.get_job_parameter(queued_job, "SLUID") | |
| assert sluid is not None, f"Job {queued_job} has no SLUID" | |
| fmt = "--noheader -o '%.6i %.14s'" | |
| # sprio -j <job_id> prints the SLUID with %s | |
| output = atf.run_command_output(f"sprio -j {queued_job} {fmt}", fatal=True) | |
| assert re.search( | |
| rf"{queued_job}\s+{re.escape(sluid)}", output | |
| ), f"Expected job_id and SLUID in output: {output}" | |
| # sprio -j <SLUID> filters by SLUID | |
| output = atf.run_command_output(f"sprio -j {sluid} {fmt}", fatal=True) | |
| assert re.search( | |
| rf"{queued_job}\s+{re.escape(sluid)}", output | |
| ), f"Expected job found by SLUID in output: {output}" | |
| # sprio -j <job_id>,<SLUID> (both refer to the same job) | |
| output = atf.run_command_output(f"sprio -j {queued_job},{sluid} {fmt}", fatal=True) | |
| assert re.search( | |
| rf"{queued_job}\s+{re.escape(sluid)}", output | |
| ), f"Expected job found by mixed ids in output: {output}" |