条件判断

本节将介绍如何在 KubeVela 中为工作流步骤添加条件判断。

在 KubeVela 工作流中,每个步骤都可以指定一个 if,你可以使用 if 来确定是否应该执行该步骤。

不指定 If

在步骤没有指定 If 的情况下,KubeVela 会根据先前步骤的状态来判断是否应该执行该步骤。默认步骤的执行条件是:在该步骤前的所有步骤状态均为成功。

这也意味着,如果步骤 A 执行失败,那么步骤 A 之后的步骤 B 会被跳过,不会被执行。

部署如下例子:

  1. apiVersion: core.oam.dev/v1beta1
  2. kind: Application
  3. metadata:
  4. name: err-with-no-if
  5. namespace: default
  6. spec:
  7. components:
  8. - name: express-server
  9. type: webservice
  10. properties:
  11. image: oamdev/hello-world
  12. ports:
  13. - port: 8000
  14. workflow:
  15. steps:
  16. - name: apply-err
  17. type: apply-object
  18. properties:
  19. value:
  20. test: err
  21. - name: apply-comp
  22. type: apply-component
  23. properties:
  24. component: express-server

使用 vela status 命令查看应用状态:

  1. $ vela status err-with-no-if
  2. About:
  3. Name: err-with-no-if
  4. Namespace: default
  5. Created at: 2022-06-24 18:14:46 +0800 CST
  6. Status: workflowTerminated
  7. Workflow:
  8. mode: StepByStep
  9. finished: true
  10. Suspend: false
  11. Terminated: true
  12. Steps
  13. - id:bztlmifsjl
  14. name:apply-err
  15. type:apply-object
  16. phase:failed
  17. message:step apply: run step(provider=kube,do=apply): Object 'Kind' is missing in '{"test":"err"}'
  18. - id:el8quwh8jh
  19. name:apply-comp
  20. type:apply-component
  21. phase:skipped
  22. message:
  23. Services:

可以看到,步骤 apply-err 会因为尝试部署一个非法的资源而导致失败,同时,因为之前的步骤失败了,步骤 apply-comp 将被跳过。

If Always

如果你希望一个步骤无论如何都应该被执行,那么,你可以为这个步骤指定 ifalways

部署如下例子:

  1. apiVersion: core.oam.dev/v1beta1
  2. kind: Application
  3. metadata:
  4. name: err-with-always
  5. namespace: default
  6. spec:
  7. components:
  8. - name: invalid
  9. type: webservice
  10. properties:
  11. image: invalid
  12. ports:
  13. - port: 8000
  14. workflow:
  15. steps:
  16. - name: comp
  17. type: apply-component
  18. timeout: 5s
  19. outputs:
  20. - name: status
  21. valueFrom: output.status.conditions[0].type + output.status.conditions[0].status
  22. properties:
  23. component: invalid
  24. - name: notification
  25. type: notification
  26. inputs:
  27. - from: status
  28. parameterKey: slack.message.text
  29. if: always
  30. properties:
  31. slack:
  32. url:
  33. value: <your slack url>

使用 vela status 命令查看应用状态:

  1. $ vela status err-with-always
  2. About:
  3. Name: err-with-always
  4. Namespace: default
  5. Created at: 2022-06-27 17:30:29 +0800 CST
  6. Status: workflowTerminated
  7. Workflow:
  8. mode: StepByStep
  9. finished: true
  10. Suspend: false
  11. Terminated: true
  12. Steps
  13. - id:loeqr6dlcn
  14. name:comp
  15. type:apply-component
  16. phase:failed
  17. message:
  18. - id:hul9tayu82
  19. name:notification
  20. type:notification
  21. phase:succeeded
  22. message:
  23. Services:
  24. - Name: invalid
  25. Cluster: local Namespace: default
  26. Type: webservice
  27. Unhealthy Ready:0/1
  28. No trait applied

