Пример #1
0
def _update_dag_tasks(
    function_name,
    caller_line,
    dependencies,
    args=None,
    template_name=None,
    step_name=None,
):
    """
    A task in DAG of Argo YAML contains name, related template and parameters.
    Here we insert a single task into the global tasks.
    """
    if step_name is None:
        function_id = utils.invocation_name(function_name, caller_line)
    else:
        function_id = step_name

    task_template = states.workflow.get_dag_task(function_id)
    if task_template is None:
        task_template = OrderedDict({"name": function_id})

        if dependencies is not None and isinstance(dependencies, list):
            if "dependencies" in task_template:
                task_template["dependencies"].extend(dependencies)
            else:
                task_template["dependencies"] = dependencies

        if template_name is None:
            task_template["template"] = function_name
        else:
            task_template["template"] = template_name

        # configure the args
        if args is not None:
            parameters, artifacts = _get_params_and_artifacts_from_args(
                args, function_name, prefix="tasks")

            if len(parameters) > 0:
                task_template["arguments"] = OrderedDict()
                task_template["arguments"]["parameters"] = parameters

            if len(artifacts) > 0:
                if "arguments" not in task_template:
                    task_template["arguments"] = OrderedDict()

                task_template["arguments"]["artifacts"] = artifacts

    else:
        # step exist on the dag, thus, we update its dependency
        if dependencies is not None:
            if "dependencies" in task_template:
                task_template["dependencies"].append(dependencies)
            else:
                task_template["dependencies"] = [dependencies]

    states.workflow.update_dag_task(function_id, task_template)

    # return the current task name
    return function_id
Пример #2
0
def exec_while(condition, inner_while):
    """
    Generate the Argo recursive logic. For example
    https://github.com/argoproj/argo/blob/master/examples/README.md#recursion.
    """
    # _while_lock means 'exec_while' operation begins to work
    # _while_steps stores logic steps inside the recursion logic
    states._while_lock = True

    # Enforce inner function of the while-loop to run
    if callable(inner_while):
        branch = inner_while()
        if branch is None:
            raise SyntaxError("require function return value")
    else:
        raise TypeError("condition to run would be a function")

    branch_dict = output.extract_step_return(branch)
    recursive_name = "exec-while-" + branch_dict["name"]
    recursive_id = "exec-while-" + branch_dict["id"]
    if states.workflow.get_template(recursive_name) is None:
        template = Steps(name=recursive_name)
    else:
        raise SyntaxError("Recursive function can not be called twice ")

    # Generate leaving point for recursive
    step_out_name = "%s-%s" % (recursive_name, "exit")
    pre = condition["pre"]
    pre_dict = output.extract_step_return(pre)
    condition_suffix = condition["condition"]

    # Generate the recursive go to step
    when_prefix = "{{steps.%s.%s}} %s %s" % (
        branch_dict["id"],
        branch_dict["output"],
        condition_suffix,
        pre_dict["value"],
    )
    step_out_template = OrderedDict({
        "name": step_out_name,
        "template": recursive_name,
        "when": when_prefix,
    })
    step_out_id = utils.invocation_name(step_out_name, recursive_id)
    states._while_steps[step_out_id] = [step_out_template]

    # Add steps inside the recursive logic to recursive template
    template.steps = list(states._while_steps.values())

    # Add this recursive logic to the templates
    states.workflow.add_template(template)

    # Add recursive logic to global _steps
    recursive_out_step = Step(name=recursive_id, template=recursive_name)
    states.workflow.add_step(name=recursive_id, step=recursive_out_step)

    states._while_lock = False
    states._while_steps = OrderedDict()
