X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/b7c46875f592b2f959f504e7f583979a594d528f..7865723dc5eee129e7ac269f3495274a13ff70ae:/sdk/cwl/arvados_cwl/__init__.py diff --git a/sdk/cwl/arvados_cwl/__init__.py b/sdk/cwl/arvados_cwl/__init__.py index 8880f94c44..21b629f37a 100644 --- a/sdk/cwl/arvados_cwl/__init__.py +++ b/sdk/cwl/arvados_cwl/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Copyright (C) The Arvados Authors. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 @@ -22,6 +22,7 @@ import cwltool.main import cwltool.workflow import cwltool.process import cwltool.argparser +from cwltool.errors import WorkflowException from cwltool.process import shortname, UnsupportedRequirement, use_custom_schema from cwltool.utils import adjustFileObjs, adjustDirObjs, get_listing @@ -151,6 +152,10 @@ def arg_parser(): # type: () -> argparse.ArgumentParser help="When invoked with --submit --wait, always submit a runner to manage the workflow, even when only running a single CommandLineTool", default=False) + parser.add_argument("--match-submitter-images", action="store_true", + default=False, dest="match_local_docker", + help="Where Arvados has more than one Docker image of the same name, use image from the Docker instance on the submitting node.") + exgroup = parser.add_mutually_exclusive_group() exgroup.add_argument("--submit-request-uuid", default=None, @@ -176,9 +181,11 @@ def arg_parser(): # type: () -> argparse.ArgumentParser parser.add_argument("--enable-dev", action="store_true", help="Enable loading and running development versions " - "of CWL spec.", default=False) + "of the CWL standards.", default=False) parser.add_argument('--storage-classes', default="default", - help="Specify comma separated list of storage classes to be used when saving workflow output to Keep.") + help="Specify comma separated list of storage classes to be used when saving final workflow output to Keep.") + parser.add_argument('--intermediate-storage-classes', default="default", + help="Specify comma separated list of storage classes to be used when saving intermediate workflow output to Keep.") parser.add_argument("--intermediate-output-ttl", type=int, metavar="N", help="If N > 0, intermediate output collections will be trashed N seconds after creation. Default is 0 (don't trash).", @@ -192,16 +199,28 @@ def arg_parser(): # type: () -> argparse.ArgumentParser action="store_false", default=True, help=argparse.SUPPRESS) + parser.add_argument("--disable-color", dest="enable_color", + action="store_false", default=True, + help=argparse.SUPPRESS) + parser.add_argument("--disable-js-validation", action="store_true", default=False, help=argparse.SUPPRESS) parser.add_argument("--thread-count", type=int, - default=1, help="Number of threads to use for job submit and output collection.") + default=0, help="Number of threads to use for job submit and output collection.") parser.add_argument("--http-timeout", type=int, default=5*60, dest="http_timeout", help="API request timeout in seconds. Default is 300 seconds (5 minutes).") + exgroup = parser.add_mutually_exclusive_group() + exgroup.add_argument("--enable-preemptible", dest="enable_preemptible", default=None, action="store_true", help="Use preemptible instances. Control individual steps with arv:UsePreemptible hint.") + exgroup.add_argument("--disable-preemptible", dest="enable_preemptible", default=None, action="store_false", help="Don't use preemptible instances.") + + exgroup = parser.add_mutually_exclusive_group() + exgroup.add_argument("--copy-deps", dest="copy_deps", default=None, action="store_true", help="Copy dependencies into the destination project.") + exgroup.add_argument("--no-copy-deps", dest="copy_deps", default=None, action="store_false", help="Leave dependencies where they are.") + parser.add_argument( "--skip-schemas", action="store_true", @@ -226,15 +245,12 @@ def arg_parser(): # type: () -> argparse.ArgumentParser def add_arv_hints(): cwltool.command_line_tool.ACCEPTLIST_EN_RELAXED_RE = re.compile(r".*") cwltool.command_line_tool.ACCEPTLIST_RE = cwltool.command_line_tool.ACCEPTLIST_EN_RELAXED_RE - res10 = pkg_resources.resource_stream(__name__, 'arv-cwl-schema-v1.0.yml') - res11 = pkg_resources.resource_stream(__name__, 'arv-cwl-schema-v1.1.yml') - customschema10 = res10.read().decode('utf-8') - customschema11 = res11.read().decode('utf-8') - use_custom_schema("v1.0", "http://arvados.org/cwl", customschema10) - use_custom_schema("v1.1.0-dev1", "http://arvados.org/cwl", customschema11) - use_custom_schema("v1.1", "http://arvados.org/cwl", customschema11) - res10.close() - res11.close() + supported_versions = ["v1.0", "v1.1", "v1.2"] + for s in supported_versions: + res = pkg_resources.resource_stream(__name__, 'arv-cwl-schema-%s.yml' % s) + customschema = res.read().decode('utf-8') + use_custom_schema(s, "http://arvados.org/cwl", customschema) + res.close() cwltool.process.supportedProcessRequirements.extend([ "http://arvados.org/cwl#RunInSingleContainer", "http://arvados.org/cwl#OutputDirType", @@ -244,24 +260,28 @@ def add_arv_hints(): "http://commonwl.org/cwltool#LoadListingRequirement", "http://arvados.org/cwl#IntermediateOutput", "http://arvados.org/cwl#ReuseRequirement", - "http://arvados.org/cwl#ClusterTarget" + "http://arvados.org/cwl#ClusterTarget", + "http://arvados.org/cwl#OutputStorageClass", + "http://arvados.org/cwl#ProcessProperties", + "http://commonwl.org/cwltool#CUDARequirement", + "http://arvados.org/cwl#UsePreemptible", ]) def exit_signal_handler(sigcode, frame): logger.error(str(u"Caught signal {}, exiting.").format(sigcode)) sys.exit(-sigcode) -def main(args, stdout, stderr, api_client=None, keep_client=None, +def main(args=sys.argv[1:], + stdout=sys.stdout, + stderr=sys.stderr, + api_client=None, + keep_client=None, install_sig_handlers=True): parser = arg_parser() job_order_object = None arvargs = parser.parse_args(args) - if len(arvargs.storage_classes.strip().split(',')) > 1: - logger.error(str(u"Multiple storage classes are not supported currently.")) - return 1 - arvargs.use_container = True arvargs.relax_path_checks = True arvargs.print_supported_versions = False @@ -299,7 +319,10 @@ def main(args, stdout, stderr, api_client=None, keep_client=None, api_client.users().current().execute() if keep_client is None: keep_client = arvados.keep.KeepClient(api_client=api_client, num_retries=4) - executor = ArvCwlExecutor(api_client, arvargs, keep_client=keep_client, num_retries=4) + executor = ArvCwlExecutor(api_client, arvargs, keep_client=keep_client, num_retries=4, stdout=stdout) + except WorkflowException as e: + logger.error(e, exc_info=(sys.exc_info()[1] if arvargs.debug else False)) + return 1 except Exception: logger.exception("Error creating the Arvados CWL Executor") return 1 @@ -344,5 +367,5 @@ def main(args, stdout, stderr, api_client=None, keep_client=None, logger_handler=arvados.log_handler, custom_schema_callback=add_arv_hints, loadingContext=executor.loadingContext, - runtimeContext=executor.runtimeContext, + runtimeContext=executor.toplevel_runtimeContext, input_required=not (arvargs.create_workflow or arvargs.update_workflow))