"""CLI functions to run decider, worker and exec processes.""" from argparse import ArgumentParser from datetime import date import sys import time import boto.swf.layer2 as swf from garcon import activity from garcon import decider from flows import config from flows.flow import MrSnowflake def start(flow, context): """Start a flow. Args: flow (object): garcon flow context (str): the context to pass to the flow. Returns: WorkflowExecution: executing the workflow returns information about the execution. """ workflow_id = flow.workflow_id() return swf.WorkflowType( name=flow.name, domain=flow.domain, version=config.SWF_VERSION, task_list=flow.name).start( workflow_id=workflow_id, execution_start_to_close_timeout=str(flow.timeout), input=context) def run_decider(flow, **kwargs): """Launch the SWF decider process. Args: flow (object): garcon flow kwargs: extensible call api """ worker = decider.DeciderWorker(flow) while True: worker.run() time.sleep(1) def run_activity_worker(flow, **kwargs): """Launch the activity worker process. Args: flow (object): garcon flow kwargs: extensible call api """ worker = activity.ActivityWorker(flow) worker.run() _COMMANDS = { 'exec': start, 'decider': run_decider, 'worker': run_activity_worker } parser = ArgumentParser( description='MR-Snowflake flow command line.', epilog='© {year} The Orchard'.format(year=str(date.today().year))) parser.add_argument( 'cmd', help='garcon command (exec, decider, worker)', choices=list(_COMMANDS.keys())) parser.add_argument( '-c', '--context', dest='context', help='initial context [json]', default='{}') if __name__ == '__main__': args = parser.parse_args() if len(sys.argv) <= 1: parser.print_help() exit() flow = MrSnowflake() _COMMANDS[args.cmd](flow, context=args.context)