#!/usr/bin/env python3
#
# Copyright (C) 2015 INRA
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
import sys
import argparse
try:
import _preamble
except ImportError:
sys.exc_clear()
from jflow.workflows_manager import WorkflowsManager
from jflow.workflow import Workflow
import jflow.utils as utils
from jflow.exceptions import RuleException, RuleIgnore
from jflow.argument_parser import JflowArgumentParser
if __name__ == '__main__':
# Create a workflow manager to get access to our workflows
wfmanager = WorkflowsManager()
# Create the top-level parser
parser = JflowArgumentParser()
subparsers = parser.add_subparsers(title='Available sub commands')
# Add rerun workflow availability
sub_parser = subparsers.add_parser("rerun", help="Rerun a specific workflow")
sub_parser.add_argument("--workflow-id", type=str, help="Which workflow should be rerun",
required=True, dest="workflow_id")
sub_parser.set_defaults(cmd_object="rerun")
# Add rerun workflow availability
sub_parser = subparsers.add_parser("reset", help="Reset a workflow component")
sub_parser.add_argument("--workflow-id", type=str, help="Which workflow should be used",
required=True, dest="workflow_id")
sub_parser.add_argument("--component-name", type=str, help="Which component should be reseted",
required=True, dest="component_name")
sub_parser.set_defaults(cmd_object="reset")
# Add delete workflow availability
sub_parser = subparsers.add_parser("delete", help="Delete a workflow")
sub_parser.add_argument("--workflow-id", type=str, help="Which workflow should be deleted",
required=True, dest="workflow_id")
sub_parser.set_defaults(cmd_object="delete")
# Add print details workflow availability
sub_parser = subparsers.add_parser("print", help="Print workflow details")
sub_parser.add_argument("what", help="What to print [outputs, outputs_logs, execution_graph, programs]",
metavar="COMMAND", choices=["outputs", "outputs_logs", "execution_graph", "programs"])
sub_parser.add_argument("--workflow-id", type=str, help="Workflow for which display outputs",
required=True, dest="workflow_id")
sub_parser.set_defaults(cmd_object="print")
# Add status workflow availability
sub_parser = subparsers.add_parser("status", help="Monitor a specific workflow")
sub_parser.add_argument("--workflow-id", type=str, help="Which workflow status should be displayed",
default=None, dest="workflow_id")
sub_parser.add_argument("--all", action="store_true", help="Display all workflows status",
default=False, dest="all")
sub_parser.add_argument("--errors", action="store_true", help="Display failed commands",
default=False, dest="display_errors")
sub_parser.set_defaults(cmd_object="status")
args = vars(parser.parse_args())
if not "cmd_object" in args:
print(parser.format_help())
parser.exit(0, "")
if args["cmd_object"] in wf_classes:
try:
workflow = wfmanager.get_workflow_by_class(args["cmd_object"])
workflow.check_parameters_rules(args)
except RuleException as e:
sub_parser.error(e)
except RuleIgnore:
pass
wfmanager.run_workflow(args["cmd_object"], args)
elif args["cmd_object"] == "rerun":
wfmanager.rerun_workflow(args["workflow_id"])
elif args["cmd_object"] == "reset":
try:
wfmanager.reset_workflow_component(args["workflow_id"], args["component_name"])
except Exception as e:
utils.display_error_message(str(e))
elif args["cmd_object"] == "delete":
try:
wfmanager.delete_workflow(args["workflow_id"])
except Exception as e:
utils.display_error_message(str(e))
elif args["cmd_object"] == "print":
my_workflow = None
try:
my_workflow = wfmanager.get_workflow(args["workflow_id"])
except Exception as e:
utils.display_error_message(str(e))
if my_workflow is not None:
my_workflow.print_output(args["what"])
elif args["cmd_object"] == "status":
if args["workflow_id"]:
try:
workflow = wfmanager.get_workflow(args["workflow_id"])
except Exception as e:
utils.display_error_message(str(e))
print((Workflow.get_status_under_text_format(workflow, True, args["display_errors"])))
else:
try:
workflows = wfmanager.get_workflows(use_cache=True)
except Exception as e:
utils.display_error_message(str(e))
if len(workflows) > 0:
workflows_by_id, wfids = {}, []
# first sort workflow by ID
for workflow in workflows:
wfids.append(workflow.id)
workflows_by_id[workflow.id] = workflow
status = "ID\tNAME\tSTATUS\tELAPSED_TIME\tSTART_TIME\tEND_TIME\n"
for i, wfid in enumerate(sorted(wfids, reverse=True)):
status += Workflow.get_status_under_text_format(workflows_by_id[wfid])
if i