|
21 | 21 | from typing import Union, Iterable, Callable, Any, Mapping, IO, cast, Tuple |
22 | 22 | from .pathmapper import PathMapper |
23 | 23 | import functools |
| 24 | +try: |
| 25 | + from galaxy.tools.deps.requirements import ToolRequirement |
| 26 | +except ImportError: |
| 27 | + ToolRequirement = None |
24 | 28 |
|
25 | 29 | _logger = logging.getLogger("cwltool") |
26 | 30 |
|
@@ -63,6 +67,7 @@ def __init__(self): # type: () -> None |
63 | 67 | self.tmpdir = None # type: str |
64 | 68 | self.environment = None # type: Dict[str,str] |
65 | 69 | self.generatefiles = None # type: Dict[str,Union[Dict[str,str],str]] |
| 70 | + self.dependency_manager = None # type: DependencyManager |
66 | 71 |
|
67 | 72 | def run(self, dry_run=False, pull_image=True, rm_container=True, |
68 | 73 | rm_tmpdir=True, move_outputs=True, **kwargs): |
@@ -191,6 +196,17 @@ def run(self, dry_run=False, pull_image=True, rm_container=True, |
191 | 196 | else: |
192 | 197 | stdout_path = None |
193 | 198 |
|
| 199 | + prefix = None |
| 200 | + job_dir = None |
| 201 | + if self.tool_dependency_manager is not None: |
| 202 | + dependencies = self._find_tool_dependencies() |
| 203 | + job_dir = tempfile.mkdtemp(prefix="cwltooljob") |
| 204 | + shell_commands = self.tool_dependency_manager.dependency_shell_commands( |
| 205 | + dependencies, |
| 206 | + job_directory=job_dir, |
| 207 | + ) |
| 208 | + prefix = "\n".join(shell_commands) |
| 209 | + |
194 | 210 | rcode = shelled_popen( |
195 | 211 | [str(x) for x in runtime + self.command_line], |
196 | 212 | stdin_path=stdin_path, |
@@ -252,6 +268,23 @@ def run(self, dry_run=False, pull_image=True, rm_container=True, |
252 | 268 | _logger.debug(u"[job %s] Removing empty output directory %s", self.name, self.outdir) |
253 | 269 | shutil.rmtree(self.outdir, True) |
254 | 270 |
|
| 271 | + def _find_tool_dependencies(self): |
| 272 | + dependencies = [] |
| 273 | + for hint in self.hints: |
| 274 | + hint_class = hint.get("class", "") |
| 275 | + if not hint_class: |
| 276 | + continue |
| 277 | + prefix, base_name = hint["class"].rsplit("/", 1) |
| 278 | + if base_name == "Dependency": |
| 279 | + requirement_desc = {} |
| 280 | + requirement_desc["type"] = "package" |
| 281 | + name = hint["name"].rsplit("#", 1)[-1] |
| 282 | + version = hint.get("version", "").rsplit("#", 1)[-1] |
| 283 | + requirement_desc["name"] = name |
| 284 | + requirement_desc["version"] = version or None |
| 285 | + dependencies.append(ToolRequirement.from_dict(requirement_desc)) |
| 286 | + return dependencies |
| 287 | + |
255 | 288 |
|
256 | 289 | SHELL_COMMAND_TEMPLATE = string.Template("""#!/bin/bash |
257 | 290 | $prefix |
@@ -308,6 +341,7 @@ def shelled_popen(commands, |
308 | 341 | stdout_path, |
309 | 342 | env, |
310 | 343 | cwd, |
| 344 | + job_dir=None, |
311 | 345 | prefix=None): |
312 | 346 | if prefix is None and not FORCE_SHELLED_POPEN: |
313 | 347 | if stdin_path is not None: |
@@ -341,13 +375,15 @@ def shelled_popen(commands, |
341 | 375 |
|
342 | 376 | return rcode |
343 | 377 | else: |
| 378 | + if job_dir is None: |
| 379 | + job_dir = tempfile.mkdtemp(prefix="cwltooljob") |
| 380 | + |
344 | 381 | template_kwds = dict( |
345 | 382 | prefix=prefix or '', |
346 | 383 | ) |
347 | 384 | job_script_contents = SHELL_COMMAND_TEMPLATE.substitute( |
348 | 385 | **template_kwds |
349 | 386 | ) |
350 | | - job_dir = tempfile.mkdtemp(prefix="cwltooljob") |
351 | 387 | job_description = dict( |
352 | 388 | commands=commands, |
353 | 389 | cwd=cwd, |
|
0 commit comments