From dffa1b3106fcfcfb8c64adef2b425d185df3e4f0 Mon Sep 17 00:00:00 2001 From: "Christian.Kaps" Date: Thu, 22 Apr 2021 18:03:59 +0200 Subject: [PATCH] Add documentation for the Zeebe bindings --- .../supported-bindings/_index.md | 8 +- .../supported-bindings/zeebe-command.md | 583 ++++++++++++++++++ .../supported-bindings/zeebe-jobworker.md | 101 +++ 3 files changed, 691 insertions(+), 1 deletion(-) create mode 100644 daprdocs/content/en/reference/components-reference/supported-bindings/zeebe-command.md create mode 100644 daprdocs/content/en/reference/components-reference/supported-bindings/zeebe-jobworker.md diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/_index.md b/daprdocs/content/en/reference/components-reference/supported-bindings/_index.md index 0a69a3732..d06546551 100644 --- a/daprdocs/content/en/reference/components-reference/supported-bindings/_index.md +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/_index.md @@ -43,7 +43,6 @@ Table captions: | [Twitter]({{< ref twitter.md >}}) | ✅ | ✅ | Alpha | v1 | 1.0 | | [SendGrid]({{< ref sendgrid.md >}}) | | ✅ | Alpha | v1 | 1.0 | - ### Alibaba Cloud | Name | Input
Binding | Output
Binding | Status | @@ -78,3 +77,10 @@ Table captions: | [Azure Service Bus Queues]({{< ref servicebusqueues.md >}}) | ✅ | ✅ | Alpha | v1 | 1.0 | | [Azure SignalR]({{< ref signalr.md >}}) | | ✅ | Alpha | v1 | 1.0 | | [Azure Storage Queues]({{< ref storagequeues.md >}}) | ✅ | ✅ | GA | v1 | 1.0 | + +### Zeebe (Camunda) + +| Name | Input
Binding | Output
Binding | Status | Component version | Since | +|------|:----------------:|:-----------------:|--------| --------- | ---------- | +| [Zeebe Command]({{< ref zeebe-command.md >}}) | | ✅ | Alpha | v1 | 1.2 | +| [Zeebe Job Worker]({{< ref zeebe-jobworker.md >}}) | ✅ | | Alpha | v1 | 1.2 | \ No newline at end of file diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/zeebe-command.md b/daprdocs/content/en/reference/components-reference/supported-bindings/zeebe-command.md new file mode 100644 index 000000000..e4836645d --- /dev/null +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/zeebe-command.md @@ -0,0 +1,583 @@ +--- +type: docs +title: "Zeebe command binding spec" +linkTitle: "Zeebe command" +description: "Detailed documentation on the Zeebe command binding component" +aliases: +- "/operations/components/setup-bindings/supported-bindings/zeebe-commands/" +--- + +## Component format + +To setup Zeebe command binding create a component of type `bindings.zeebe.command`. See [this guide]({{< ref "howto-bindings.md#1-create-a-binding" >}}) on how to create and apply a binding configuration. + +See [this](https://docs.camunda.io/docs/product-manuals/zeebe/zeebe-overview/) for Zeebe documentation. + +```yaml +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: + namespace: +spec: + type: bindings.zeebe.command + version: v1 + metadata: + - name: gatewayAddr + value: : + - name: gatewayKeepAlive + value: 45s + - name: usePlainTextConnection + value: true + - name: caCertificatePath + value: /path/to/ca-cert +``` + +## Spec metadata fields + +| Field | Required | Binding support | Details | Example | +|-------------------------|:--------:|------------|-----|---------| +| gatewayAddr | Y | Output | Zeebe gateway address | `localhost:26500` | +| gatewayKeepAlive | N | Output | Sets how often keep alive messages should be sent to the gateway. Defaults to 45 seconds | `45s` | +| usePlainTextConnection | N | Output | Whether to use a plain text connection or not | `true,false` | +| caCertificatePath | N | Output | The path to the CA cert | `/path/to/ca-cert` | + +## Binding support + +This component supports **output binding** with the following operations: + +- `topology` +- `deploy-workflow` +- `create-instance` +- `cancel-instance` +- `set-variables` +- `resolve-incident` +- `publish-message` +- `activate-jobs` +- `complete-job` +- `fail-job` +- `update-job-retries` +- `throw-error` + +### Output binding + +Zeebe uses gRPC under the hood for the Zeebe client we use in this binding. Please consult the gRPC API reference for more information: +https://stage.docs.zeebe.io/reference/grpc.html + +#### topology + +The `topology` operation obtains the current topology of the cluster the gateway is part of. + +To perform a `topology` operation, invoke the Zeebe command binding with a `POST` method and the following JSON body: + +```json +{ + "data": {}, + "operation": "topology" +} +``` + +##### Response + +The binding returns a JSON with the following response: + +```json +{ + "brokers": [ + { + "nodeId": null, + "host": "172.18.0.5", + "port": 26501, + "partitions": [ + { + "partitionId": 1, + "role": null, + "health": null + } + ], + "version": "0.26.0" + } + ], + "clusterSize": 1, + "partitionsCount": 1, + "replicationFactor": 1, + "gatewayVersion": "0.26.0" +} +``` + +The response values are: + +- `brokers` - list of brokers part of this cluster + - `nodeId` - unique (within a cluster) node ID for the broker + - `host` - hostname of the broker + - `port` - port for the broker + - `port` - port for the broker + - `partitions` - list of partitions managed or replicated on this broker + - `partitionId` - the unique ID of this partition + - `role` - the role of the broker for this partition + - `health` - the health of this partition + - `version` - broker version +- `clusterSize` - how many nodes are in the cluster +- `partitionsCount` - how many partitions are spread across the cluster +- `replicationFactor` - configured replication factor for this cluster +- `gatewayVersion` - gateway version + +#### deploy-workflow + +The `deploy-workflow` operation deploys a single workflow to Zeebe. + +To perform a `deploy-workflow` operation, invoke the Zeebe command binding with a `POST` method and the following JSON body: + +```json +{ + "data": "YOUR_FILE_CONTENT", + "metadata": { + "fileName": "products-process.bpmn", + "fileType": "bpmn" + }, + "operation": "deploy-workflow" +} +``` + +The metadata parameters are: + +- `fileName` - the name of the workflow file +- `fileType` - (optional) the type of the file 'bpmn' or 'file'. If no type was given, the default will be recognized based on the file extension + 'bpmn' for file extension .bpmn, for all other files it will be set to 'file' + +##### Response + +The binding returns a JSON with the following response: + +```json +{ + "key": 2251799813687320, + "workflows": [ + { + "bpmnProcessId": "products-process", + "version": 3, + "workflowKey": 2251799813685895, + "resourceName": "products-process.bpmn" + } + ] +} +``` + +The response values are: + +- `key` - the unique key identifying the deployment +- `workflows` - a list of deployed workflows + - `bpmnProcessId` - the bpmn process ID, as parsed during deployment; together with the version forms a unique identifier for a specific + workflow definition + - `version` - the assigned process version + - `workflowKey` - the assigned key, which acts as a unique identifier for this workflow + - `resourceName` - the resource name from which this workflow was parsed + +#### create-instance + +The `create-instance` operation creates and starts an instance of the specified workflow. The workflow definition to use to create the instance can be +specified either using its unique key (as returned by the `deploy-workflow` operation), or using the BPMN process ID and a version. + +Note that only workflows with none start events can be started through this command. + +##### By BPMN process ID + +To perform a `create-instance` operation, invoke the Zeebe command binding with a `POST` method and the following JSON body: + +```json +{ + "data": { + "bpmnProcessId": "products-process", + "variables": { + "productId": "some-product-id", + "productName": "some-product-name", + "productKey": "some-product-key" + } + }, + "operation": "create-instance" +} +``` + +The data parameters are: + +- `bpmnProcessId` - the BPMN process ID of the workflow definition to instantiate +- `version` - (optional, default: latest version) the version of the process to instantiate +- `variables` - (optional) JSON document that will instantiate the variables for the root variable scope of the + workflow instance; it must be a JSON object, as variables will be mapped in a + key-value fashion. e.g. { "a": 1, "b": 2 } will create two variables, named "a" and + "b" respectively, with their associated values. [{ "a": 1, "b": 2 }] would not be a + valid argument, as the root of the JSON document is an array and not an object + +##### By workflow key + +To perform a `create-instance` operation, invoke the Zeebe command binding with a `POST` method and the following JSON body: + +```json +{ + "data": { + "workflowKey": 2251799813685895, + "variables": { + "productId": "some-product-id", + "productName": "some-product-name", + "productKey": "some-product-key" + } + }, + "operation": "create-instance" +} +``` + +The data parameters are: + +- `workflowKey` - the unique key identifying the workflow definition to instantiate +- `variables` - (optional) JSON document that will instantiate the variables for the root variable scope of the + workflow instance; it must be a JSON object, as variables will be mapped in a + key-value fashion. e.g. { "a": 1, "b": 2 } will create two variables, named "a" and + "b" respectively, with their associated values. [{ "a": 1, "b": 2 }] would not be a + valid argument, as the root of the JSON document is an array and not an object + + +##### Response + +The binding returns a JSON with the following response: + +```json +{ + "workflowKey": 2251799813685895, + "bpmnProcessId": "products-process", + "version": 3, + "workflowInstanceKey": 2251799813687851 +} +``` + +The response values are: + +- `workflowKey` - the key of the workflow definition which was used to create the workflow instance +- `bpmnProcessId` - the BPMN process ID of the workflow definition which was used to create the workflow instance +- `version` - the version of the workflow definition which was used to create the workflow instance +- `workflowInstanceKey` - the unique identifier of the created workflow instance + +#### cancel-instance + +The `cancel-instance` operation cancels a running workflow instance. + +To perform a `cancel-instance` operation, invoke the Zeebe command binding with a `POST` method and the following JSON body: + +```json +{ + "data": { + "workflowInstanceKey": 2251799813687851 + }, + "metadata": {}, + "operation": "cancel-instance" +} +``` + +The data parameters are: + +- `workflowInstanceKey` - the workflow instance key + +##### Response + +The binding does not return a response body. + +#### set-variables + +The `set-variables` operation creates or updates variables for an element instance (e.g. workflow instance, flow element instance). + +To perform a `set-variables` operation, invoke the Zeebe command binding with a `POST` method and the following JSON body: + +```json +{ + "data": { + "elementInstanceKey": 2251799813687880, + "variables": { + "productId": "some-product-id", + "productName": "some-product-name", + "productKey": "some-product-key" + } + }, + "metadata": {}, + "operation": "set-variables" +} +``` + +The data parameters are: + +- `elementInstanceKey` - the unique identifier of a particular element; can be the workflow instance key (as + obtained during instance creation), or a given element, such as a service task (see elementInstanceKey on the job message) +- `local` - (optional, default: `false`) if true, the variables will be merged strictly into the local scope (as indicated by + elementInstanceKey); this means the variables is not propagated to upper scopes. + for example, let's say we have two scopes, '1' and '2', with each having effective variables as: + 1 => `{ "foo" : 2 }`, and 2 => `{ "bar" : 1 }`. if we send an update request with + elementInstanceKey = 2, variables `{ "foo" : 5 }`, and local is true, then scope 1 will + be unchanged, and scope 2 will now be `{ "bar" : 1, "foo" 5 }`. if local was false, however, + then scope 1 would be `{ "foo": 5 }`, and scope 2 would be `{ "bar" : 1 }` +- `variables` - a JSON serialized document describing variables as key value pairs; the root of the document must be an object + +##### Response + +The binding returns a JSON with the following response: + +```json +{ + "key": 2251799813687896 +} +``` + +The response values are: + +- `key` - the unique key of the set variables command + +#### resolve-incident + +The `resolve-incident` operation resolves an incident. + +To perform a `resolve-incident` operation, invoke the Zeebe command binding with a `POST` method and the following JSON body: + +```json +{ + "data": { + "incidentKey": 2251799813686123 + }, + "metadata": {}, + "operation": "resolve-incident" +} +``` + +The data parameters are: + +- `incidentKey` - the unique ID of the incident to resolve + +##### Response + +The binding does not return a response body. + +#### publish-message + +The `publish-message` operation publishes a single message. Messages are published to specific partitions computed from their correlation keys. + +To perform a `publish-message` operation, invoke the Zeebe command binding with a `POST` method and the following JSON body: + +```json +{ + "messageName": "", + "correlationKey": "2", + "timeToLive": "1m", + "variables": { + "productId": "some-product-id", + "productName": "some-product-name", + "productKey": "some-product-key" + } +} +``` + +The data parameters are: + +- `messageName` - the name of the message +- `correlationKey` - (optional) the correlation key of the message +- `timeToLive` - (optional) how long the message should be buffered on the broker +- `messageId` - (optional) the unique ID of the message; can be omitted. only useful to ensure only one message with the given ID will ever + be published (during its lifetime) +- `variables` - (optional) the message variables as a JSON document; to be valid, the root of the document must be an object, e.g. { "a": "foo" }. + [ "foo" ] would not be valid + +##### Response + +The binding returns a JSON with the following response: + +```json +{ + "key": 2251799813688225 +} +``` + +The response values are: + +- `key` - the unique ID of the message that was published + +#### activate-jobs + +The `activate-jobs` operation iterates through all known partitions round-robin and activates up to the requested maximum and streams them back to +the client as they are activated. + +To perform a `activate-jobs` operation, invoke the Zeebe command binding with a `POST` method and the following JSON body: + +```json +{ + "data": { + "jobType": "fetch-products", + "maxJobsToActivate": 5, + "timeout": "5m", + "workerName": "products-worker", + "fetchVariables": [ + "productId", + "productName", + "productKey" + ] + }, + "metadata": {}, + "operation": "activate-jobs" +} +``` + +The data parameters are: + +- `jobType` - the job type, as defined in the BPMN process (e.g. ``) +- `maxJobsToActivate` - the maximum jobs to activate by this request +- `timeout` - (optional, default: 5 minutes) a job returned after this call will not be activated by another call until the timeout has been reached +- `workerName` - (optional, default: `default`) the name of the worker activating the jobs, mostly used for logging purposes +- `fetchVariables` - (optional) a list of variables to fetch as the job variables; if empty, all visible variables at the time of activation for the + scope of the job will be returned + +##### Response + +The binding returns a JSON with the following response: + +```json +[ + { + + } +] +``` + +The response values are: + +- `key` - the key, a unique identifier for the job +- `type` - the type of the job (should match what was requested) +- `workflowInstanceKey` - the job's workflow instance key +- `bpmnProcessId` - the bpmn process ID of the job workflow definition +- `workflowDefinitionVersion` - the version of the job workflow definition +- `workflowKey` - the key of the job workflow definition +- `elementId` - the associated task element ID +- `elementInstanceKey` - the unique key identifying the associated task, unique within the scope of the workflow instance +- `customHeaders` - a set of custom headers defined during modelling; returned as a serialized JSON document +- `worker` - the name of the worker which activated this job +- `retries` - the amount of retries left to this job (should always be positive) +- `deadline` - when the job can be activated again, sent as a UNIX epoch timestamp +- `variables` - JSON document, computed at activation time, consisting of all visible variables to the task scope + +#### complete-job + +The `complete-job` operation completes a job with the given payload, which allows completing the associated service task. + +To perform a `complete-job` operation, invoke the Zeebe command binding with a `POST` method and the following JSON body: + +```json +{ + "data": { + "jobKey": 2251799813686172, + "variables": { + "productId": "some-product-id", + "productName": "some-product-name", + "productKey": "some-product-key" + } + }, + "metadata": {}, + "operation": "complete-job" +} +``` + +The data parameters are: + +- `jobKey` - the unique job identifier, as obtained from the activate jobs response +- `variables` - (optional) a JSON document representing the variables in the current task scope + +##### Response + +The binding does not return a response body. + +#### fail-job + +The `fail-job` operation marks the job as failed; if the retries argument is positive, then the job will be immediately activatable again, and a +worker could try again to process it. If it is zero or negative however, an incident will be raised, tagged with the given errorMessage, and the +job will not be activatable until the incident is resolved. + +To perform a `fail-job` operation, invoke the Zeebe command binding with a `POST` method and the following JSON body: + +```json +{ + "data": { + "jobKey": 2251799813685739, + "retries": 5, + "errorMessage": "some error occured" + }, + "metadata": {}, + "operation": "fail-job" +} +``` + +The data parameters are: + +- `jobKey` - the unique job identifier, as obtained when activating the job +- `retries` - the amount of retries the job should have left +- `errorMessage ` - (optional) an message describing why the job failed this is particularly useful if a job runs out of retries and an + incident is raised, as it this message can help explain why an incident was raised + +##### Response + +The binding does not return a response body. + +#### update-job-retries + +The `update-job-retries` operation updates the number of retries a job has left. This is mostly useful for jobs that have run out of retries, should the +underlying problem be solved. + +To perform a `update-job-retries` operation, invoke the Zeebe command binding with a `POST` method and the following JSON body: + +```json +{ + "data": { + "jobKey": 2251799813686172, + "retries": 10 + }, + "metadata": {}, + "operation": "update-job-retries" +} +``` + +The data parameters are: + +- `jobKey` - the unique job identifier, as obtained through the activate-jobs operation +- `retries` - the new amount of retries for the job; must be positive + +##### Response + +The binding does not return a response body. + +#### throw-error + +The `throw-error` operation throw an error to indicate that a business error is occurred while processing the job. The error is identified +by an error code and is handled by an error catch event in the workflow with the same error code. + +To perform a `throw-error` operation, invoke the Zeebe command binding with a `POST` method and the following JSON body: + +```json +{ + "data": { + "jobKey": 2251799813686172, + "errorCode": "product-fetch-error", + "errorMessage": "The product could not be fetched" + }, + "metadata": {}, + "operation": "throw-error" +} +``` + +The data parameters are: + +- `jobKey` - the unique job identifier, as obtained when activating the job +- `errorCode` - the error code that will be matched with an error catch event +- `errorMessage` - (optional) an error message that provides additional context + +##### Response + +The binding does not return a response body. + +## Related links + +- [Basic schema for a Dapr component]({{< ref component-schema >}}) +- [Bindings building block]({{< ref bindings >}}) +- [How-To: Trigger application with input binding]({{< ref howto-triggers.md >}}) +- [How-To: Use bindings to interface with external resources]({{< ref howto-bindings.md >}}) +- [Bindings API reference]({{< ref bindings_api.md >}}) \ No newline at end of file diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/zeebe-jobworker.md b/daprdocs/content/en/reference/components-reference/supported-bindings/zeebe-jobworker.md new file mode 100644 index 000000000..2b696faff --- /dev/null +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/zeebe-jobworker.md @@ -0,0 +1,101 @@ +--- +type: docs +title: "Zeebe JobWorker binding spec" +linkTitle: "Zeebe JobWorker" +description: "Detailed documentation on the Zeebe JobWorker binding component" +aliases: +- "/operations/components/setup-bindings/supported-bindings/zeebe-jobworker/" +--- + +## Component format + +To setup Zeebe JobWorker binding create a component of type `bindings.zeebe.jobworker`. See [this guide]({{< ref "howto-bindings.md#1-create-a-binding" >}}) on how to create and apply a binding configuration. + +See [this](https://docs.camunda.io/docs/product-manuals/concepts/job-workers) for Zeebe JobWorker documentation. + +```yaml +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: + namespace: +spec: + type: bindings.zeebe.jobworker + version: v1 + metadata: + - name: gatewayAddr + value: : + - name: gatewayKeepAlive + value: 45s + - name: usePlainTextConnection + value: true + - name: caCertificatePath + value: /path/to/ca-cert + - name: workerName + value: products-worker + - name: workerTimeout + value: 5m + - name: requestTimeout + value: 15s + - name: jobType + value: fetch-products + - name: maxJobsActive + value: 32 + - name: concurrency + value: 4 + - name: pollInterval + value: 100ms + - name: pollThreshold + value: 0.3 + - name: fetchVariables + value: productId, productName, productKey +``` + +## Spec metadata fields + +| Field | Required | Binding support | Details | Example | +|-------------------------|:--------:|------------|-----|---------| +| gatewayAddr | Y | Input | Zeebe gateway address | `localhost:26500` | +| gatewayKeepAlive | N | Input | Sets how often keep alive messages should be sent to the gateway. Defaults to 45 seconds | `45s` | +| usePlainTextConnection | N | Input | Whether to use a plain text connection or not | `true,false` | +| caCertificatePath | N | Input | The path to the CA cert | `/path/to/ca-cert` | +| workerName | N | Input | The name of the worker activating the jobs, mostly used for logging purposes | `products-worker` | +| workerTimeout | N | Input | A job returned after this call will not be activated by another call until the timeout has been reached; defaults to 5 minutes | `5m` | +| requestTimeout | N | Input | The request will be completed when at least one job is activated or after the requestTimeout. If the requestTimeout = 0, a default timeout is used. If the requestTimeout < 0, long polling is disabled and the request is completed immediately, even when no job is activated. Defaults to 10 seconds | `30s` | +| jobType | Y | Input | the job type, as defined in the BPMN process (e.g. ``) | `fetch-products` | +| maxJobsActive | N | Input | Set the maximum number of jobs which will be activated for this worker at the same time. Defaults to 32 | `32` | +| concurrency | N | Input | The maximum number of concurrent spawned goroutines to complete jobs. Defaults to 4 | `4` | +| pollInterval | N | Input | Set the maximal interval between polling for new jobs. Defaults to 100 milliseconds | `100ms` | +| pollThreshold | N | Input | Set the threshold of buffered activated jobs before polling for new jobs, i.e. threshold * maxJobsActive. Defaults to 0.3 | `0.3` | +| fetchVariables | N | Input | A list of variables to fetch as the job variables; if empty, all visible variables at the time of activation for the scope of the job will be returned | `productId, productName, productKey` | + +## Binding support + +This component supports **input** binding interfaces. + +### Input binding + +The Zeebe workflow engine handles the workflow state as also workflow variables which can be passed +on workflow instantiation or which can be updated or created during workflow execution. These variables +can be passed to a registered job worker by defining the variable names as comma-separated list in +the `fetchVariables` metadata field. The workflow engine will then pass these variables with its current +values to the job worker implementation. + +If the binding will register three variables `productId`, `productName` and `productKey` then the service will +be called with the following JSON: + +```json +{ + "productId": "some-product-id", + "productName": "some-product-name", + "productKey": "some-product-key" +} +``` + +## Related links + +- [Basic schema for a Dapr component]({{< ref component-schema >}}) +- [Bindings building block]({{< ref bindings >}}) +- [How-To: Trigger application with input binding]({{< ref howto-triggers.md >}}) +- [How-To: Use bindings to interface with external resources]({{< ref howto-bindings.md >}}) +- [Bindings API reference]({{< ref bindings_api.md >}}) \ No newline at end of file