Source code for pyslurmutils.tests.test_script

import sys

import pytest

from ..client import SlurmScriptRestClient
from ..client.rest.api import slurm_logs


[docs] @pytest.fixture def slurm_script_client(slurm_client_kwargs) -> SlurmScriptRestClient: slurm_client_kwargs = { k: v for k, v in slurm_client_kwargs.items() if k != "pre_script" } return SlurmScriptRestClient(**slurm_client_kwargs)
[docs] def test_script(slurm_script_client, slurm_parameters): nbefore = len(list(slurm_script_client.get_all_job_properties(update_time=None))) job_id = slurm_script_client.submit_script(_SUCCESS_SCRIPT) try: try: assert slurm_script_client.wait_finished(job_id, timeout=60) == "COMPLETED" finally: slurm_script_client.print_stdout_stderr(job_id) assert slurm_script_client.get_status(job_id) == "COMPLETED" nafter = len(list(slurm_script_client.get_all_job_properties(update_time=None))) if slurm_parameters["mock"]: # This might fail on a production SLURM queue assert (nafter - nbefore) == 1 finally: slurm_script_client.clean_job_artifacts(job_id)
[docs] def test_failing_script(slurm_script_client): job_id = slurm_script_client.submit_script(_FAIL_SCRIPT) try: assert slurm_script_client.wait_finished(job_id, timeout=60) == "FAILED" slurm_script_client.print_stdout_stderr(job_id) finally: slurm_script_client.clean_job_artifacts(job_id)
[docs] def test_cancel_script(slurm_script_client): job_id = slurm_script_client.submit_script(_SUCCESS_SCRIPT) try: slurm_script_client.cancel_job(job_id) assert slurm_script_client.wait_finished(job_id, timeout=60) == "CANCELLED" slurm_script_client.print_stdout_stderr(job_id) finally: slurm_script_client.clean_job_artifacts(job_id)
[docs] def test_script_parameters(slurm_script_client): parameters = {"time_limit": "00:05:00", "environment": {"NAME1": "VAR1"}} metadata = {"NAME2": "VAR2"} job_id = slurm_script_client.submit_script( _SUCCESS_SCRIPT, parameters=parameters, metadata=metadata ) try: try: assert slurm_script_client.wait_finished(job_id, timeout=60) == "COMPLETED" finally: slurm_script_client.print_stdout_stderr(job_id) assert slurm_script_client.get_status(job_id) == "COMPLETED" properties = slurm_script_client.get_job_properties(job_id) finally: slurm_script_client.clean_job_artifacts(job_id) assert properties.comment == '{"NAME2": "VAR2"}' assert properties.time_limit.model_dump() == { "infinite": False, "number": 5, "set": True, }
[docs] def test_slurm_job_environment(slurm_script_client, monkeypatch): parameters = {"environment": {"FOO": "baz"}} monkeypatch.setenv("SLURM_ENV_FOO", "bar") monkeypatch.setenv("SLURM_ENV_HELLO", "world") job_id = slurm_script_client.submit_script(_ECHO_SCRIPT, parameters=parameters) try: try: assert slurm_script_client.wait_finished(job_id, timeout=60) == "COMPLETED" finally: slurm_script_client.print_stdout_stderr(job_id) properties = slurm_script_client.get_job_properties(job_id) stdout, _ = slurm_logs.get_stdout_stderr(properties) finally: slurm_script_client.clean_job_artifacts(job_id) assert "FOO=baz\n" in stdout.content assert "HELLO=world\n" in stdout.content
_SUCCESS_SCRIPT = """ echo 'Job started' echo 'Job finished' """ _FAIL_SCRIPT = """ echo 'Job started' exit 3 """ if sys.platform == "win32": _ECHO_SCRIPT = """ echo FOO=$env:FOO echo HELLO=$env:HELLO """ else: _ECHO_SCRIPT = """ echo FOO=$FOO echo HELLO=$HELLO """