Do not replace Galaxy's Python environment for select tools.

This has never happened in my testing, but there have been multiple reports of Conda crafting environments for the set metadata tool that include Python. When this happens Galaxy's Python environment is lost and the tool cannot function properly.

Fixes #3238.
Fixes #3224.
Fixes https://biostar.usegalaxy.org/p/20865/.

Rebased to add a comment as suggested by @nsoranzo.
This commit is contained in:
John Chilton
2016-12-21 13:32:50 -05:00
parent 22fda449f9
commit fe2a1d8ade
2 changed files with 30 additions and 7 deletions
+11
View File
@@ -375,6 +375,16 @@ class Tool( object, Dictifiable ):
def valid_input_states( self ):
return model.Dataset.valid_input_states
@property
def requires_galaxy_python_environment(self):
"""Indicates this tool's runtime requires Galaxy's Python environment."""
# All special tool types (data source, history import/export, etc...)
# seem to require Galaxy's Python.
return self.tool_type != "default" or self.id in [
"__SET_METADATA__",
"upload1",
]
def __get_job_tool_configuration(self, job_params=None):
"""Generalized method for getting this tool's job configuration.
@@ -1288,6 +1298,7 @@ class Tool( object, Dictifiable ):
installed_tool_dependencies=self.installed_tool_dependencies,
tool_dir=self.tool_dir,
job_directory=job_directory,
preserve_python_environment=self.requires_galaxy_python_environment,
metadata=metadata,
)
+19 -7
View File
@@ -164,6 +164,8 @@ class CondaDependencyResolver(DependencyResolver, ListableDependencyResolver, In
log.warning("Conda dependency resolver not sent job directory.")
return NullDependency(version=version, name=name)
preserve_python_environment = kwds.get("preserve_python_environment", False)
if not is_installed and self.auto_install:
is_installed = self.install_dependency(name=name, version=version, type=type)
@@ -190,7 +192,8 @@ class CondaDependencyResolver(DependencyResolver, ListableDependencyResolver, In
conda_environment,
exact,
name,
version
version,
preserve_python_environment,
)
else:
if len(conda_environment) > 79:
@@ -247,12 +250,13 @@ class CondaDependency(Dependency):
dict_collection_visible_keys = Dependency.dict_collection_visible_keys + ['environment_path', 'name', 'version']
dependency_type = 'conda'
def __init__(self, activate, environment_path, exact, name=None, version=None):
def __init__(self, activate, environment_path, exact, name=None, version=None, preserve_python_environment=False):
self.activate = activate
self.environment_path = environment_path
self._exact = exact
self._name = name
self._version = version
self._preserve_python_environment = preserve_python_environment
@property
def exact(self):
@@ -267,11 +271,19 @@ class CondaDependency(Dependency):
return self._version
def shell_commands(self, requirement):
return """[ "$CONDA_DEFAULT_ENV" = "%s" ] || . %s '%s' 2>&1 """ % (
self.environment_path,
self.activate,
self.environment_path
)
if self._preserve_python_environment:
# On explicit testing the only such requirement I am aware of is samtools - and it seems to work
# fine with just appending the PATH as done below. Other tools may require additional
# variables in the future.
return """export PATH=$PATH:'%s/bin' """ % (
self.environment_path,
)
else:
return """[ "$CONDA_DEFAULT_ENV" = "%s" ] || . %s '%s' 2>&1 """ % (
self.environment_path,
self.activate,
self.environment_path
)
def _string_as_bool( value ):