Пример #3
0
def _update_dag_tasks(
    function_name,
    caller_line,
    dependencies,
    depends_logic,
    args=None,
    template_name=None,
    step_name=None,
):
    """
    A task in DAG of Argo YAML contains name, related template and parameters.
    Here we insert a single task into the global tasks.
    """
    if step_name is None:
        function_id = utils.invocation_name(function_name, caller_line)
    else:
        function_id = step_name

    task_template = states.workflow.get_dag_task(function_id)
    if task_template is None:
        task_template = OrderedDict({"name": function_id})

        if dependencies is not None and isinstance(dependencies, list):
            if "dependencies" in task_template:
                task_template["dependencies"].extend(dependencies)
            else:
                task_template["dependencies"] = dependencies

        if depends_logic is not None:
            task_template["depends"] = depends_logic

        if template_name is None:
            task_template["template"] = function_name
        else:
            task_template["template"] = template_name

        # configure the args
        if args is not None:
            parameters, artifacts = _get_params_and_artifacts_from_args(
                args, function_name, prefix="tasks")

            if len(parameters) > 0:
                task_template["arguments"] = OrderedDict()
                task_template["arguments"]["parameters"] = parameters

            if len(artifacts) > 0:
                if "arguments" not in task_template:
                    task_template["arguments"] = OrderedDict()

                task_template["arguments"]["artifacts"] = artifacts

    else:
        # step exist on the dag, thus, we update its dependency
        if dependencies is not None:
            if "dependencies" in task_template:
                task_template["dependencies"].extend(dependencies)
            else:
                task_template["dependencies"] = [dependencies]
        if depends_logic is not None:
            task_template["depends"] = depends_logic

    t_name = function_name if template_name is None else template_name
    step = Step(name=function_id, template=t_name)
    if states._exit_handler_enable:
        if states._when_prefix is not None:
            step.when = states._when_prefix
        if function_id in states.workflow.exit_handler_step:
            states.workflow.exit_handler_step.get(function_id).append(
                step.to_dict())
        else:
            states.workflow.exit_handler_step[function_id] = [step.to_dict()]
    elif states._when_prefix is not None:
        step.when = states._when_prefix
        if step.name not in states.workflow.dag_tasks.keys():
            step_spec = step.to_dict()
            step_spec["dependencies"] = [states._when_task]
            states.workflow.dag_tasks[step.name] = step_spec
    else:
        states.workflow.update_dag_task(function_id, task_template)

    # return the current task name
    return function_id
Пример #4
0
def _update_steps(function_name, caller_line, args=None, template_name=None):
    """
    A step in Argo YAML contains name, related template and parameters.
    Here we insert a single step into the global steps.
    """
    function_id = utils.invocation_name(function_name, caller_line)

    # Update `steps` only if needed
    if states._update_steps_lock:
        name = function_id
        if states._run_concurrent_lock:
            _id = utils.invocation_name(template_name, caller_line)
            name = "%s-%s" % (_id, states._concurrent_func_id)
            if states._sub_steps is not None:
                states._concurrent_func_id = states._concurrent_func_id + 1

        t_name = function_name if template_name is None else template_name
        step = Step(name=name, template=t_name)

        if states._when_prefix is not None:
            step.when = states._when_prefix

        if args is not None:
            parameters, artifacts = _get_params_and_artifacts_from_args(
                args,
                template_name
                if states._run_concurrent_lock else function_name,
                prefix="steps",
            )

            if len(parameters) > 0:
                step.arguments = OrderedDict()
                step.arguments["parameters"] = parameters

            if len(artifacts) > 0:
                if step.arguments is None:
                    step.arguments = OrderedDict()
                step.arguments["artifacts"] = artifacts

        if states._condition_id is not None:
            function_id = states._condition_id

        if states._while_lock:
            if function_id in states._while_steps:
                states._while_steps.get(function_id).append(step.to_dict())
            else:
                states._while_steps[function_id] = [step.to_dict()]
        else:
            if states._sub_steps is not None:
                if function_id in states._sub_steps:
                    states._sub_steps.get(function_id).append(step.to_dict())
                else:
                    states._sub_steps[function_id] = [step.to_dict()]
            elif states._exit_handler_enable is True:
                if function_id in states.workflow.exit_handler_step:
                    states.workflow.exit_handler_step.get(function_id).append(
                        step.to_dict())
                else:
                    states.workflow.exit_handler_step[function_id] = [
                        step.to_dict()
                    ]
            else:
                states.workflow.add_step(function_id, step)

        return step.name
    else:
        return function_id