无法通过另一个工作流模板将输出参数从一个工作流模板传递到工作流 [英] Unable to pass output parameters from one workflowTemplate to a workflow via another workflowTemplate

查看:31
本文介绍了无法通过另一个工作流模板将输出参数从一个工作流模板传递到工作流的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个工作流模板generate-outputlib-read-outputs和一个工作流output-paramter,如下

  1. generate-output.yaml
apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: generate-output
spec:
  entrypoint: main
  templates:
    - name: main
      dag:
        tasks:

          # Generate Json for Outputs
          - name: read-outputs
            arguments:
              parameters:
                - name: outdata
                  value: |
                    {
                      "version": 4,
                      "terraform_version": "0.14.11",
                      "serial": 0,
                      "lineage": "732322df-5bd43-6e92-8f46-56c0dddwe83cb4",
                      "outputs": {
                        "key_alias_arn": {
                          "value": "arn:aws:kms:us-west-2:123456789:alias/tetsing-key",
                          "type": "string",
                          "sensitive": true
                        },
                        "key_arn": {
                          "value": "arn:aws:kms:us-west-2:123456789:alias/tetsing-key",
                          "type": "string",
                          "sensitive": true
                        }
                      }
                    }
            template: retrieve-outputs

    # Create Json
    - name: retrieve-outputs
      inputs:
        parameters:
          - name: outdata
      script:
        image: python
        command: [python]
        env:
          - name: OUTDATA
            value: "{{inputs.parameters.outdata}}"
        source: |
          import json
          import os
          OUTDATA = json.loads(os.environ["OUTDATA"])
          with open('/tmp/templates_lst.json', 'w') as outfile:
            outfile.write(str(json.dumps(OUTDATA['outputs'])))
        volumeMounts:
          - name: out
            mountPath: /tmp
      volumes:
        - name: out
          emptyDir: { }
      outputs:
        parameters:
          - name: message
            valueFrom:
              path: /tmp/templates_lst.json

  1. lib-read-outputs.yaml
apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: lib-read-outputs
spec:
  entrypoint: main
  templates:
    - name: main
      dag:
        tasks:
          # Read Outputs
          - name: lib-wft
            templateRef:
              name: generate-output
              template: main
  1. output-paramter.yaml
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: output-paramter-
spec:
  entrypoint: main
  templates:
    - name: main
      dag:
        tasks:
          # Json Output data task1
          - name: wf
            templateRef:
              name: lib-read-outputs
              template: main

          - name: lib-wf2
            dependencies: [wf]
            arguments:
              parameters:
                - name: outputResult
                  value: "{{tasks.wf.outputs.parameters.message}}"
            template: whalesay

    - name: whalesay
      inputs:
        parameters:
          - name: outputResult
      container:
        image: docker/whalesay:latest
        command: [cowsay]
        args: ["{{inputs.parameters.outputResult}}"]

我正在尝试通过lib-read-outputs将在工作流模板generate-output中生成的输出参数传递给工作流output-paramter

当我执行它们时,它给出以下错误-Failed: invalid spec: templates.main.tasks.lib-wf2 failed to resolve {{tasks.wf.outputs.parameters.message}}

推荐答案

默认情况下,DAG和STEP模板不生成输出

DAG和STEP模板不会自动生成子模板的输出,即使只有一个子模板也是如此。

例如,此处的no-parameters模板不生成输出,即使它调用的模板具有输出。

apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
spec:
  templates:
  - name: no-parameters
    dag:
      tasks:
      - name: get-a-parameter
        template: get-a-parameter

如果您考虑具有多个任务的DAG模板,则这种输出缺失是有意义的:

apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
spec:
  templates:
  - name: no-parameters
    dag:
      tasks:
      - name: get-a-parameter
        template: get-a-parameter
      - name: get-another-parameter
        depends: get-a-parameter
        template: get-another-parameter
no-parameters应生成哪些任务的输出?由于不清楚,默认情况下,DAG和STEP模板不会生成输出。

您可以将模板视为类似于函数。您不希望函数隐式返回它所调用的函数的输出。

def get_a_string():
    return "Hello, world!"

def call_get_a_string():
    get_a_string()

print(call_get_a_string())  # This prints nothing.

但DAG或STEP模板可以转发输出

您可以通过设置DAG或步骤模板Forwardoutputs字段使其成为输出。

apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: get-parameters-wftmpl
spec:
  templates:
  - name: get-parameters
    dag:
      tasks:
      - name: get-a-parameter
        template: get-a-parameter
      - name: get-another-parameter
        depends: get-a-parameter
        template: get-another-parameter
    # This is the critical part!
    outputs:
      parameters:
      - name: parameter-1
        valueFrom: 
          expression: "tasks['get-a-parameter'].outputs.parameters['parameter-name']"
      - name: parameter-2
        valueFrom: 
          expression: "tasks['get-another-parameter'].outputs.parameters['parameter-name']"
---
apiVersion: argoproj.io/v1alpha1
kind: Workflow
spec:
  templates:
  - name: print-parameter
    dag:
      tasks:
      - name: get-parameters
        templateRef:
          name: get-parameters-wftmpl
          template: get-parameters 
      - name: print-parameter
        depends: get-parameters
        template: print-parameter
        arguments:
          parameters:
          - name: parameter
            value: "{{tasks.get-parameters.outputs.parameters.parameter-1}}"

继续进行Python类比:

def get_a_string():
    return "Hello, world!"

def call_get_a_string():
    return get_a_string()  # Add 'return'.

print(call_get_a_string())  # This prints "Hello, world!".

因此,在您的特定案例中...

  1. outputs节添加到generate-parameter工作流模板中的main模板,以转发retrieve-parameters模板的输出参数。

    apiVersion: argoproj.io/v1alpha1
    kind: WorkflowTemplate
    metadata:
      name: generate-parameter
    spec:
      entrypoint: main
      templates:
        - name: main
          outputs:
            parameters:
              - name: message
                valueFrom: 
                  expression: "tasks['read-parameters'].outputs.parameters.message"
          dag:
            tasks:
              # ... the rest of the file ...
    
    
  2. outputs节添加到lib-read-parameters工作流模板中的main模板以转发generate-parameter的参数。

    apiVersion: argoproj.io/v1alpha1
    kind: WorkflowTemplate
    metadata:
      name: lib-read-parameters
    spec:
      entrypoint: main
      templates:
        - name: main
          outputs:
            parameters:
              - name: message
                valueFrom:
                  expression: "tasks['lib-wft'].outputs.parameters.message"
          dag:
            tasks:
              # ... the rest of the file ...
    

这篇关于无法通过另一个工作流模板将输出参数从一个工作流模板传递到工作流的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