示例#1
0
    def supports_container(self, job_or_tool, container_type):
        """
        Job rules can pass this function a job, job_wrapper, or tool and
        determine if the underlying tool believes it can be run with a specific container type.

        :param job_or_tool:
        :param container_type: either "docker" or "singularity" currently
        :return: true if the tool supports the specified container type.
        """
        # Not a ton of logic in this method - but the idea is to shield rule
        # developers from the details and they shouldn't have to know how to
        # interrogate tool or job to figure out if it can be run in a
        # container.
        if hasattr(job_or_tool, 'containers'):
            tool = job_or_tool
        elif hasattr(job_or_tool, 'tool'):
            # Have a JobWrapper-like
            tool = job_or_tool.tool
        else:
            # Have a Job object.
            tool = self.app.toolbox.get_tool(
                job_or_tool.tool_id, tool_version=job_or_tool.tool_version)
        tool_info = ToolInfo(tool.containers, tool.requirements,
                             tool.requires_galaxy_python_environment,
                             tool.docker_env_pass_through)
        container_description = self.app.container_finder.find_best_container_description(
            [container_type], tool_info)
        return container_description is not None
def get_container_from_software_requirements(
        use_biocontainers: bool, builder: "HasReqsHints") -> Optional[str]:
    if use_biocontainers:
        ensure_galaxy_lib_available()
        from galaxy.tool_util.deps.containers import (
            DOCKER_CONTAINER_TYPE,
            ContainerRegistry,
        )
        from galaxy.tool_util.deps.dependencies import AppInfo, ToolInfo

        app_info = AppInfo(
            involucro_auto_init=True,
            enable_mulled_containers=True,
            container_image_cache_path=".",
        )  # type: AppInfo
        container_registry = ContainerRegistry(
            app_info)  # type: ContainerRegistry
        requirements = get_dependencies(builder)
        tool_info = ToolInfo(requirements=requirements)  # type: ToolInfo
        container_description = container_registry.find_best_container_description(
            [DOCKER_CONTAINER_TYPE], tool_info)
        if container_description:
            return container_description.identifier

    return None
def test_docker_container_docker_cli_absent_resolve(mocker):
    mocker.patch('galaxy.tool_util.deps.container_resolvers.mulled.which', return_value=None)
    resolver = MulledDockerContainerResolver()
    assert resolver.cli_available is False
    requirement = ToolRequirement(name="samtools", version="1.10", type="package")
    tool_info = ToolInfo(requirements=[requirement])
    mocker.patch('galaxy.tool_util.deps.container_resolvers.mulled.targets_to_mulled_name', return_value='samtools:1.10--h2e538c0_3')
    container_description = resolver.resolve(enabled_container_types=['docker'], tool_info=tool_info)
    assert container_description.type == 'docker'
    assert container_description.identifier == 'quay.io/biocontainers/samtools:1.10--h2e538c0_3'
def test_docker_container_docker_cli_exception_resolve(mocker):
    mocker.patch('galaxy.tool_util.deps.container_resolvers.mulled.which', return_value='/bin/docker')
    resolver = MulledDockerContainerResolver()
    assert resolver.cli_available is True
    requirement = ToolRequirement(name="samtools", version="1.10", type="package")
    tool_info = ToolInfo(requirements=[requirement])
    mocker.patch('galaxy.tool_util.deps.container_resolvers.mulled.targets_to_mulled_name', return_value='samtools:1.10--h2e538c0_3')
    mocker.patch('galaxy.tool_util.deps.container_resolvers.mulled.docker_cached_container_description', side_effect=CalledProcessError(1, 'bla'))
    container_description = resolver.resolve(enabled_container_types=['docker'], tool_info=tool_info, install=True)
    assert resolver.cli_available is True
    assert container_description.type == 'docker'
    assert container_description.identifier == 'quay.io/biocontainers/samtools:1.10--h2e538c0_3'
def test_cached_singularity_container_resolver_uncached(mocker):
    mocker.patch('os.listdir', return_value=SINGULARITY_IMAGES)
    mocker.patch('os.path.exists', return_value=True)
    mocker.patch(
        'galaxy.tool_util.deps.container_resolvers.mulled.safe_makedirs')
    resolver = CachedMulledSingularityContainerResolver(app_info=mocker.Mock(
        container_image_cache_path='/'))
    requirement = ToolRequirement(name="foo", version="1.0", type="package")
    tool_info = ToolInfo(requirements=[requirement])
    container_description = resolver.resolve(
        enabled_container_types=['singularity'], tool_info=tool_info)
    assert container_description.type == 'singularity'
    assert container_description.identifier == '/singularity/mulled/foo:1.0--bar'
