7e21cfe0cfd7c610e5243755418326fd332b7f0a
[ccsdk/cds.git] / docs / modelingconcepts / workflow.rst
1 .. 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
4 .. Copyright (C) 2020 Deutsche Telekom AG.
5
6 .. _workflow:
7
8 Workflow
9 --------
10
11 .. note::
12
13    **Workflow Scope within CDS Framework**
14
15    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.
17
18 A workflow defines an overall action to be taken on the service, hence is an
19 entry-point for the run-time execution of the :ref:`CBA Package <cba>`.
20
21 A workflow also defines **inputs** and **outputs** that will defined the **payload contract**
22 of the **request** and **response** (see :ref:`dynamic_payload`)
23
24 A workflow can be **composed** of one or multiple **sub-actions** to execute.
25
26 A CBA package can have as **many workflows** as needed.
27
28 .. _workflow_single_action:
29
30 Single action
31 **************
32
33 The workflow is directly backed by a component (see :ref:`node_type` -> Component).
34
35 In the example bellow, the target of the workflow's steps resource-assignment is ``resource-assignment``
36 which actually is the name of the ``node_template`` defined after, of type ``component-resource-resolution``.
37
38 `Link to example
39 <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       . . .
46       "topology_template": {
47         "workflows": {
48           "resource-assignment": {
49             "steps": {
50               "resource-assignment": {
51                 "description": "Resource Assign Workflow",
52                 "target": "resource-assignment"
53               }
54             }
55           },
56           "inputs": {
57             "resource-assignment-properties": {
58               "description": "Dynamic PropertyDefinition for workflow(resource-assignment).",
59               "required": true,
60               "type": "dt-resource-assignment-properties"
61             }
62           },
63           "outputs": {
64             "meshed-template": {
65               "type": "json",
66               "value": {
67                 "get_attribute": [
68                   "resource-assignment",
69                   "assignment-params"
70                 ]
71               }
72             }
73           }
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                     }
87                   }
88                 }
89               }
90             },
91             "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               }
100             }
101           }
102         }
103       }
104       . . .
105
106 .. _workflow_multiple_actions:
107
108 Multiple sub-actions
109 **********************
110
111 The workflow is backed by a Directed Graph engine, dg-generic (see :ref:`node_type` -> DG,
112 and is an **imperative** workflow.
113
114 A DG used as workflow for CDS is composed of multiple execute nodes; each individual
115 execute node refers to an modelled Component (see :ref:`node_type` -> Component) instance.
116
117 In the example above, you can see the target of the workflow's steps execute-script is
118 ``execute-remote-ansible-process``, which is a node_template of type ``dg_generic``
119
120 `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>`_
122
123 .. code-block:: json
124    :caption: **workflow plan example**
125
126     . . .
127     "topology_template": {
128       "workflows": {
129         "execute-remote-ansible": {
130           "steps": {
131             "execute-script": {
132               "description": "Execute Remote Ansible Script",
133               "target": "execute-remote-ansible-process"
134             }
135           }
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               ]
164             }
165           },
166           "prepare-environment-logs": {
167             "type": "string",
168             "value": {
169               "get_attribute": [
170                 "execute-remote-ansible",
171                 "prepare-environment-logs"
172               ]
173             }
174           },
175           "execute-command-logs": {
176             "type": "string",
177             "value": {
178               "get_attribute": [
179                 "execute-remote-ansible",
180                 "execute-command-logs"
181               ]
182             }
183           }
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     }
210
211 Properties 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.
224        |
225
226        .. tabs::
227
228           .. tab:: static
229
230              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
238
239              Represent the resources defined as input (see :ref:`node_type` -> Source -> Input)
240              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
257    * - outputs
258      - | Defines the outputs of the execution; there can be as many output as needed.
259        | Depending on the Component (see :ref:`node_type` -> Component) of use, some attribute might be retrievable.
260
261        .. list-table::
262             :widths: 50 50
263             :header-rows: 1
264
265             * - type
266               - value
267             * - data type (complex / primitive)
268               - value resolvable using :ref:`expression` -> get_attribute
269    * - steps
270      - | Defines the actual step to execute as part of the workflow
271        |
272        .. list-table::
273           :widths: 25 25 50
274           :header-rows: 1
275
276           * - step-name
277             - description
278             - target
279           * - name of the step
280             - step description
281             - | a node_template implementing on of the supported Node Type (see :ref:`node_type` -> DG),
282                 either a Component or a DG
283               | (see :ref:`workflow_single_action` or :ref:`workflow_multiple_actions`)
284
285 Example:
286
287 .. code-block:: json
288    :caption: **workflow example**
289
290     {
291       "workflow": {
292         "resource-assignment": {                                <- workflow-name
293           "inputs": {
294             "vnf-id": {                                         <- static inputs
295               "required": true,
296               "type": "string"
297             },
298             "resource-assignment-properties": {                 <- dynamic inputs
299               "required": true,
300               "type": "dt-resource-assignment-properties"
301             }
302           },
303           "steps": {
304             "call-resource-assignment": {                       <- step-name
305               "description": "Resource Assignment Workflow",
306               "target": "resource-assignment-process"           <- node_template targeted by the step
307             }
308           },
309           "outputs": {
310             "template-properties": {                            <- output
311               "type": "json",                                   <- complex type
312               "value": {
313                 "get_attribute": [                              <- uses expression to retrieve attribute from context
314                   "resource-assignment",
315                   "assignment-params"
316                 ]
317               }
318             }
319           }
320         }
321       }
322     }
323
324 `TOSCA definition <http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.2/csd01/TOSCA-Simple-Profile-YAML-v1.2-csd01.html#_Toc494454203>`_
325