mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-21 13:50:20 +08:00
Merge pull request #6 from jmchilton/fail_if_galaxy_json_tools_write_to_stderr
Let ToolProvidedMetadata interface more directly decide if it has failed outputs.
This commit is contained in:
@@ -27,10 +27,6 @@ from galaxy.exceptions import ObjectInvalid, ObjectNotFound
|
||||
from galaxy.jobs.actions.post import ActionBox
|
||||
from galaxy.jobs.mapper import JobRunnerMapper
|
||||
from galaxy.jobs.runners import BaseJobRunner, JobState
|
||||
from galaxy.tools.parameters.output_collect import (
|
||||
LegacyToolProvidedMetadata,
|
||||
ToolProvidedMetadata
|
||||
)
|
||||
from galaxy.util import safe_makedirs, unicodify
|
||||
from galaxy.util.bunch import Bunch
|
||||
from galaxy.util.expressions import ExpressionContext
|
||||
@@ -1184,17 +1180,6 @@ class JobWrapper(object, HasResourceParameters):
|
||||
|
||||
# We collect the stderr from tools that write their stderr to galaxy.json
|
||||
tool_provided_metadata = self.get_tool_provided_job_metadata()
|
||||
extra_stderr = ''
|
||||
if isinstance(tool_provided_metadata, LegacyToolProvidedMetadata):
|
||||
extra_stderr = [item.get('stderr') for item in tool_provided_metadata.tool_provided_job_metadata if item.get('stderr')]
|
||||
elif isinstance(tool_provided_metadata, ToolProvidedMetadata):
|
||||
extra_stderr = [item.get('stderr') for item in tool_provided_metadata.tool_provided_job_metadata.values() if item.get('stderr')]
|
||||
if extra_stderr:
|
||||
extra_stderr = "\n".join(extra_stderr)
|
||||
if stderr:
|
||||
stderr = "%s\n%s" % (stderr, extra_stderr)
|
||||
else:
|
||||
stderr = extra_stderr
|
||||
|
||||
# Check the tool's stdout, stderr, and exit code for errors, but only
|
||||
# if the job has not already been marked as having an error.
|
||||
@@ -1202,7 +1187,7 @@ class JobWrapper(object, HasResourceParameters):
|
||||
|
||||
# We set final_job_state to use for dataset management, but *don't* set
|
||||
# job.state until after dataset collection to prevent history issues
|
||||
if self.check_tool_output(stdout, stderr, tool_exit_code, job):
|
||||
if self.check_tool_output(stdout, stderr, tool_exit_code, job) and not tool_provided_metadata.has_failed_outputs():
|
||||
final_job_state = job.states.OK
|
||||
else:
|
||||
final_job_state = job.states.ERROR
|
||||
|
||||
@@ -32,6 +32,9 @@ class NullToolProvidedMetadata(object):
|
||||
def get_new_dataset_meta_by_basename(self, output_name, basename):
|
||||
return {}
|
||||
|
||||
def has_failed_outputs(self):
|
||||
return False
|
||||
|
||||
|
||||
class LegacyToolProvidedMetadata(object):
|
||||
|
||||
@@ -74,6 +77,14 @@ class LegacyToolProvidedMetadata(object):
|
||||
log.warning("Called get_new_datasets with legacy tool metadata provider - that is unimplemented.")
|
||||
return []
|
||||
|
||||
def has_failed_outputs(self):
|
||||
found_failed = False
|
||||
for meta in self.tool_provided_job_metadata:
|
||||
if meta.get("failed", False):
|
||||
found_failed = True
|
||||
|
||||
return found_failed
|
||||
|
||||
|
||||
class ToolProvidedMetadata(object):
|
||||
|
||||
@@ -112,6 +123,14 @@ class ToolProvidedMetadata(object):
|
||||
extra_kwds.update(element)
|
||||
yield extra_kwds
|
||||
|
||||
def has_failed_outputs(self):
|
||||
found_failed = False
|
||||
for meta in self.tool_provided_job_metadata.values():
|
||||
if meta.get("failed", False):
|
||||
found_failed = True
|
||||
|
||||
return found_failed
|
||||
|
||||
|
||||
def collect_dynamic_collections(
|
||||
tool,
|
||||
|
||||
@@ -43,7 +43,8 @@ def file_err(msg, dataset, json_file):
|
||||
json_file.write(dumps(dict(type='dataset',
|
||||
ext='data',
|
||||
dataset_id=dataset.dataset_id,
|
||||
stderr=msg)) + "\n")
|
||||
stderr=msg,
|
||||
failed=True)) + "\n")
|
||||
# never remove a server-side upload
|
||||
if dataset.type in ('server_dir', 'path_paste'):
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user