diff --git a/.travis.yml b/.travis.yml index 282739874d10599bc7363afb668ad4ef54d0363d..efbff23c009b58cda56dc3dc284944ac62e682e1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ # TODO: test condor language: python +dist: trusty matrix: include: - python: 2.7 diff --git a/docker/coexecutor/Dockerfile b/docker/coexecutor/Dockerfile index 7d55e69a58bce36a1379b3d089153b4d15434ba7..8ffc70ddc9f65f89953faabe94839916f454d328 100644 --- a/docker/coexecutor/Dockerfile +++ b/docker/coexecutor/Dockerfile @@ -4,13 +4,14 @@ ENV PYTHONUNBUFFERED 1 ENV DEBIAN_FRONTEND noninteractive ENV PULSAR_CONFIG_CONDA_PREFIX /usr/local +# wget, gcc, pip - to build and install Pulsar. +# bzip2 for Miniconda. # TODO: pycurl stuff... - RUN apt-get update \ - # Install CVMFS client && apt-get install -y --no-install-recommends lsb-release wget \ gcc python-setuptools \ python-dev python-pip \ + bzip2 \ && apt-get -y autoremove \ && apt-get autoclean \ && rm -rf /var/lib/apt/lists/* /var/log/dpkg.log @@ -19,4 +20,5 @@ RUN pip install -U pip && pip install wheel kombu pykube poster ADD pulsar_app-*.dev0-py2.py3-none-any.whl /pulsar_app-*.dev0-py2.py3-none-any.whl -RUN pip install /pulsar_app-*.dev0-py2.py3-none-any.whl +RUN pip install /pulsar_app-*.dev0-py2.py3-none-any.whl[galaxy_extended_metadata] +RUN _pulsar-conda-init --conda_prefix=/pulsar_dependencies/conda diff --git a/docker/coexecutor/Makefile b/docker/coexecutor/Makefile index ec1ab0afaf286936b31387535a39aa764081d720..26ede1af46244c922ebd6b89c9f6bab71f519345 100644 --- a/docker/coexecutor/Makefile +++ b/docker/coexecutor/Makefile @@ -1,7 +1,9 @@ -docker-image: +dist: cd ../..; make dist; cp dist/pulsar*whl docker/coexecutor -all: docker-image - docker build -t 'galaxy/pulsar-pod-staging:0.12.0' . +docker-image: + docker build -t 'galaxy/pulsar-pod-staging:0.13.0' . + +all: dist docker-image diff --git a/pulsar/client/client.py b/pulsar/client/client.py index 81b4cc134d4c29e233fbc975bf3d7c355238635c..298c0458a06e6ad0495fcd3ad6a78752a5f64390 100644 --- a/pulsar/client/client.py +++ b/pulsar/client/client.py @@ -397,9 +397,6 @@ class MessageCoexecutionPodJobClient(BaseMessageJobClient): volume_mounts = [ {"mountPath": "/pulsar_staging", "name": "staging-directory"}, ] - tool_container_image = container # TODO: this isn't right at all... - if not container: - raise Exception("Must declare a container for kubernetes job execution.") pulsar_container_dict = { "name": "pulsar-container", "image": pulsar_container_image, @@ -408,17 +405,19 @@ class MessageCoexecutionPodJobClient(BaseMessageJobClient): "workingDir": "/", "volumeMounts": volume_mounts, } - command = TOOL_EXECUTION_CONTAINER_COMMAND_TEMPLATE % job_directory.job_directory - tool_container_spec = { - "name": "tool-container", - "image": tool_container_image, - "command": ["sh"], - "args": ["-c", command], - "workingDir": "/", - "volumeMounts": volume_mounts, - } - - container_dicts = [pulsar_container_dict, tool_container_spec] + tool_container_image = container + container_dicts = [pulsar_container_dict] + if container: + command = TOOL_EXECUTION_CONTAINER_COMMAND_TEMPLATE % job_directory.job_directory + tool_container_spec = { + "name": "tool-container", + "image": tool_container_image, + "command": ["sh"], + "args": ["-c", command], + "workingDir": "/", + "volumeMounts": volume_mounts, + } + container_dicts.append(tool_container_spec) for container_dict in container_dicts: if self._default_pull_policy: container_dict["imagePullPolicy"] = self._default_pull_policy diff --git a/pulsar/client/staging/__init__.py b/pulsar/client/staging/__init__.py index 86cb2158ae011d1bb3d611838baf197ac93b694c..00e16c5d19ac66f239e4115d2333970a202026ec 100644 --- a/pulsar/client/staging/__init__.py +++ b/pulsar/client/staging/__init__.py @@ -14,7 +14,7 @@ from galaxy.util.bunch import Bunch from ..util import PathHelper COMMAND_VERSION_FILENAME = "COMMAND_VERSION" -DEFAULT_DYNAMIC_COLLECTION_PATTERN = [r"primary_.*|galaxy.json|metadata_.*|dataset_\d+\.dat|__instrument_.*|dataset_\d+_files.+"] +DEFAULT_DYNAMIC_COLLECTION_PATTERN = [r"primary_.*|galaxy.json|metadata_.*|dataset_\d+\.dat|__instrument_.*|dataset_\d+_files.+|outputs_populated/.*"] class ClientJobDescription(object): diff --git a/pulsar/core.py b/pulsar/core.py index 2f392d492560ac4f73e88df7e30dd5684b1b2040..f3e497aac3e94a39f887ac54a4e2bf4a89adbdf1 100644 --- a/pulsar/core.py +++ b/pulsar/core.py @@ -10,11 +10,13 @@ from pulsar.tools.authorization import get_authorizer from pulsar import messaging from galaxy.objectstore import build_object_store_from_config try: - # If galaxy-lib or Galaxy <19.05 present. - from galaxy.tools.deps import DependencyManager -except ImportError: # If galaxy-tool-util or Galaxy >=19.09 present. + from galaxy.tools.deps import build_dependency_manager + DependencyManager = None +except ImportError: + # If galaxy-lib or Galaxy <19.05 present. from galaxy.tool_util.deps import DependencyManager + build_dependency_manager = None try: # If galaxy-lib or Galaxy <19.05 present. from galaxy.jobs.metrics import JobMetrics @@ -140,10 +142,13 @@ class PulsarApp(object): self.object_store = build_object_store_from_config(object_store_config, config_dict=config_dict) def __setup_dependency_manager(self, conf): - dependencies_dir = conf.get("tool_dependency_dir", "dependencies") - resolvers_config_file = conf.get("dependency_resolvers_config_file", "dependency_resolvers_conf.xml") - conda_config = {k: v for k, v in conf.items() if k.startswith("conda_")} - self.dependency_manager = DependencyManager(dependencies_dir, resolvers_config_file, app_config=conda_config) + if build_dependency_manager is not None: + self.dependency_manager = build_dependency_manager(app_config_dict=conf) + else: + dependencies_dir = conf.get("tool_dependency_dir", "dependencies") + resolvers_config_file = conf.get("dependency_resolvers_config_file", "dependency_resolvers_conf.xml") + conda_config = {k: v for k, v in conf.items() if k.startswith("conda_")} + self.dependency_manager = DependencyManager(dependencies_dir, resolvers_config_file, app_config=conda_config) def __setup_job_metrics(self, conf): job_metrics = conf.get("job_metrics", None) diff --git a/pulsar/scripts/_conda_init.py b/pulsar/scripts/_conda_init.py new file mode 100644 index 0000000000000000000000000000000000000000..dad2b8b7ca0dd525cc0d326100283384972cf909 --- /dev/null +++ b/pulsar/scripts/_conda_init.py @@ -0,0 +1,28 @@ +"""Small utility for bootstrapping a Conda environment for Pulsar. + +This should probably be moved into galaxy-tool-util. +""" + +import os.path +import sys +from argparse import ArgumentParser + +from galaxy.tool_util.deps.conda_util import CondaContext, install_conda +from galaxy.util import safe_makedirs + + +def main(argv=None): + mod_docstring = sys.modules[__name__].__doc__ + arg_parser = ArgumentParser(description=mod_docstring) + arg_parser.add_argument("--conda_prefix", required=True) + args = arg_parser.parse_args(argv) + conda_prefix = args.conda_prefix + safe_makedirs(os.path.dirname(conda_prefix)) + conda_context = CondaContext( + conda_prefix=conda_prefix, + ) + install_conda(conda_context) + + +if __name__ == "__main__": + main() diff --git a/setup.py b/setup.py index d9cd7db624063e00910beb3b099fe6422205f348..2064548f7b0b7f2d81837406b2b16950ffa34587 100644 --- a/setup.py +++ b/setup.py @@ -100,6 +100,7 @@ setup( pulsar-chown-working-directory=pulsar.scripts.chown_working_directory:main pulsar-submit=pulsar.scripts.submit:main pulsar-run=pulsar.scripts.run:main + _pulsar-conda-init=pulsar.scripts._conda_init:main ''', scripts=scripts, package_data={'pulsar': [ @@ -111,6 +112,7 @@ setup( install_requires=requirements, extras_require={ ':python_version=="2.7"': py27_requirements, + 'galaxy_extended_metadata': ['galaxy-job-execution>=19.9.0.dev0'], }, license="Apache License 2.0", zip_safe=False,