| ############################################################################ | |
| # Copyright (C) SchedMD LLC. | |
| ############################################################################ | |
| import re | |
| import pytest | |
| import atf | |
| # Setup | |
| @pytest.fixture(scope="module", autouse=True) | |
| def setup(): | |
| atf.require_auto_config("wants to add custom gres") | |
| atf.require_config_parameter("SelectType", "select/cons_tres") | |
| atf.require_config_parameter("SelectTypeParameters", "CR_CPU") | |
| atf.require_config_parameter("GresTypes", "r1,r2") | |
| atf.require_nodes( | |
| 1, [("Gres", "r1:no_consume:1,r2:1"), ("CPUs", 2), ("RealMemory", 2)] | |
| ) | |
| atf.require_slurm_running() | |
| def test_no_consume(): | |
| """Test gres with no_consume""" | |
| # Get the last node only | |
| no_consume_output = atf.run_command_output( | |
| "srun --gres=r1 scontrol show node -d" | |
| ).split("NodeName")[-1] | |
| assert ( | |
| re.search(r"GresUsed=.*r1:0", no_consume_output) is not None | |
| ), "Expect no_consume resources to not be consumed" | |
| consume_output = atf.run_command_output( | |
| "srun --gres=r2 scontrol show node -d" | |
| ).split("NodeName")[-1] | |
| assert ( | |
| re.search(r"GresUsed=.*r2:1", consume_output) is not None | |
| ), "Expect consumable resource to be consumed" | |
| def test_no_consume_parallel(): | |
| """Test no_consume gres with parallel jobs""" | |
| job_id_1 = atf.submit_job_sbatch('--gres=r1 --mem=1 --wrap="sleep 20"') | |
| job_id_2 = atf.submit_job_sbatch('--gres=r1 --mem=1 --wrap="sleep 20"') | |
| atf.wait_for_job_state(job_id_1, "RUNNING") | |
| atf.wait_for_job_state(job_id_2, "RUNNING") | |
| squeue = atf.run_command_output("squeue") | |
| assert ( | |
| re.search(rf"{job_id_1}( +[^ ]+)( +[^ ]+)( +[^ ]+) +R", squeue) is not None | |
| ), "Expect first job to be running" | |
| assert ( | |
| re.search(rf"{job_id_2}( +[^ ]+)( +[^ ]+)( +[^ ]+) +R", squeue) is not None | |
| ), "Expect second job to be running" |