首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将workflowTempateRef参数化?

如何将workflowTempateRef参数化?
EN

Stack Overflow用户
提问于 2021-03-29 15:32:25
回答 2查看 1.6K关注 0票数 3

我有一个WorkflowTemplate“纽约测试模板”,我通过Argo事件和PubSub触发它。因此,如果我将消息{}发布到PubSub主题“argo nyc”中,将启动通过workflowTempateRef指定的模板。那确实很管用。现在,我希望参数化待启动模板。

我不工作的草稿看上去如下:

代码语言:javascript
复制
apiVersion: argoproj.io/v1alpha1
kind: EventSource
metadata:
  name: pubsub-event-source-nyc
spec:
  template:
    serviceAccountName: argo-events
  pubSub:
    examplex:
      jsonBody: true
      topic: argo-events-nyc
      subscriptionID: argo-events-nyc-sub

---

apiVersion: argoproj.io/v1alpha1
kind: Sensor
metadata:
  name: pubsub-sensor-nyc
spec:
  template:
    serviceAccountName: argo-events-sa
  dependencies:
    - name: pubsub-event-source-dep
      eventSourceName: pubsub-event-source-nyc
      eventName: examplex
  triggers:
    - template:
        name: argo-workflow-trigger
        argoWorkflow:
          group: argoproj.io
          version: v1alpha1
          resource: workflows
          operation: submit
          source:
            resource:
              apiVersion: argoproj.io/v1alpha1
              kind: Workflow
              metadata:
                generateName: nyc-test-template-
                namespace: argo
              spec:
                arguments:
                  parameters:
                    - name: wft
                      value: nyc-test-template
                workflowTemplateRef:
                  # I'm pretty sure this inputs block is useless. But leaving it out 
                  # and instead referencing arguments.parameters.wft won't work either.
                  inputs:
                    parameters:
                      - name: wft
                  name: "{{inputs.parameters.wft}}"
          parameters:
            - src:
                dependencyName: pubsub-event-source-dep
                dataKey: body.wft
              dest: spec.arguments.parameters.0.value

我想说的是:

  • 空消息{}将触发“纽约测试模板”。
  • 消息{"wft": "my-template"}将触发“我的模板”。

相反,发布空消息将导致传感器抛出错误:

2021-03-29T15:31:16.386441528Z2021/03/29 15:31:16 Failed to parse workflow: error unmarshaling JSON: while decoding JSON: json: unknown field "inputs"

坦率地说,上面的yaml从这个例子那里得到了原始的灵感。这并不是一个经过深思熟虑的猜测的结果,因为我仍然不理解参数、参数和输入是如何相互作用的机制。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-29 18:32:45

学分归王德龙

代码语言:javascript
复制
apiVersion: argoproj.io/v1alpha1
kind: Sensor
metadata:
  name: pubsub-sensor-nyc
spec:
  template:
    serviceAccountName: argo-events-sa
  dependencies:
    - name: pubsub-event-source-dep
      eventSourceName: pubsub-event-source-nyc
      eventName: examplex
  triggers:
    - template:
        name: argo-workflow-trigger
        argoWorkflow:
          group: argoproj.io
          version: v1alpha1
          resource: workflows
          operation: submit
          source:
            resource:
              apiVersion: argoproj.io/v1alpha1
              kind: Workflow
              metadata:
                generateName: nyc-test-template-
                namespace: argo
              spec:
                workflowTemplateRef:
                  name: nyc-test-template
          parameters:
            - src:
                dependencyName: pubsub-event-source-dep
                dataKey: body.wft
                value: nyc-test-template # default value
              dest: spec.workflowTemplateRef.name # <- this
票数 2
EN

Stack Overflow用户

发布于 2021-03-29 17:47:32

可以根据参数使用when切换要使用的模板。

假设我有两个简单的WorkflowTemplates,如下所示:

代码语言:javascript
复制
apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: t1
spec:
  templates:
    - name: whalesay-template
      container:
        image: docker/whalesay
        command: [cowsay]
        args: [t1]

---

apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: t2
spec:
  templates:
    - name: whalesay-template
      container:
        image: docker/whalesay
        command: [cowsay]
        args: [t2]

根据传递给工作流的参数(手动或argo事件设置),我可以选择从WorkflowTemplates执行一个或另一个模板。

代码语言:javascript
复制
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: switch-
spec:
  entrypoint: pick
  arguments:
    parameters:
      - name: which
  templates:
    - name: pick
      steps:
        - - name: t1
            when: "{{workflow.parameters.which}} == t1"
            templateRef:
              name: t1
              template: whalesay-template
          - name: t2
            when: "{{workflow.parameters.which}} == t2"
            templateRef:
              name: t2
              template: whalesay-template

对于工作流的顶级参数,可以使用workflow.parameters.SOMETHING

在上述基础上,您可以使用像jq这样的JSON解析工具来检索切换值,然后根据该值选择模板。

代码语言:javascript
复制
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: switch-
spec:
  entrypoint: pick
  arguments:
    parameters:
      - name: json
  templates:
    - name: pick
      steps:
        - - name: parse
            template: parse
        - - name: t1
            when: "{{steps.parse.outputs.result}} == a"
            templateRef:
              name: t1
              template: whalesay-template
          - name: t2
            when: "{{steps.parse.outputs.result}} == b"
            templateRef:
              name: t2
              template: whalesay-template
    - name: parse
      container:
        image: jorgeandrada/alpine-jq
        command: [sh, -c]
        env:
          - name: JSON
            value: "{{workflow.parameters.json}}"
        args: [echo "$JSON" | jq -j '.test']

我应该提到的是,使用jq有点麻烦。在Argo (3.1+)的未来版本中,将有更直接检查JSON的工具。但是这个解决方案正好相反-兼容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66857071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档