示例#6
0
    def _find_container(
        self,
        job_wrapper,
        compute_working_directory=None,
        compute_tool_directory=None,
        compute_job_directory=None,
        compute_tmp_directory=None,
    ):
        job_directory_type = "galaxy" if compute_working_directory is None else "pulsar"
        if not compute_working_directory:
            compute_working_directory = job_wrapper.tool_working_directory

        if not compute_job_directory:
            compute_job_directory = job_wrapper.working_directory

        if not compute_tool_directory:
            compute_tool_directory = job_wrapper.tool.tool_dir

        if not compute_tmp_directory:
            compute_tmp_directory = job_wrapper.tmp_directory()

        tool = job_wrapper.tool
        guest_ports = job_wrapper.guest_ports
        tool_info = ToolInfo(
            tool.containers,
            tool.requirements,
            tool.requires_galaxy_python_environment,
            tool.docker_env_pass_through,
            guest_ports=guest_ports,
            tool_id=tool.id,
            tool_version=tool.version,
            profile=tool.profile,
        )
        job_info = JobInfo(
            working_directory=compute_working_directory,
            tool_directory=compute_tool_directory,
            job_directory=compute_job_directory,
            tmp_directory=compute_tmp_directory,
            home_directory=job_wrapper.home_directory(),
            job_directory_type=job_directory_type,
        )

        destination_info = job_wrapper.job_destination.params
        container = self.app.container_finder.find_container(
            tool_info,
            destination_info,
            job_info
        )
        if container:
            job_wrapper.set_container(container)
        return container
示例#7
0
    def _find_container(
        self,
        job_wrapper,
        compute_working_directory=None,
        compute_tool_directory=None,
        compute_job_directory=None,
        compute_tmp_directory=None,
    ):
        job_directory_type = "galaxy" if compute_working_directory is None else "pulsar"
        if not compute_working_directory:
            compute_working_directory = job_wrapper.tool_working_directory

        if not compute_job_directory:
            compute_job_directory = job_wrapper.working_directory

        if not compute_tool_directory:
            compute_tool_directory = job_wrapper.tool.tool_dir

        if not compute_tmp_directory:
            compute_tmp_directory = job_wrapper.tmp_directory()

        tool = job_wrapper.tool
        guest_ports = [
            ep.get('port')
            for ep in getattr(job_wrapper, 'interactivetools', [])
        ]
        tool_info = ToolInfo(tool.containers,
                             tool.requirements,
                             tool.requires_galaxy_python_environment,
                             tool.docker_env_pass_through,
                             guest_ports=guest_ports)
        job_info = JobInfo(
            compute_working_directory,
            compute_tool_directory,
            compute_job_directory,
            compute_tmp_directory,
            job_directory_type,
        )

        destination_info = job_wrapper.job_destination.params
        container = self.app.container_finder.find_container(
            tool_info, destination_info, job_info)
        if container:
            job_wrapper.set_container(container)
        return container
def test_cached_singularity_container_resolver_dir_mtime_cached(mocker):
    mocker.patch('os.listdir', return_value=SINGULARITY_IMAGES)
    mocker.patch('os.path.exists', return_value=True)
    mocker.patch(
        'galaxy.tool_util.deps.container_resolvers.mulled.safe_makedirs')
    mocker.patch('os.stat', return_value=mocker.Mock(st_mtime=42))
    resolver = CachedMulledSingularityContainerResolver(
        app_info=mocker.Mock(container_image_cache_path='/'),
        cache_directory_cacher_type='dir_mtime')
    requirement = ToolRequirement(name="baz", version="2.22", type="package")
    tool_info = ToolInfo(requirements=[requirement])
    container_description = resolver.resolve(
        enabled_container_types=['singularity'], tool_info=tool_info)
    assert container_description.type == 'singularity'
    assert container_description.identifier == '/singularity/mulled/baz:2.22'
    requirement = ToolRequirement(name="foo", version="1.0", type="package")
    tool_info.requirements.append(requirement)
    container_description = resolver.resolve(
        enabled_container_types=['singularity'], tool_info=tool_info)
    assert container_description.type == 'singularity'
    assert container_description.identifier == '/singularity/mulled/mulled-v2-fe8a3b846bc50d24e5df78fa0b562c43477fe9ce:9f946d13f673ab2903cb0da849ad42916d619d18-0'