From be363295d9b601826a5026161c63822b0768b716 Mon Sep 17 00:00:00 2001
From: John Chilton <jmchilton@gmail.com>
Date: Wed, 28 Sep 2022 09:34:03 -0400
Subject: [PATCH] Fix Pulsar for exit code handling changes in
 https://github.com/galaxyproject/galaxy/pull/13557/files

---
 pulsar/managers/base/__init__.py            |  7 ++++++-
 pulsar/managers/base/directory.py           | 16 +++++++++++++---
 pulsar/managers/queued_cli.py               |  4 +++-
 pulsar/managers/unqueued.py                 |  6 ++++--
 pulsar/managers/util/job_script/__init__.py |  2 +-
 5 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/pulsar/managers/base/__init__.py b/pulsar/managers/base/__init__.py
index 92670473..2bbe0e8e 100644
--- a/pulsar/managers/base/__init__.py
+++ b/pulsar/managers/base/__init__.py
@@ -6,6 +6,7 @@ import errno
 import json
 import logging
 import os
+import platform
 from os import (
     curdir,
     getenv,
@@ -78,6 +79,10 @@ class BaseManager(ManagerInterface):
         self.job_metrics = app.job_metrics
         self.object_store = app.object_store
 
+    @property
+    def _is_windows(self) -> bool:
+        return platform.system().lower() == "windows"
+
     def clean(self, job_id):
         if self.debug:
             # In debug mode skip cleaning job directories.
@@ -193,7 +198,7 @@ class BaseManager(ManagerInterface):
         else:
             return listdir(directory_or_none)
 
-    def _expand_command_line(self, command_line, dependencies_description, job_directory=None):
+    def _expand_command_line(self, job_id, command_line: str, dependencies_description, job_directory=None) -> str:
         if dependencies_description is None:
             return command_line
 
diff --git a/pulsar/managers/base/directory.py b/pulsar/managers/base/directory.py
index 9390758a..98e133e5 100644
--- a/pulsar/managers/base/directory.py
+++ b/pulsar/managers/base/directory.py
@@ -117,9 +117,21 @@ class DirectoryBaseManager(BaseManager):
             tool_id = job_directory.load_metadata(JOB_FILE_TOOL_ID)
         return tool_id
 
+    def _expand_command_line(self, job_id, command_line: str, dependencies_description, job_directory=None) -> str:
+        command_line = super()._expand_command_line(
+            job_id, command_line, dependencies_description, job_directory=job_directory
+        )
+        if not self._is_windows:
+            rc_path = self._return_code_path(job_id)
+            CAPTURE_RETURN_CODE = "return_code=$?"
+            command_line = f"{command_line}; {CAPTURE_RETURN_CODE}; echo $return_code > {rc_path};"
+        return command_line
+
     # Helpers methods related to setting up job script files.
     def _setup_job_file(self, job_id, command_line, dependencies_description=None, env=[], setup_params=None):
-        command_line = self._expand_command_line(command_line, dependencies_description, job_directory=self.job_directory(job_id).job_directory)
+        command_line = self._expand_command_line(
+            job_id, command_line, dependencies_description, job_directory=self.job_directory(job_id).job_directory
+        )
         script_env = self._job_template_env(job_id, command_line=command_line, env=env, setup_params=setup_params)
         script = job_script(**script_env)
         return self._write_job_script(job_id, script)
@@ -138,7 +150,6 @@ class DirectoryBaseManager(BaseManager):
             return tmp_dir
 
     def _job_template_env(self, job_id, command_line=None, env=[], setup_params=None):
-        return_code_path = self._return_code_path(job_id)
         # TODO: Add option to ignore remote env.
         env = env + self.env_vars
         setup_params = setup_params or {}
@@ -149,7 +160,6 @@ class DirectoryBaseManager(BaseManager):
             'galaxy_lib': self._galaxy_lib(),
             'preserve_python_environment': setup_params.get('preserve_galaxy_python_environment', False),
             'env_setup_commands': env_setup_commands,
-            'exit_code_path': return_code_path,
             'job_directory': self.job_directory(job_id).job_directory,
             'working_directory': self.job_directory(job_id).working_directory(),
             'metadata_directory': self.job_directory(job_id).metadata_directory(),
diff --git a/pulsar/managers/queued_cli.py b/pulsar/managers/queued_cli.py
index 5216e7ef..bc24dd2f 100644
--- a/pulsar/managers/queued_cli.py
+++ b/pulsar/managers/queued_cli.py
@@ -30,7 +30,9 @@ class CliQueueManager(ExternalBaseManager):
         stdout_path = self._stdout_path(job_id)
         stderr_path = self._stderr_path(job_id)
         job_name = self._job_name(job_id)
-        command_line = self._expand_command_line(command_line, dependencies_description, job_directory=self.job_directory(job_id).job_directory)
+        command_line = self._expand_command_line(
+            job_id, command_line, dependencies_description, job_directory=self.job_directory(job_id).job_directory
+        )
         job_script_kwargs = self._job_template_env(
             job_id,
             command_line=command_line,
diff --git a/pulsar/managers/unqueued.py b/pulsar/managers/unqueued.py
index 75e282e7..9a791148 100644
--- a/pulsar/managers/unqueued.py
+++ b/pulsar/managers/unqueued.py
@@ -60,10 +60,12 @@ class BaseUnqueuedManager(DirectoryBaseManager):
     def _prepare_run(self, job_id, command_line, dependencies_description, env, setup_params=None):
         self._check_execution_with_tool_file(job_id, command_line)
         self._record_submission(job_id)
-        if platform.system().lower() == "windows":
+        if self._is_windows:
             # TODO: Don't ignore requirements and env without warning. Ideally
             # process them or at least warn about them being ignored.
-            command_line = self._expand_command_line(command_line, dependencies_description, job_directory=self.job_directory(job_id).job_directory)
+            command_line = self._expand_command_line(
+                job_id, command_line, dependencies_description, job_directory=self.job_directory(job_id).job_directory
+            )
         else:
             command_line = self._setup_job_file(
                 job_id,
diff --git a/pulsar/managers/util/job_script/__init__.py b/pulsar/managers/util/job_script/__init__.py
index e89eb285..3d662811 100644
--- a/pulsar/managers/util/job_script/__init__.py
+++ b/pulsar/managers/util/job_script/__init__.py
@@ -42,7 +42,7 @@ INTEGRITY_SYNC_COMMAND = "/bin/sync"
 DEFAULT_INTEGRITY_CHECK = True
 DEFAULT_INTEGRITY_COUNT = 35
 DEFAULT_INTEGRITY_SLEEP = 0.25
-REQUIRED_TEMPLATE_PARAMS = ["working_directory", "command", "exit_code_path"]
+REQUIRED_TEMPLATE_PARAMS = ["working_directory", "command"]
 OPTIONAL_TEMPLATE_PARAMS: Dict[str, Any] = {
     "galaxy_lib": None,
     "galaxy_virtual_env": None,
-- 
GitLab