aboutsummaryrefslogtreecommitdiffstats
path: root/README.rst
blob: 397285dbecaf38e5395ad2456aaa5de04898de70 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
.. Copyright 2019 AT&T Intellectual Property.  All rights reserved.

Manual Heat Template Validation
===============================

.. contents::

validation-scripts
------------------

This project contains validation scripts to test
that a set of Heat Templates adheres to
the ONAP VNF Heat Orchestration Template guidelines.

For more information on the ONAP Heat Orchestration
Template Guidelines, vist the `Heat Guidelines <https://onap.readthedocs.io/en/latest/submodules/vnfrqts/requirements.git/docs/Chapter5/Heat/index.html>`__

About
_____

The validation scripts project allows performing heat template
validation without installing the full VVP platform. The following
instructions apply to running these validation scripts in that manner.


Installation
____________

This software is not platform dependent and can be run in a Windows, Unix or
OS X environment.

Satisfy Dependencies
####################


 These can be installed using pip (assuming pip is installed) with the command:

``$ pip install -r requirements.txt``

Use
___

Clone this project.

To validate Heat templates just run this the command under the folder ``ice_validator``:

``</path/to/validation-scripts/ice_validator>$ pytest --tap-stream --template-directory=<Directory>``

where ``<Directory>`` is the full path to a folder containing heat templates.

Output
######

After performing a validation, an output folder will be created.

``/path/to/validation-scripts/ice_validator/output/``

This folder will contain a file ``report.html`` which contains a list of all
of the ONAP VNF Heat Template Guideline violations. If there are no violations,
the report will say ``No validation errors found.``

Interpreting the Output
#######################

The report file will have 4 columns for details about a violation, and one
row for each violation. Below contains details about each column.

File
~~~~

This is the file(s) that contained the violation

Error Message
~~~~~~~~~~~~~

This shows the test and brief error message from the validation script that
contained the violation. There is a ``Full Details`` button to show the
complete raw test output. The error message will also contain details
about what element is involved with the violation (such as the parameter
name, resource id, etc...).

Requirement(s)
~~~~~~~~~~~~~~

This column contains the requirement(s) that each test/violation is
mapped to. These requirements are taken directly from the VNF Requirements
project Heat Orchestration Template Guidelines section.


Resolution Steps
~~~~~~~~~~~~~~~~

For some violations, there are pre-defined resolution steps that
indicate what action the user should take to resolve the violation.

**Note**: Not all violations will have resolution steps. Most violations
can be resolved simply by reviewing the requirements that have been violated
in the previous column.

How to Contribute
_________________

Before getting started
######################

Objective
~~~~~~~~~

**The objective for the VVP test suite is for each
test to directly correlate with at least one requirement in the**
`VNF Requirements <https://onap.readthedocs.io/en/latest/submodules/vnfrqts/requirements.git/docs/index.html>`__
**project in ONAP. If the test you intend to write doesn't
have a corresponding requirement in the VNF Requirements project, consider
making a contribution to that project first.**

Convenience vs Convention
~~~~~~~~~~~~~~~~~~~~~~~~~

There are a lot of ways to write tests. Priorities for the VVP test suite are

 - Accuracy
 - User Comprehension

The test suite is often used by people who don't write code, or people
who aren't devoted to writing python validation tests.

The output of failed validation tests can be difficult to read, so
keep that in mind when you are deciding whether to create another
level of abstraction vs having some code duplication or verbose tests.

Developer Guide
###############

File Name
~~~~~~~~~

Test files are written in python, and should go into the
``/validation-scripts/ice_validator/tests/`` directory. They should be prefixed
with ``test_``. If not, ``pytest`` will not discover your
test if you don't follow this convention.

Test Name
~~~~~~~~~

Tests are functions defined in the test file, and also must be prefixed with
``test_``. If not, ``pytest`` will not collect them during execution.
For example:

**test_my_new_requirement_file.py**

.. code-block:: python

  def test_my_new_requirement():

Requirement Decorator
~~~~~~~~~~~~~~~~~~~~~

Each test function should be decorated with a requirement ID from the
VNF Requirements project. The following is required to be imported at
the top of the test file:

``from .helpers import validates``

Then, your test function should be decorated like this:

.. code-block:: python

  @validates("R-123456",
             "R-123457") # these requirement IDs should come from the VNFRQTS project
  def test_my_new_requirement():

