Merge "Create docs for the workflow namespaces feature"
This commit is contained in:
commit
ee94087c89
@ -34,6 +34,13 @@ User guide
|
||||
install/index
|
||||
configuration/index
|
||||
|
||||
**Mistral features**
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
user/wf_namespaces
|
||||
|
||||
**API**
|
||||
|
||||
.. toctree::
|
||||
|
@ -333,3 +333,13 @@ or ``evaluation_interval`` options.
|
||||
|
||||
Defines the maximum number of finished executions.
|
||||
It must be greater or equal to ``1``.
|
||||
|
||||
|
||||
Workflow namespaces
|
||||
-------------------
|
||||
|
||||
Mistral allows creating workflows within a namespace. So it is possible to
|
||||
create many workflows with the same name as long as they are in different
|
||||
namespaces.
|
||||
|
||||
See more at :doc:`Workflow namespaces <user/wf_namespaces>`
|
||||
|
195
doc/source/user/wf_namespaces.rst
Normal file
195
doc/source/user/wf_namespaces.rst
Normal file
@ -0,0 +1,195 @@
|
||||
Workflow namespaces
|
||||
===================
|
||||
|
||||
General
|
||||
-------
|
||||
Mistral allows creating workflows within a namespace. So it is possible to
|
||||
create many workflows with the same name as long as they are in different
|
||||
namespaces. This is useful when a user already has many workflows that are
|
||||
connected to each other (some are sub workflows of others) and one of the
|
||||
workflow names is already in use and the user does not want to edit that
|
||||
workflow and all the ones referencing it or combine them into a workbook.
|
||||
This is possible because the namespace is not a part of the Mistral workflow
|
||||
language.
|
||||
|
||||
If one wants to use a namespace she needs to provide an additional parameter
|
||||
to a corresponding operation run via REST API or CLI. If it's not provided,
|
||||
Mistral will be operating within the default namespace.
|
||||
|
||||
|
||||
REST API parameters
|
||||
-------------------
|
||||
|
||||
In order to use namespaces Mistral a number of REST API methods have the
|
||||
optional **namespace** parameter:
|
||||
|
||||
* create workflow definition within a namespace::
|
||||
|
||||
POST /v2/workflows?namespace=<namespace>
|
||||
|
||||
<Workflow YAML text>
|
||||
|
||||
* delete workflow definition within a namespace::
|
||||
|
||||
DELETE /v2/workflows/<workflow id>?namespace=<namespace>
|
||||
|
||||
* get a workflow definition within a namespace::
|
||||
|
||||
GET /v2/workflows/<workflow id>?namespace=<namespace>
|
||||
|
||||
* get all workflow definitions within a given namespace::
|
||||
|
||||
GET /v2/workflows?namespace=<namespace>
|
||||
|
||||
* update a workflow definition within a given namespace::
|
||||
|
||||
PUT /v2/workflows?namespace=<namespace>
|
||||
|
||||
<Workflow YAML text>
|
||||
|
||||
* create an execution of a workflow that belongs to a non-default namespace::
|
||||
|
||||
POST /v2/executions
|
||||
|
||||
{
|
||||
"workflow_name": "<workflow id or name>",
|
||||
"workflow_namespace": "<namespace>",
|
||||
...
|
||||
}
|
||||
|
||||
Resolving a workflow definition
|
||||
-------------------------------
|
||||
|
||||
It's important to understand how Mistral resolves a workflow definition taking
|
||||
namespaces into account when running workflows and how namespaces work in case
|
||||
of workflow hierarchies.
|
||||
|
||||
The rules are the following:
|
||||
|
||||
* If a user launches a workflow via API (or CLI) then the workflow name
|
||||
and the corresponding namespace are provided explicitly so Mistral
|
||||
will look for a workflow definition with the given name under the provided
|
||||
namespace. If a namespace is not specified then the default namespace
|
||||
(empty namespace value) will be used. If Mistral doesn't find a workflow
|
||||
definition with the given name and namespace it will return an error
|
||||
response.
|
||||
* If a workflow is launched as a sub workflow, i.e. it has a parent task
|
||||
in a different workflow, then Mistral uses the namespace of the parent
|
||||
workflow to resolve a workflow definition. In other words, Mistral
|
||||
propagates namespace to its child workflows. However, **if a workflow
|
||||
definition does not exist in the namespace of the parent workflow then
|
||||
Mistral will try to find it in the default namespace.** This is different
|
||||
from the previous case when a workflow is launched via API, Mistral would
|
||||
return an error instead of trying to find a workflow definition in the
|
||||
default namespace.
|
||||
* Workflows declared as part of workbooks are always located in the default
|
||||
namespace.
|
||||
|
||||
To illustrate how this all works let's look at the following workflow
|
||||
definitions:
|
||||
|
||||
.. code-block:: mistral
|
||||
|
||||
---
|
||||
version: '2.0'
|
||||
|
||||
wf1:
|
||||
tasks:
|
||||
t1:
|
||||
workflow: wf2
|
||||
|
||||
|
||||
.. code-block:: mistral
|
||||
|
||||
---
|
||||
version: '2.0'
|
||||
|
||||
wf2:
|
||||
tasks:
|
||||
t2:
|
||||
workflow: wf3
|
||||
|
||||
.. code-block:: mistral
|
||||
|
||||
---
|
||||
version: '2.0'
|
||||
|
||||
wf3:
|
||||
tasks:
|
||||
t3:
|
||||
action: std.noop
|
||||
|
||||
.. code-block:: mistral
|
||||
|
||||
---
|
||||
version: '2.0'
|
||||
|
||||
wf3:
|
||||
tasks:
|
||||
should_not_run:
|
||||
action: std.fail
|
||||
|
||||
So the call chain looks like this:
|
||||
|
||||
.. code-block::
|
||||
|
||||
wf1 -> wf2 -> wf3
|
||||
|
||||
However, notice that we have two workflows with the name "wf3".
|
||||
|
||||
Let's assume that these workflow definitions are uploaded to Mistral under
|
||||
these namespaces:
|
||||
|
||||
+----+---------------------+-----------+
|
||||
| ID | name | namespace |
|
||||
+----+---------------------+-----------+
|
||||
| 1 | wf1 | abc |
|
||||
+----+---------------------+-----------+
|
||||
| 2 | wf2 | |
|
||||
+----+---------------------+-----------+
|
||||
| 3 | wf3 | abc |
|
||||
+----+---------------------+-----------+
|
||||
| 4 | wf3 | |
|
||||
+----+---------------------+-----------+
|
||||
|
||||
And we create a workflow execution like this via API:
|
||||
|
||||
.. code-block::
|
||||
|
||||
POST /v2/executions
|
||||
|
||||
{
|
||||
"workflow_name": "wf1",
|
||||
"workflow_namespace": "abc"
|
||||
}
|
||||
|
||||
|
||||
In this case, Mistral will:
|
||||
|
||||
* Find "wf1" in the namespace "abc" (it doesn't exist in the default
|
||||
namespace anyway)
|
||||
* Try to find "wf2" in the namespace "abc" and since it doesn't exist
|
||||
there Mistral will find it in the default namespace
|
||||
* Find "wf3" in the namespace "abc" because it is propagated from "wf1"
|
||||
|
||||
|
||||
However, if we launch a workflow like this:
|
||||
|
||||
.. code-block::
|
||||
|
||||
POST /v2/executions
|
||||
|
||||
{
|
||||
"workflow_name": "wf2"
|
||||
}
|
||||
|
||||
|
||||
We'll get the call chain
|
||||
|
||||
.. code-block::
|
||||
|
||||
wf2 -> wf3
|
||||
|
||||
|
||||
And both workflow definitions will be taken from the default namespace
|
||||
because a non-default namespace wasn't provided to the endpoint.
|
Loading…
x
Reference in New Issue
Block a user