127 lines
3.2 KiB
Markdown
127 lines
3.2 KiB
Markdown
---
|
|
title: Data Flow
|
|
---
|
|
|
|
## What's Data Flow
|
|
|
|
In KubeVela, data flow enables users to pass data from one workflow step to another.
|
|
You can orchestrate the data flow by specifying declarative config -- inputs and outputs of each step.
|
|
This doc will explain how to specify data inputs and outputs.
|
|
|
|
> Full example available at: https://github.com/oam-dev/kubevela/blob/master/docs/examples/workflow
|
|
|
|
## Outputs
|
|
|
|
An output exports the data corresponding to a key in the CUE template of a workflow step.
|
|
Once the workflow step has finished running, the output will have the data from the key.
|
|
|
|
Here is an example to specify the output in Application:
|
|
|
|
```yaml
|
|
apiVersion: core.oam.dev/v1beta1
|
|
kind: Application
|
|
spec:
|
|
...
|
|
workflow:
|
|
steps:
|
|
- name: deploy-server1
|
|
type: apply-component
|
|
properties:
|
|
component: "server1"
|
|
outputs:
|
|
- name: server1IP
|
|
# Any key can be exported from the CUE template of the Definition
|
|
exportKey: "myIP"
|
|
```
|
|
|
|
Here is an example CUE template that contains the export key:
|
|
|
|
```yaml
|
|
apiVersion: core.oam.dev/v1beta1
|
|
kind: WorkflowStepDefinition
|
|
metadata:
|
|
name: apply-component
|
|
spec:
|
|
schematic:
|
|
cue:
|
|
template: |
|
|
import ("vela/op")
|
|
parameter: {
|
|
component: string
|
|
}
|
|
// load component from application
|
|
component: op.#Load & {
|
|
component: parameter.component
|
|
}
|
|
// apply workload to Kubernetes cluster
|
|
apply: op.#ApplyComponent & {
|
|
component: parameter.component
|
|
}
|
|
// export podIP
|
|
myIP: apply.workload.status.podIP
|
|
```
|
|
|
|
The output can then be used by the input in the following.
|
|
|
|
## Inputs
|
|
|
|
An input takes the data of an output to fill a parameter in the CUE template of a workflow step.
|
|
The parameter will be filled before running the workflow step.
|
|
|
|
Here is an example to specify the input in Application:
|
|
|
|
```yaml
|
|
kind: Application
|
|
spec:
|
|
...
|
|
workflow:
|
|
steps:
|
|
...
|
|
- name: deploy-server2
|
|
type: apply-with-ip
|
|
inputs:
|
|
- from: server1IP
|
|
parameterKey: serverIP
|
|
properties:
|
|
component: "server2"
|
|
```
|
|
|
|
Here is an example CUE template that takes the input parameter:
|
|
|
|
```yaml
|
|
apiVersion: core.oam.dev/v1beta1
|
|
kind: WorkflowStepDefinition
|
|
metadata:
|
|
name: apply-with-ip
|
|
spec:
|
|
schematic:
|
|
cue:
|
|
template: |
|
|
import ("vela/op")
|
|
parameter: {
|
|
component: string
|
|
// the input value will be used to fill this parameter
|
|
serverIP?: string
|
|
}
|
|
// load component from application
|
|
component: op.#Load & {
|
|
component: parameter.component
|
|
value: {}
|
|
}
|
|
// apply workload to Kubernetes cluster
|
|
apply: op.#Apply & {
|
|
value: {
|
|
component.value.workload
|
|
metadata: name: parameter.component
|
|
if parameter.serverIP!=_|_{
|
|
// this data will override the env fields of the workload container
|
|
spec: containers: [{env: [{name: "PrefixIP",value: parameter.serverIP}]}]
|
|
}
|
|
}
|
|
}
|
|
// wait until workload.status equal "Running"
|
|
wait: op.#ConditionalWait & {
|
|
continue: apply.value.status.phase =="Running"
|
|
}
|
|
```
|