Search code examples
yamlargo-workflowsargo-events

Argo Events: passing variables from workflow through event payload to triggered workflow


I'm looking to setup argo-events to trigger a data-logging workflow when a "regular" workflow is submitted. Following the resource event source docs, I can do this, but I cannot find how to encode and extract variables as is done using the webhook parameterization.

So I want to submit the following workflow:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: test-logger-workflow-
  labels:
    class: dummy-in
    submitaction: log-this
    wfuser: m-wf
    wfteam: a-wf
spec:
  entrypoint: whalesay
  templates:
  - name: whalesay
    container:
      image: docker/whalesay:latest
      command: [cowsay]
      args: ["hello world - manual submit - was log created?"]

and then access these labels in the trigger:

apiVersion: argoproj.io/v1alpha1
kind: Sensor
metadata:
  name: resource-logger
spec:
  template:
    serviceAccountName: operate-workflow-sa
  dependencies:
    - name: test-dep-sensor
      eventSourceName: resource-wf-submit
      eventName: log-this
  triggers:
    - template:
        name: argo-workflow
        k8s:
          operation: create
          source:
            resource:
              apiVersion: argoproj.io/v1alpha1
              kind: Workflow
              metadata:
                generateName: resource-workflow-
                labels:
                  class: dummy-out
              spec:
                entrypoint: mylogger
                arguments:
                  parameters:
                    - name: user
                      value: default-name
                    - name: group
                      value: default-group
                    - name: description
                      value: triggered by argo submission
                templates:
                  - name: logger
                    inputs:
                      parameters:
                        - name: user
                        - name: group
                        - name: description
                    container:
                      image: logger:latest
                      imagePullPolicy: Always
                      command: [/app/logger.py]
                      args: ["-w", "argo-events", "-u", "{{inputs.parameters.user}}", "-t", "{{inputs.parameters.group}}", "-d", "{{inputs.parameters.description}}"]
          parameters:
            - src:
                dependencyName: test-dep-user
                ?? 
              dest: spec.arguments.parameters.0.value
            - src:
                dependencyName: test-dep-group
                ??
              dest: spec.arguments.parameters.1.value
            - src:
                dependencyName: test-dep-description
                ??
              dest: spec.arguments.parameters.2.value

What do I need to put in in place of "??" to get the wfuser and wfteam values from the workflow? Is there a generic way to access any of the workflow structure, e.g. populate the description with the image value (docker/whalesay:latest)?


Solution

  • The error I had is that spec.dependencies.name (test-dep-sensor) and spec.triggers.template.k8s.parameters.src.dependencyName need to match, otherwise the latter isn't included/processed:

    apiVersion: argoproj.io/v1alpha1
    kind: Sensor
    metadata:
      name: resource-logger
    spec:
      template:
        serviceAccountName: operate-workflow-sa
      dependencies:
        - name: test-dep-sensor
          eventSourceName: resource-wf-submit
          eventName: log-this
      triggers:
        - template:
            name: argo-workflow
            k8s:
              operation: create
              source:
                resource:
                  apiVersion: argoproj.io/v1alpha1
                  kind: Workflow
                  metadata:
                    generateName: resource-workflow-
                    labels:
                      class: dummy-out
                  spec:
                    entrypoint: mylogger
                    arguments:
                      parameters:
                        - name: description
                          value: triggered by argo submission
                        - name: user
                          value: default-name
                        - name: group
                          value: default-group
                    templates:
                      - name: logger
                        inputs:
                          parameters:
                            - name: description
                            - name: user
                            - name: group
                        container:
                          image: logger:latest
                          imagePullPolicy: Always
                          command: [/app/logger.py]
                          args: ["-w", "argo-events", "-u", "{{inputs.parameters.user}}", "-t", "{{inputs.parameters.group}}", "-d", "{{inputs.parameters.description}}"]
              parameters:
                - src:
                    dependencyName: test-dep-sensor
                    dataKey: body
                  dest: spec.arguments.parameters.0.value