| ############################################################################ | |
| # Copyright (C) SchedMD LLC. | |
| ############################################################################ | |
| import pytest | |
| import atf | |
| pytestmark = pytest.mark.slow | |
| @pytest.fixture(scope="module", autouse=True) | |
| def setup(): | |
| atf.require_accounting(modify=True) | |
| atf.require_slurm_running() | |
| @pytest.fixture(scope="function", autouse=False) | |
| def delete_old_resv(): | |
| """Delete the reservation if it's still there""" | |
| atf.run_command( | |
| "scontrol delete reservation resv1", | |
| user=atf.properties["slurm-user"], | |
| fatal=False, | |
| ) | |
| @pytest.fixture(scope="function", autouse=False) | |
| def create_resv(delete_old_resv): | |
| """Create a reservation to use for testing""" | |
| atf.run_command( | |
| f"scontrol create reservation reservationname=resv1 " | |
| f"user={atf.properties['test-user']} start=now end=now+1 " | |
| f"nodes=node0", | |
| user=atf.properties["slurm-user"], | |
| fatal=True, | |
| ) | |
| def test_clear_job_expired_deadline(create_resv): | |
| """Put several jobs in the queue that will go past the resv deadline""" | |
| job_id = atf.submit_job_sbatch( | |
| sbatch_args=r" -w node0 --deadline=now+4 " | |
| "--begin=now --reservation=resv1 " | |
| '--wrap="sleep 300"' | |
| ) | |
| assert job_id != 0, "Couldn't start job batch" | |
| """Wait for the JobState to change to RESV_DEL_HOLD""" | |
| atf.repeat_until( | |
| lambda: atf.run_command_output(f"scontrol show job {job_id} | grep JobState"), | |
| lambda resp: "RESV_DEL_HOLD" in resp, | |
| timeout=60, | |
| poll_interval=1, | |
| ) | |
| """Wait for the JobState to change to DEADLINE""" | |
| atf.repeat_until( | |
| lambda: atf.run_command_output(f"scontrol show job {job_id} | grep JobState"), | |
| lambda resp: "DEADLINE" in resp, | |
| timeout=60, | |
| poll_interval=1, | |
| ) | |
| """Assert that the JobState is DEADLINE""" | |
| output = atf.run_command_output(f"scontrol show job {job_id} | grep JobState") | |
| assert ( | |
| "DEADLINE" in output | |
| ), "The JobState did not change to DEADLINE when the reservation expired." | |
| """Verify that the queue is empty""" | |
| output = atf.run_command_output("squeue") | |
| assert ( | |
| str(job_id) not in output | |
| ), f"Job {job_id} was still in the queue and should have been deleted." |