diff --git a/jobbergate-api/jobbergate_api/apps/job_submissions/properties_parser.py b/jobbergate-api/jobbergate_api/apps/job_submissions/properties_parser.py index fa8dff1fd..7df8f48c5 100644 --- a/jobbergate-api/jobbergate_api/apps/job_submissions/properties_parser.py +++ b/jobbergate-api/jobbergate_api/apps/job_submissions/properties_parser.py @@ -146,7 +146,7 @@ class SbatchToSlurm: SbatchToSlurm("", "--network"), SbatchToSlurm("nice", "--nice"), SbatchToSlurm("no_kill", "--no-kill", "-k", dict(action="store_const", const=True)), - SbatchToSlurm("", "--no-requeue", "", dict(action="store_false", dest="requeue")), + SbatchToSlurm("", "--no-requeue", "", dict(action="store_false", dest="requeue", default=None)), SbatchToSlurm("", "--nodefile", "-F"), SbatchToSlurm("", "--nodelist", "-w"), SbatchToSlurm("nodes", "--nodes", "-N"), @@ -173,7 +173,7 @@ class SbatchToSlurm: SbatchToSlurm("qos", "--qos", "-q"), SbatchToSlurm("", "--quiet", "-Q", dict(action="store_const", const=True)), SbatchToSlurm("", "--reboot", "", dict(action="store_const", const=True)), - SbatchToSlurm("requeue", "--requeue", "", dict(action="store_const", const=True)), + SbatchToSlurm("requeue", "--requeue", "", dict(action="store_true", default=None)), SbatchToSlurm("reservation", "--reservation"), SbatchToSlurm("signal", "--signal"), SbatchToSlurm("sockets_per_node", "--sockets-per-node", "", dict(type=int)), @@ -225,8 +225,7 @@ def build_parser() -> ArgumentParser: for item in sbatch_to_slurm: args = (i for i in (item.sbatch_short, item.sbatch) if i) parser.add_argument(*args, **item.argparser_param) - # make --requeue and --no-requeue work together, with default to None - parser.set_defaults(requeue=None) + return parser diff --git a/jobbergate-api/jobbergate_api/tests/apps/job_submissions/test_properties_parser.py b/jobbergate-api/jobbergate_api/tests/apps/job_submissions/test_properties_parser.py index 8bc12380a..5b80a0b98 100644 --- a/jobbergate-api/jobbergate_api/tests/apps/job_submissions/test_properties_parser.py +++ b/jobbergate-api/jobbergate_api/tests/apps/job_submissions/test_properties_parser.py @@ -663,3 +663,73 @@ def test_both_exclusive_and_oversubscribe_2(self): actual_dict = jobscript_to_dict(jobscript) assert actual_dict == desired_dict + + +class TestRequeueParameter: + """ + Requeue is a slurm parameter whose value comes from two sbatch flags: --requeue and --no-requeue. + """ + + def test_empty_jobscript(self): + """ + Base case: no parameters at all. + """ + jobscript = "" + + desired_dict = {} + + actual_dict = jobscript_to_dict(jobscript) + + assert actual_dict == desired_dict + + def test_requeue_flag(self): + """ + Test the first scenario: --requeue + """ + jobscript = "#SBATCH --requeue" + + desired_dict = {"requeue": True} + + actual_dict = jobscript_to_dict(jobscript) + + assert actual_dict == desired_dict + + def test_no_requeue_flag(self): + """ + Test the first scenario: --no-requeue + """ + jobscript = "#SBATCH --no-requeue" + + desired_dict = {"requeue": False} + + actual_dict = jobscript_to_dict(jobscript) + + assert actual_dict == desired_dict + + def test_both_exclusive_and_oversubscribe_1(self): + """ + Test that when both are used, the last of them takes precedence. + + In this case, --no-requeue is the last one. + """ + jobscript = "#SBATCH --requeue\n#SBATCH --no-requeue" + + desired_dict = {"requeue": False} + + actual_dict = jobscript_to_dict(jobscript) + + assert actual_dict == desired_dict + + def test_both_exclusive_and_oversubscribe_2(self): + """ + Test that when both are used, the last of them takes precedence. + + In this case, --requeue is the last one. + """ + jobscript = "#SBATCH --no-requeue\n#SBATCH --requeue" + + desired_dict = {"requeue": True} + + actual_dict = jobscript_to_dict(jobscript) + + assert actual_dict == desired_dict