From 7e338d790964f594ae67b33e6a72e1777e774b8c Mon Sep 17 00:00:00 2001 From: John Chilton Date: Tue, 13 Dec 2016 16:42:09 -0500 Subject: [PATCH] Add attempt to resubmission expression language. --- lib/galaxy/jobs/runners/state_handlers/resubmit.py | 1 + lib/galaxy/model/__init__.py | 9 +++++++++ test/integration/resubmission_job_conf.xml | 10 ++++++++-- test/integration/resubmission_runners.py | 1 + test/integration/test_job_resubmission.py | 8 ++++++++ 5 files changed, 27 insertions(+), 2 deletions(-) diff --git a/lib/galaxy/jobs/runners/state_handlers/resubmit.py b/lib/galaxy/jobs/runners/state_handlers/resubmit.py index 9e721af8c25..a31f216606a 100644 --- a/lib/galaxy/jobs/runners/state_handlers/resubmit.py +++ b/lib/galaxy/jobs/runners/state_handlers/resubmit.py @@ -29,6 +29,7 @@ def eval_condition(condition, job_state): "unknown_error": JobState.runner_states.UNKNOWN_ERROR, "any_failure": True, "any_potential_job_failure": True, # Add a hook here - later on allow tools to describe things that are definitely input problems. + "attempt": job_state.job_wrapper.get_job().attempt, } # Small optimization to eliminate the need to parse AST and eval for simple variables. diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index b4c75480935..3276f175104 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -618,6 +618,15 @@ class Job( object, JobLike, Dictifiable ): self.state = state self.state_history.append( JobStateHistory( self ) ) + @property + def attempt( self ): + attempt_count = 1 + for state in self.state_history: + if state.state == Job.states.RESUBMITTED: + attempt_count = attempt_count + 1 + + return attempt_count + def get_param_values( self, app, ignore_errors=False ): """ Read encoded parameter values from the database and turn back into a diff --git a/test/integration/resubmission_job_conf.xml b/test/integration/resubmission_job_conf.xml index 3148c2cc41f..7849442b50f 100644 --- a/test/integration/resubmission_job_conf.xml +++ b/test/integration/resubmission_job_conf.xml @@ -1,7 +1,6 @@ @@ -40,6 +39,13 @@ + + + test_value + + + + diff --git a/test/integration/resubmission_runners.py b/test/integration/resubmission_runners.py index a1e58451033..6cd582b9f3a 100644 --- a/test/integration/resubmission_runners.py +++ b/test/integration/resubmission_runners.py @@ -17,6 +17,7 @@ class FailsJobRunner(LocalJobRunner): ) if failure_state is not None: job_state.runner_state = failure_state + job_state.stop_job = False self.fail_job(job_state, exception=True) diff --git a/test/integration/test_job_resubmission.py b/test/integration/test_job_resubmission.py index 5d5e958854b..eb9290b0916 100644 --- a/test/integration/test_job_resubmission.py +++ b/test/integration/test_job_resubmission.py @@ -57,6 +57,14 @@ class JobResubmissionIntegrationTestCase(integration_util.IntegrationTestCase): "initial_destination": "fail_first_any_failure", "failure_state": "unknown_error"}) + def test_condition_attempt(self): + self._assert_job_fails(resource_parameters={"test_name": "test_condition_attempt", + "initial_destination": "fail_two_attempts", + "failure_state": "unknown_error"}) + self._assert_job_passes(resource_parameters={"test_name": "test_condition_attempt", + "initial_destination": "fail_two_attempts", + "failure_state": "walltime_reached"}) + def _assert_job_passes(self, resource_parameters): self._run_tool_test("simple_constructs", resource_parameters=resource_parameters)