Skip to content

Any Success All Fail

This example shows how to run a task if “any succeed” or if “all fail” from a fan-out.

from hera.workflows import DAG, Workflow, script


@script()
def foo(a):
    print(a)


@script()
def random_fail(a):
    import random

    random.seed(a)
    if random.random() < 0.5:
        raise Exception("Oh, no!")


@script()
def fail(a):
    raise Exception(a)


with Workflow(generate_name="any-success-all-fail-", entrypoint="d") as w:
    with DAG(name="d"):
        t1 = random_fail(name="t1", with_param=[1, 2, 3])
        t2 = fail(name="t2", with_param=[1, 2, 3])
        t3 = foo(name="t3", with_param=[1, 2, 3])

        t1.when_any_succeeded(t2)
        t2.when_all_failed(t3)
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: any-success-all-fail-
spec:
  entrypoint: d
  templates:
  - name: d
    dag:
      tasks:
      - name: t1
        template: random-fail
        withParam: '[1, 2, 3]'
        arguments:
          parameters:
          - name: a
            value: '{{item}}'
      - name: t2
        depends: t1.AnySucceeded
        template: fail
        withParam: '[1, 2, 3]'
        arguments:
          parameters:
          - name: a
            value: '{{item}}'
      - name: t3
        depends: t2.AllFailed
        template: foo
        withParam: '[1, 2, 3]'
        arguments:
          parameters:
          - name: a
            value: '{{item}}'
  - name: random-fail
    inputs:
      parameters:
      - name: a
    script:
      image: python:3.10
      source: |-
        import os
        import sys
        sys.path.append(os.getcwd())
        import json
        try: a = json.loads(r'''{{inputs.parameters.a}}''')
        except: a = r'''{{inputs.parameters.a}}'''

        import random
        random.seed(a)
        if random.random() < 0.5:
            raise Exception('Oh, no!')
      command:
      - python
  - name: fail
    inputs:
      parameters:
      - name: a
    script:
      image: python:3.10
      source: |-
        import os
        import sys
        sys.path.append(os.getcwd())
        import json
        try: a = json.loads(r'''{{inputs.parameters.a}}''')
        except: a = r'''{{inputs.parameters.a}}'''

        raise Exception(a)
      command:
      - python
  - name: foo
    inputs:
      parameters:
      - name: a
    script:
      image: python:3.10
      source: |-
        import os
        import sys
        sys.path.append(os.getcwd())
        import json
        try: a = json.loads(r'''{{inputs.parameters.a}}''')
        except: a = r'''{{inputs.parameters.a}}'''

        print(a)
      command:
      - python

Comments