This decorator is used at the end of the test suite execution to generate a
report that includes the requirements that were violated. If a test is not
decorated it is unclear what the reason for a failure is, and the
implication is that the test is not needed.

Test Parameters
~~~~~~~~~~~~~~~

Each test should be parameterized based on what artifact is being validated.
Available parameters are enumerated in
``/validation-scripts/ice_validator/tests/parameterizers.py``. Below is a description
of the most commonly used:

  - ``heat_template``: parameter is the full path name for a file with the
    extenstion ``.yaml`` or ``.yml``,
    if the file also has a corresponding file with the same name but
    extension ``.env``.
  - ``yaml_file``: parameter is the full path name for a file with the
    extenstion ``.yaml`` or ``.yml``
  - ``yaml_files``: parameter is a list of all files with the extenstion
    ``.yaml`` or ``.yml``.
  - ``volume_template``: parameter is the full path name for a file name
    that ends with ``_volume`` and the extension ``.yaml`` or ``.yml``.

There are many others that can also be used, check ``parameterizers.py`` for
the full list.

The parameter that you decide to use determines how many times a test is
executed, and what data is available to validate. For example, if the
test suite is executed against a directory with 10 ``.yaml`` files, and
a test is using the parameter ``yaml_file``, the test will be executed
once for each file, for a total of 10 executions. If the parameter
``yaml_files`` (note the plural) is used instead, the test will
only execute once.

Here's an example for how to parameterize a test:

.. code-block:: python

  @validates("R-123456",
             "R-123457")
  def test_my_new_requirement(yaml_file): # this test will execute for each .yaml or .yml

Collecting Failures
~~~~~~~~~~~~~~~~~~~

To raise a violation to ``pytest`` to be collected and included on the final
violation report, use the ``assert`` statement. Example:

.. code-block:: python

  @validates("R-123456",
             "R-123457")
  def test_my_new_requirement(yaml_file):
    my test logic
    ...
    ...
    ...

    assert not failure_condition, error_message

As one of the VVP priorities is User Comprehension, the ``error_message``
should be readable and include helpful information for triaging the failure,
such as the ``yaml_file``, the parameter the test was checking, etc...

If the assert statement fails, the failure is collected by ``pytest``, and the
associated requirements and error_message are included in the final report.

Optional: Pytest Markers and Validation Categories
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The VVP test suite has the concept of a ``base`` test. These are used as
sanity tests and are executed before the other tests, and if they fail the
test suite execution is halted. If you are writing a ``base`` test, mark your
test like this:

.. code-block:: python

  import pytest

  @pytest.mark.base # this is the base test marker
  @validates("R-123456")
  def test_my_new_requirement():

The VVP test suite also has the concept of a ``category`` to
define what additional set of optional tests to execute. The way it works
is by using ``categories`` decorator.

By default, all ``base`` tests and tests with no category are executed.
If you want an additional category to run, pass the command line argument:

``--category=<category>``

This will execute all ``base`` tests, non-marked tests,
and tests marked like the following:

.. code-block:: python

  import pytest

  @categories("<category>") # substitue <category> with the category name
  @validates("R-123456")
  def test_my_new_requirement():

This should be used sparingly, and in practice consider reviewing a requirement
with the VNF Requirements team before adding a test to a category.

Self-Test Suite
~~~~~~~~~~~~~~~

The VVP test suite includes an extensive self-test suite. This can be
executed by running

``</path/to/validation-scripts/ice_validator>$ pytest --self-test tests/``

This self test suite is used as a check for any new or modified tests.

If you are adding a new test, a new self-test ``fixture`` **MUST** be created
in the directory ``/validation-scripts/ice_validator/tests/fixtures``. The
directory should be named identical to the new python file (without the ``.py``
extension), and it should contain 2 subdirectories: ``pass`` and ``fail``.

These directories should include heat templates that pass and fail the new test.
For Example, if I have created a new test called ``test_my_new_requirement.py``
, I should create:

``/validation-scripts/ice_validator/tests/fixtures/test_my_new_requirement/pass``
``/validation-scripts/ice_validator/tests/fixtures/test_my_new_requirement/pass/pass.yaml``
``/validation-scripts/ice_validator/tests/fixtures/test_my_new_requirement/fail``
``/validation-scripts/ice_validator/tests/fixtures/test_my_new_requirement/fail/fail.yaml``

When executing the self-test suite, the templates in these folders are
expected to pass and fail, respectively, **ONLY** for the corresponding test.
They don't need to pass the whole test suite.