blob: f76fdea96f33089f93aab58b4978b66957e80f8d [file] [log] [blame]
JakobKriegf2d67d62020-08-17 22:36:44 +02001.. This work is a derivative of https://wiki.onap.org/display/DW/Modeling+Concepts#Concepts-100023263
2.. This work is licensed under a Creative Commons Attribution 4.0
3.. International License. http://creativecommons.org/licenses/by/4.0
JakobKrieg7c3f3952020-08-04 20:46:50 +02004.. Copyright (C) 2020 Deutsche Telekom AG.
5
6.. _workflow:
7
8Workflow
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -04009--------
JakobKrieg7c3f3952020-08-04 20:46:50 +020010
11.. note::
12
13 **Workflow Scope within CDS Framework**
14
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -040015 The workflow is within the scope of the micro provisioning and configuration
16 management in **controller domain** and does NOT account for the MACRO service orchestration workflow which is covered by the SO Project.
JakobKrieg7c3f3952020-08-04 20:46:50 +020017
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -040018A workflow defines an overall action to be taken on the service, hence is an
JakobKrieg7c3f3952020-08-04 20:46:50 +020019entry-point for the run-time execution of the :ref:`CBA Package <cba>`.
20
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -040021A workflow also defines **inputs** and **outputs** that will defined the **payload contract**
Singal, Kapil (ks220y)cef859c2020-10-07 13:00:24 -040022of the **request** and **response** (see :ref:`dynamic_payload`)
JakobKrieg7c3f3952020-08-04 20:46:50 +020023
24A workflow can be **composed** of one or multiple **sub-actions** to execute.
25
26A CBA package can have as **many workflows** as needed.
27
28.. _workflow_single_action:
29
30Single action
31**************
32
33The workflow is directly backed by a component (see :ref:`node_type` -> Component).
34
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -040035In the example bellow, the target of the workflow's steps resource-assignment is ``resource-assignment``
JakobKrieg7c3f3952020-08-04 20:46:50 +020036which actually is the name of the ``node_template`` defined after, of type ``component-resource-resolution``.
37
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -040038`Link to example
JakobKrieg7c3f3952020-08-04 20:46:50 +020039<https://github.com/onap/ccsdk-cds/blob/master/components/model-catalog/blueprint-model/test-blueprint/golden/Definitions/golden-blueprint.json#L40-L71>`_
40
41
42.. code-block:: json
43 :caption: **Example**
44
45 . . .
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -040046 "topology_template": {
47 "workflows": {
48 "resource-assignment": {
49 "steps": {
50 "resource-assignment": {
51 "description": "Resource Assign Workflow",
52 "target": "resource-assignment"
53 }
JakobKrieg7c3f3952020-08-04 20:46:50 +020054 }
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -040055 },
56 "inputs": {
JakobKrieg7c3f3952020-08-04 20:46:50 +020057 "resource-assignment-properties": {
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -040058 "description": "Dynamic PropertyDefinition for workflow(resource-assignment).",
59 "required": true,
60 "type": "dt-resource-assignment-properties"
JakobKrieg7c3f3952020-08-04 20:46:50 +020061 }
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -040062 },
63 "outputs": {
JakobKrieg7c3f3952020-08-04 20:46:50 +020064 "meshed-template": {
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -040065 "type": "json",
66 "value": {
67 "get_attribute": [
JakobKrieg7c3f3952020-08-04 20:46:50 +020068 "resource-assignment",
69 "assignment-params"
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -040070 ]
71 }
JakobKrieg7c3f3952020-08-04 20:46:50 +020072 }
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -040073 }
74 },
75 "node_templates": {
76 "resource-assignment": {
77 "type": "component-resource-resolution",
78 "interfaces": {
79 "ResourceResolutionComponent": {
80 "operations": {
81 "process": {
82 "inputs": {
83 "artifact-prefix-names": [
84 "vf-module-1"
85 ]
86 }
JakobKrieg7c3f3952020-08-04 20:46:50 +020087 }
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -040088 }
89 }
JakobKrieg7c3f3952020-08-04 20:46:50 +020090 },
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -040091 "artifacts": {
92 "vf-module-1-template": {
93 "type": "artifact-template-velocity",
94 "file": "Templates/vf-module-1-template.vtl"
95 },
96 "vf-module-1-mapping": {
97 "type": "artifact-mapping-resource",
98 "file": "Templates/vf-module-1-mapping.json"
99 }
JakobKrieg7c3f3952020-08-04 20:46:50 +0200100 }
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400101 }
102 }
JakobKrieg7c3f3952020-08-04 20:46:50 +0200103 }
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400104 . . .
JakobKrieg7c3f3952020-08-04 20:46:50 +0200105
106.. _workflow_multiple_actions:
107
108Multiple sub-actions
109**********************
110
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400111The workflow is backed by a Directed Graph engine, dg-generic (see :ref:`node_type` -> DG,
JakobKrieg7c3f3952020-08-04 20:46:50 +0200112and is an **imperative** workflow.
113
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400114A DG used as workflow for CDS is composed of multiple execute nodes; each individual
JakobKrieg7c3f3952020-08-04 20:46:50 +0200115execute node refers to an modelled Component (see :ref:`node_type` -> Component) instance.
116
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400117In the example above, you can see the target of the workflow's steps execute-script is
JakobKrieg7c3f3952020-08-04 20:46:50 +0200118``execute-remote-ansible-process``, which is a node_template of type ``dg_generic``
119
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400120`Link of example
121<https://github.com/onap/ccsdk-cds/blob/master/components/model-catalog/blueprint-model/test-blueprint/remote_scripts/Definitions/remote_scripts.json#L184-L204>`_
JakobKrieg7c3f3952020-08-04 20:46:50 +0200122
123.. code-block:: json
124 :caption: **workflow plan example**
125
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400126 . . .
127 "topology_template": {
JakobKrieg7c3f3952020-08-04 20:46:50 +0200128 "workflows": {
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400129 "execute-remote-ansible": {
130 "steps": {
JakobKrieg7c3f3952020-08-04 20:46:50 +0200131 "execute-script": {
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400132 "description": "Execute Remote Ansible Script",
133 "target": "execute-remote-ansible-process"
JakobKrieg7c3f3952020-08-04 20:46:50 +0200134 }
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400135 }
136 },
137 "inputs": {
138 "ip": {
139 "required": false,
140 "type": "string"
141 },
142 "username": {
143 "required": false,
144 "type": "string"
145 },
146 "password": {
147 "required": false,
148 "type": "string"
149 },
150 "execute-remote-ansible-properties": {
151 "description": "Dynamic PropertyDefinition for workflow(execute-remote-ansible).",
152 "required": true,
153 "type": "dt-execute-remote-ansible-properties"
154 }
155 },
156 "outputs": {
157 "ansible-variable-resolution": {
158 "type": "json",
159 "value": {
160 "get_attribute": [
161 "resolve-ansible-vars",
162 "assignment-params"
163 ]
JakobKrieg7c3f3952020-08-04 20:46:50 +0200164 }
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400165 },
166 "prepare-environment-logs": {
167 "type": "string",
168 "value": {
169 "get_attribute": [
170 "execute-remote-ansible",
171 "prepare-environment-logs"
172 ]
JakobKrieg7c3f3952020-08-04 20:46:50 +0200173 }
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400174 },
175 "execute-command-logs": {
176 "type": "string",
177 "value": {
178 "get_attribute": [
179 "execute-remote-ansible",
180 "execute-command-logs"
181 ]
JakobKrieg7c3f3952020-08-04 20:46:50 +0200182 }
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400183 }
184 },
185 "node_templates": {
186 "execute-remote-ansible-process": {
187 "type": "dg-generic",
188 "properties": {
189 "content": {
190 "get_artifact": [
191 "SELF",
192 "dg-execute-remote-ansible-process"
193 ]
194 },
195 "dependency-node-templates": [
196 "resolve-ansible-vars",
197 "execute-remote-ansible"
198 ]
199 },
200 "artifacts": {
201 "dg-execute-remote-ansible-process": {
202 "type": "artifact-directed-graph",
203 "file": "Plans/CONFIG_ExecAnsiblePlaybook.xml"
204 }
205 }
206 }
207 }
208 }
209 }
JakobKrieg7c3f3952020-08-04 20:46:50 +0200210
211Properties of a workflow
212**************************
213
214.. list-table::
215 :widths: 25 75
216 :header-rows: 1
217
218 * - Property
219 - Description
220 * - workflow-name
221 - Defines the name of the action that can be triggered by external system
222 * - inputs
223 - | They are two types of inputs, the dynamic ones, and the static one.
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400224 |
JakobKrieg7c3f3952020-08-04 20:46:50 +0200225
226 .. tabs::
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400227
JakobKrieg7c3f3952020-08-04 20:46:50 +0200228 .. tab:: static
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400229
JakobKrieg7c3f3952020-08-04 20:46:50 +0200230 Specified at workflow level
231
232 * can be inputs for the Component(s), see the inputs section of the component of interest.
233 * represent inputs to derived custom logic within scripting
234
235 These will end up under ``${actionName}-request`` section of the payload (see Dynamic API)
236
237 .. tab:: dynamic
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400238
239 Represent the resources defined as input (see :ref:`node_type` -> Source -> Input)
JakobKrieg7c3f3952020-08-04 20:46:50 +0200240 within mapping definition files (see :ref:`artifact_type` -> Mapping).
241
242 The **enrichment process** will (see :ref:`enrichment`)
243
244 * dynamically gather all of them under a data-type, named ``dt-${actionName}-properties``
245 * will add it as a input of the workflow, as follow using this name: ``${actionName}-properties``
246
247 Example for workflow named `resource-assignment`:
248
249 .. code-block:: json
250 :caption: **dynamic input**
251
252 "resource-assignment-properties": {
253 "required": true,
254 "type": "dt-resource-assignment-properties"
255 }
256 * - outputs
257 - | Defines the outputs of the execution; there can be as many output as needed.
258 | Depending on the Component (see :ref:`node_type` -> Component) of use, some attribute might be retrievable.
259
260 .. list-table::
261 :widths: 50 50
262 :header-rows: 1
263
264 * - type
265 - value
266 * - data type (complex / primitive)
267 - value resolvable using :ref:`expression` -> get_attribute
268 * - steps
269 - | Defines the actual step to execute as part of the workflow
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400270 |
JakobKrieg7c3f3952020-08-04 20:46:50 +0200271 .. list-table::
272 :widths: 25 25 50
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400273 :header-rows: 1
274
JakobKrieg7c3f3952020-08-04 20:46:50 +0200275 * - step-name
276 - description
277 - target
278 * - name of the step
279 - step description
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400280 - | a node_template implementing on of the supported Node Type (see :ref:`node_type` -> DG),
JakobKrieg7c3f3952020-08-04 20:46:50 +0200281 either a Component or a DG
282 | (see :ref:`workflow_single_action` or :ref:`workflow_multiple_actions`)
283
284Example:
285
286.. code-block:: json
287 :caption: **workflow example**
288
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400289 {
290 "workflow": {
291 "resource-assignment": { <- workflow-name
JakobKrieg7c3f3952020-08-04 20:46:50 +0200292 "inputs": {
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400293 "vnf-id": { <- static inputs
294 "required": true,
295 "type": "string"
296 },
297 "resource-assignment-properties": { <- dynamic inputs
298 "required": true,
299 "type": "dt-resource-assignment-properties"
300 }
JakobKrieg7c3f3952020-08-04 20:46:50 +0200301 },
302 "steps": {
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400303 "call-resource-assignment": { <- step-name
304 "description": "Resource Assignment Workflow",
305 "target": "resource-assignment-process" <- node_template targeted by the step
306 }
JakobKrieg7c3f3952020-08-04 20:46:50 +0200307 },
308 "outputs": {
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400309 "template-properties": { <- output
310 "type": "json", <- complex type
311 "value": {
JakobKrieg7c3f3952020-08-04 20:46:50 +0200312 "get_attribute": [ <- uses expression to retrieve attribute from context
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400313 "resource-assignment",
314 "assignment-params"
JakobKrieg7c3f3952020-08-04 20:46:50 +0200315 ]
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400316 }
317 }
JakobKrieg7c3f3952020-08-04 20:46:50 +0200318 }
Singal, Kapil (ks220y)f1aafc42020-09-24 12:47:56 -0400319 }
320 }
JakobKrieg7c3f3952020-08-04 20:46:50 +0200321 }
JakobKrieg7c3f3952020-08-04 20:46:50 +0200322
323`TOSCA definition <http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.2/csd01/TOSCA-Simple-Profile-YAML-v1.2-csd01.html#_Toc494454203>`_
324