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'
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
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'