| ############################################################################ |
| # Copyright (C) SchedMD LLC. |
| ############################################################################ |
| import atf |
| import pytest |
| import re |
| |
| |
| # Setup |
| @pytest.fixture(scope="module", autouse=True) |
| def setup(): |
| atf.require_auto_config("wants to set the Prolog") |
| atf.require_slurm_running() |
| |
| |
| def test_prolog_success(tmp_path): |
| """Test successful exit""" |
| |
| prolog_script = str(tmp_path / "prolog.sh") |
| prolog_touched_file = str(tmp_path / "prolog_touched_file") |
| atf.make_bash_script(prolog_script, f"touch {prolog_touched_file}") |
| atf.set_config_parameter("Prolog", prolog_script) |
| |
| job_id = atf.submit_job_sbatch(fatal=True) |
| |
| # Verify that the prolog ran by checking for the file creation |
| assert atf.wait_for_file( |
| prolog_touched_file |
| ), f"File ({prolog_touched_file}) was not created" |
| |
| # Verify that the job runs |
| assert atf.wait_for_job_state(job_id, "RUNNING") |
| |
| atf.cancel_jobs([job_id]) |
| |
| |
| def test_prolog_failure(tmp_path): |
| """Test failed exit""" |
| |
| prolog_script = str(tmp_path / "prolog.sh") |
| prolog_output_file = str(tmp_path / "prolog_output_file") |
| atf.make_bash_script( |
| prolog_script, |
| f"""printenv SLURMD_NODENAME > {prolog_output_file} |
| exit 1 |
| """, |
| ) |
| atf.set_config_parameter("Prolog", prolog_script) |
| |
| job_id = atf.submit_job_sbatch(fatal=True) |
| |
| # Verify that the prolog ran by checking for the file creation |
| assert atf.wait_for_file( |
| prolog_output_file |
| ), f"File ({prolog_output_file}) was not created" |
| |
| # The job should be requeued in a held state |
| assert atf.wait_for_job_state(job_id, "PENDING") |
| assert atf.repeat_command_until( |
| f"scontrol show job {job_id}", |
| lambda results: re.search( |
| r"Reason=launch_failed_requeued_held", results["stdout"] |
| ), |
| ) |
| |
| # The node should be set to a DRAIN state |
| node_name = atf.run_command_output(f"cat {prolog_output_file}", fatal=True).strip() |
| assert atf.repeat_until( |
| lambda: atf.get_node_parameter(node_name, "state"), |
| lambda state: "DRAIN" in state, |
| fatal=True, |
| ), "The node is not in the drain state" |
| |
| atf.cancel_jobs([job_id]) |