可以看到,步骤 comp 会去尝试部署一个镜像为 invalid 的组件,而组件因为拉取不到镜像,所以会在五秒后因为超时而失败,同时,这个步骤将组件的 status 作为 outputs 传出。而步骤 notification 因为指定了 if: always,所以一定会被执行,同时,消息通知的内容为上一个步骤中组件的状态,因此,我们可以在 slack 中看到携带状态信息的消息通知。

自定义 If 条件判断

注意:你需要升级到 1.5 及以上版本来使用自定义 If 条件判断。

你也可以编写自己的判断逻辑来确定是否应该执行该步骤。注意: if 里的值将作为 CUE 代码执行。KubeVela 在 if 中提供了一些内置变量,它们是:

  • status:status 中包含了所有工作流步骤的状态信息。你可以使用 status.<step-name>.phase == "succeeded" 来判断步骤的状态,也可以使用简化方式status.<step-name>.succeeded 来进行判断。
  • inputs:inputs 中包含了该步骤的所有 inputs 参数。你可以使用 inputs.<input-name> == "value" 来获取判断步骤的输入。

注意,如果你的步骤名或者 inputs 名并不是一个有效的 CUE 变量名(如:包含 -,或者以数字开头等),你可以用如下方式引用:status["invalid-name"].failed

部署如下例子:

  1. apiVersion: core.oam.dev/v1beta1
  2. kind: Application
  3. metadata:
  4. name: custom-if
  5. namespace: default
  6. spec:
  7. components:
  8. - name: comp-custom-if
  9. type: webservice
  10. properties:
  11. image: crccheck/hello-world
  12. port: 8000
  13. traits:
  14. workflow:
  15. steps:
  16. - name: apply
  17. type: apply-component
  18. properties:
  19. component: comp-custom-if
  20. outputs:
  21. - name: comp-output
  22. valueFrom: context.name
  23. - name: notification
  24. type: notification
  25. inputs:
  26. - from: comp-output
  27. parameterKey: slack.message.text
  28. if: inputs["comp-output"] == "custom-if"
  29. properties:
  30. slack:
  31. url:
  32. value: <your slack url>
  33. - name: notification-skip
  34. type: notification
  35. if: status.notification.failed
  36. properties:
  37. slack:
  38. url:
  39. value: <your slack url>
  40. message:
  41. text: this notification should be skipped
  42. - name: notification-succeeded
  43. type: notification
  44. if: status.notification.succeeded
  45. properties:
  46. slack:
  47. url:
  48. value: <your slack url>
  49. message:
  50. text: the notification is succeeded

使用 vela status 命令查看应用状态:

  1. $ vela status custom-if
  2. About:
  3. Name: custom-if
  4. Namespace: default
  5. Created at: 2022-06-25 00:37:14 +0800 CST
  6. Status: running
  7. Workflow:
  8. mode: StepByStep
  9. finished: true
  10. Suspend: false
  11. Terminated: false
  12. Steps
  13. - id:un1zd8qc6h
  14. name:apply
  15. type:apply-component
  16. phase:succeeded
  17. message:
  18. - id:n5xbtgsi68
  19. name:notification
  20. type:notification
  21. phase:succeeded
  22. message:
  23. - id:2ufd3v6n78
  24. name:notification-skip
  25. type:notification
  26. phase:skipped
  27. message:
  28. - id:h644x6o8mb
  29. name:notification-succeeded
  30. type:notification
  31. phase:succeeded
  32. message:
  33. Services:
  34. - Name: comp-custom-if
  35. Cluster: local Namespace: default
  36. Type: webservice
  37. Healthy Ready:1/1
  38. No trait applied

可以看到,第一个步骤 apply 成功后,会输出一个 outputs。第二个步骤 notification 中引用第一个步骤的 outputs 作为 inputs 并且进行判断,满足条件后成功发送通知。第三个步骤 notification-skip 判断第二个步骤是否为失败状态,条件不满足,这个步骤跳过。第四个步骤 notification-succeeded 判断第二个步骤是否成功,条件满足,该步骤成功执行。