コード例 #1
0
def map(function, input_list):
    """
    map operation of Couler
    """
    # Enforce the function to run and lock to add into step
    if callable(function):
        states._update_steps_lock = False
        # TODO (terrytangyuan): Support functions with multiple arguments.
        para = input_list[0]
        inner = function(para)
        if inner is None:
            raise SyntaxError("require function return value")
        states._update_steps_lock = True
    else:
        raise TypeError("require loop over a function to run")

    inner_dict = output.extract_step_return(inner)
    template_name = inner_dict["name"]
    inner_step = Step(name=inner_dict["id"], template=template_name)

    parameters = []
    items_param_name = "%s-para-name" % template_name
    items_param_dict = {"name": items_param_name}
    function_template = states.workflow.get_template(template_name)
    function_template_dict = function_template.to_dict()

    if "resource" in function_template_dict:
        # Update the template with the new dynamic `metadata.name`.
        manifest_dict = yaml.safe_load(
            function_template_dict["resource"]["manifest"]
        )
        manifest_dict["metadata"]["name"] = (
            "'{{inputs.parameters.%s}}'" % items_param_name
        )
        function_template = states.workflow.get_template(template_name)
        function_template.manifest = pyaml.dump(manifest_dict)
        # Append this items parameter to input parameters in the template
        function_template.args.append(items_param_dict)
        states.workflow.add_template(function_template)
        input_parameters = [items_param_dict]
    else:
        input_parameters = function_template_dict["inputs"]["parameters"]

    for para_name in input_parameters:
        parameters.append(
            {
                "name": para_name["name"],
                "value": '"{{item.%s}}"' % para_name["name"],
            }
        )

    inner_step.arguments = {"parameters": parameters}

    with_items = []
    for para_values in input_list:
        item = {}
        if not isinstance(para_values, list):
            para_values = [para_values]

        for j in range(len(input_parameters)):
            para_name = input_parameters[j]["name"]
            item[para_name] = para_values[j]

        with_items.append(item)

    inner_step.with_items = with_items
    states.workflow.add_step(inner_dict["id"], inner_step)

    return inner_step
コード例 #2
0
ファイル: step_update_utils.py プロジェクト: javoweb/couler
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
コード例 #3
0
ファイル: loop.py プロジェクト: merlintang/couler-2
def map(function, *arguments):
    """
    map operation of Couler
    """

    # Enforce the function to run and lock to add into step
    # Checks the correct syntax
    if callable(function):
        states._update_steps_lock = False

        para = []
        x = 0

        while x < len(arguments):
            para.append(arguments[x][0])
            x += 1

        inner = function(*para)

        if inner is None:
            raise SyntaxError("require function return value")
        states._update_steps_lock = True

    else:
        raise TypeError("require loop over a function to run")

    inner_dict = output.extract_step_return(inner)
    template_name = inner_dict["name"]
    inner_step = Step(name=inner_dict["id"], template=template_name)

    parameters = []
    items_param_name = "%s-para-name" % template_name
    items_param_dict = {"name": items_param_name}
    function_template = states.workflow.get_template(template_name)
    function_template_dict = function_template.to_dict()

    if "resource" in function_template_dict:
        # Update the template with the new dynamic `metadata.name`.
        manifest_dict = yaml.safe_load(
            function_template_dict["resource"]["manifest"])
        manifest_dict["metadata"]["name"] = ("'{{inputs.parameters.%s}}'" %
                                             items_param_name)
        function_template = states.workflow.get_template(template_name)
        function_template.manifest = pyaml.dump(manifest_dict)
        # Append this items parameter to input parameters in the template
        function_template.args.append(items_param_dict)
        states.workflow.add_template(function_template)
        input_parameters = [items_param_dict]
    else:
        input_parameters = function_template_dict["inputs"]["parameters"]

    for para_name in input_parameters:
        parameters.append({
            "name": para_name["name"],
            "value": '"{{item.%s}}"' % para_name["name"],
        })

    inner_step.arguments = {"parameters": parameters}

    # the following part of the code
    # Adds values to parameters (with items) while it goes
    # through the *arguments-variable with two loops.
    # inner loop:
    # arguments[ind_of_func_param][0], arguments[ind_of_func_param][0]...
    # Outer loop:
    # arguments[0][ind_of_func_call], arguments[0][ind_of_func_call]...
    # With two lists in *arguments
    # result would be:
    #  1. pair of items for the function:
    # arguments[0][0], arguments[1][0]
    # 2. pair of items for the function:
    #  arguments[0][1], arguments[1][1]
    # and so on...
    with_items = []
    ind_of_func_call = 0
    # the number of calls to be made to function
    while ind_of_func_call < len(arguments[0]):
        ind_of_func_param = 0
        item = {}
        # the number of parameters function takes.
        while ind_of_func_param < len(arguments):

            # checks if arguments[ind_of_func_param] is a list if not makes it
            if not isinstance(arguments[ind_of_func_param], list):
                arguments[ind_of_func_param] = [arguments[ind_of_func_param]]

            # items are created for the with items part in .yaml
            para_name = input_parameters[ind_of_func_param]["name"]
            item[para_name] = arguments[ind_of_func_param][ind_of_func_call]

            ind_of_func_param += 1
        with_items.append(item)
        ind_of_func_call += 1

    # all the created items are added to the step and
    # then the step is added to  .yaml
    inner_step.with_items = with_items
    states.workflow.add_step(inner_dict["id"], inner_step)

    return inner_step