| ############################################################################ | |
| # Copyright (C) SchedMD LLC. | |
| ############################################################################ | |
| import os | |
| import re | |
| import time | |
| import pytest | |
| import atf | |
| pytestmark = pytest.mark.slow | |
| # Setup | |
| @pytest.fixture(scope="module", autouse=True) | |
| def setup(): | |
| atf.require_auto_config("wants to set the mail program") | |
| atf.require_slurm_running() | |
| @pytest.fixture(scope="module") | |
| def mail_program_out(): | |
| mail_tmp_dir = str(atf.module_tmp_path) | |
| mail_program = str(atf.module_tmp_path / "mail_program.sh") | |
| mail_program_out = str(atf.module_tmp_path / "mail_program.out") | |
| os.chmod(mail_tmp_dir, 0o777) | |
| atf.make_bash_script( | |
| mail_program, | |
| rf"""echo SLURM_JOB_ID=$SLURM_JOB_ID SLURM_JOB_USER=$SLURM_JOB_USER SLURM_JOB_MAIL_TYPE=$SLURM_JOB_MAIL_TYPE >> {mail_program_out}""", | |
| ) | |
| os.chmod(mail_program, 0o777) | |
| atf.set_config_parameter("MailProg", str(mail_program)) | |
| return mail_program_out | |
| def test_mail_type_and_mail_user(mail_program_out): | |
| """Test of mail options (--mail-type and --mail-user options).""" | |
| slurm_user = "slurm-user" | |
| job_id = atf.submit_job_srun( | |
| f"--mail-type=all --mail-user={atf.properties[slurm_user]} id" | |
| ) | |
| atf.wait_for_file(mail_program_out, fatal=True) | |
| output = atf.run_command_output(f"cat {mail_program_out}") | |
| assert ( | |
| re.findall( | |
| rf"SLURM_JOB_ID={job_id} SLURM_JOB_USER={atf.properties[slurm_user]} SLURM_JOB_MAIL_TYPE=Began", | |
| output, | |
| ) | |
| is not None | |
| ), "Start mail not sent" | |
| assert ( | |
| re.findall( | |
| rf"SLURM_JOB_ID={job_id} SLURM_JOB_USER={atf.properties[slurm_user]} SLURM_JOB_MAIL_TYPE=Ended", | |
| output, | |
| ) | |
| is not None | |
| ), "End mail not sent" | |
| job_id = atf.submit_job_sbatch( | |
| f'--wrap="srun --mail-type=END --mail-user={atf.properties[slurm_user]} sleep 100"' | |
| ) | |
| atf.wait_for_job_state(job_id, "RUNNING") | |
| atf.run_command(f"scancel {job_id}") | |
| output = atf.run_command_output(f"cat {mail_program_out}") | |
| assert ( | |
| re.findall( | |
| rf"SLURM_JOB_ID=\d+ SLURM_JOB_USER={atf.properties[slurm_user]} SLURM_JOB_MAIL_TYPE=Ended", | |
| output, | |
| ) | |
| is not None | |
| ), "End mail not sent after job was canceled" | |
| job_id = atf.submit_job_srun( | |
| f"-t1 --mail-type=ALL,TIME_LIMIT,TIME_LIMIT_90,TIME_LIMIT_80,TIME_LIMIT_50 --mail-user={atf.properties[slurm_user]} sleep 300", | |
| timeout=120, | |
| xfail=True, | |
| ) | |
| time.sleep(5) | |
| output = atf.run_command_output(f"cat {mail_program_out}") | |
| assert ( | |
| re.findall( | |
| rf"SLURM_JOB_ID={job_id} SLURM_JOB_USER={atf.properties[slurm_user]} SLURM_JOB_MAIL_TYPE=Began", | |
| output, | |
| ) | |
| is not None | |
| ), "Start mail not sent for timeout test" | |
| assert ( | |
| re.findall( | |
| rf"SLURM_JOB_ID={job_id} SLURM_JOB_USER={atf.properties[slurm_user]} SLURM_JOB_MAIL_TYPE=Failed", | |
| output, | |
| ) | |
| is not None | |
| ), "Failed mail not sent for timeout test" | |
| assert ( | |
| re.findall( | |
| rf"SLURM_JOB_ID={job_id} SLURM_JOB_USER={atf.properties[slurm_user]} SLURM_JOB_MAIL_TYPE=Reached time limit", | |
| output, | |
| ) | |
| is not None | |
| ), "Time limit mail not sent for timeout test" | |
| assert ( | |
| re.findall( | |
| rf"SLURM_JOB_ID={job_id} SLURM_JOB_USER={atf.properties[slurm_user]} SLURM_JOB_MAIL_TYPE=Reached 90% of time limit", | |
| output, | |
| ) | |
| is not None | |
| ), "Reached 90% of time limit mail not sent for timeout test" | |
| assert ( | |
| re.findall( | |
| rf"SLURM_JOB_ID={job_id} SLURM_JOB_USER={atf.properties[slurm_user]} SLURM_JOB_MAIL_TYPE=Reached 80% of time limit", | |
| output, | |
| ) | |
| is not None | |
| ), "Reached 80% of time limit mail not sent for timeout test" | |
| assert ( | |
| re.findall( | |
| rf"SLURM_JOB_ID={job_id} SLURM_JOB_USER={atf.properties[slurm_user]} SLURM_JOB_MAIL_TYPE=Reached 50% of time limit", | |
| output, | |
| ) | |
| is not None | |
| ), "Reached 50% of time limit mail not sent for timeout test" |