blob: 2dfb28cb8a6a455a2c6badf5efa30703cc63faa8 [file] [log] [blame]
Felipe Monteiroeb197db2018-06-10 12:21:49 -04001Patrole Coding Guide
2====================
DavidPurcell663aedf2017-01-03 10:01:14 -05003
gaozx6f663e02017-08-10 10:24:16 +08004- Step 1: Read the OpenStack Style Commandments: `<https://docs.openstack.org/hacking/latest/>`__
5- Step 2: Review Tempest's Style Commandments: `<https://docs.openstack.org/tempest/latest/HACKING.html>`__
Felipe Monteiro0854ded2017-05-05 16:30:55 +01006- Step 3: Read on
Felipe Monteiro7bc35dc2017-04-19 21:11:46 +01007
Felipe Monteiro0854ded2017-05-05 16:30:55 +01008Patrole Specific Commandments
9------------------------------
10
11Patrole borrows the following commandments from Tempest; refer to
gaozx6f663e02017-08-10 10:24:16 +080012`Tempest's Commandments <https://docs.openstack.org/tempest/latest/HACKING.html>`__
Felipe Monteiro0854ded2017-05-05 16:30:55 +010013for more information:
14
15.. note::
16
17 The original Tempest Commandments do not include Patrole-specific paths.
18 Patrole-specific paths replace the Tempest-specific paths within Patrole's
19 hacking checks.
Felipe Monteiro0854ded2017-05-05 16:30:55 +010020
Felipe Monteirofdc45142018-07-18 20:54:20 +010021- [T102] Cannot import OpenStack python clients in
22 ``patrole_tempest_plugin/tests/api``
Felipe Monteiro0854ded2017-05-05 16:30:55 +010023- [T105] Tests cannot use setUpClass/tearDownClass
24- [T106] vim configuration should not be kept in source files.
25- [T107] Check that a service tag isn't in the module path
26- [T108] Check no hyphen at the end of rand_name() argument
27- [T109] Cannot use testtools.skip decorator; instead use
Felipe Monteirofdc45142018-07-18 20:54:20 +010028 ``decorators.skip_because`` from ``tempest.lib``
29- [T113] Check that tests use ``data_utils.rand_uuid()`` instead of
30 ``uuid.uuid4()``
Felipe Monteiro0854ded2017-05-05 16:30:55 +010031- [N322] Method's default argument shouldn't be mutable
32
33The following are Patrole's specific Commandments:
34
35- [P100] The ``rbac_rule_validation.action`` decorator must be applied to
Felipe Monteiro904a02b2018-10-21 12:54:46 -040036 all RBAC tests
Felipe Monteiro0854ded2017-05-05 16:30:55 +010037- [P101] RBAC test filenames must end with "_rbac.py"; for example,
Felipe Monteirofdc45142018-07-18 20:54:20 +010038 test_servers_rbac.py, not test_servers.py
Felipe Monteiro0854ded2017-05-05 16:30:55 +010039- [P102] RBAC test class names must end in 'RbacTest'
Samantha Blancocd870772017-05-22 14:23:17 -040040- [P103] ``self.client`` must not be used as a client alias; this allows for
Felipe Monteirofdc45142018-07-18 20:54:20 +010041 code that is more maintainable and easier to read
Felipe Monteirobbbdd932018-10-31 23:28:39 -040042- [P104] RBAC `extension test class`_ names must end in 'ExtRbacTest'
Felipe Monteiro904a02b2018-10-21 12:54:46 -040043
Luigi Toscano6da06ed2019-01-07 17:50:41 +010044.. _extension test class: https://git.openstack.org/cgit/openstack/patrole/plain/patrole_tempest_plugin/tests/api/network/README.rst
Felipe Monteiro0854ded2017-05-05 16:30:55 +010045
Felipe Monteiroe36a9732018-11-16 17:28:52 +000046Supported OpenStack Components
47------------------------------
48
49Patrole only offers **in-tree** integration testing coverage for the following
50components:
51
52* Cinder
53* Glance
54* Keystone
55* Neutron
56* Nova
57
58Patrole currently has no stable library, so reliance upon Patrole's framework
59for external RBAC testing should be done with caution. Nonetheless, even when
60Patrole has a stable library, it will only offer in-tree RBAC testing for
61the components listed above.
62
Felipe Monteiro1c8620a2018-02-25 18:52:22 +000063Role Overriding
64---------------
Felipe Monteiro0854ded2017-05-05 16:30:55 +010065
Felipe Monteiro1c8620a2018-02-25 18:52:22 +000066Correct role overriding is vital to correct RBAC testing within Patrole. If a
Sergey Vilgelm78e7f572019-02-03 10:35:01 -060067test does not call ``self.override_role()`` within the RBAC test, followed
Felipe Monteiro1c8620a2018-02-25 18:52:22 +000068by the API endpoint that enforces the expected policy action, then the test is
69**not** a valid Patrole test: The API endpoint under test will be performed
70with admin role, which is always wrong unless ``CONF.patrole.rbac_test_role``
71is also admin.
Felipe Monteiro0854ded2017-05-05 16:30:55 +010072
Felipe Monteiro1c8620a2018-02-25 18:52:22 +000073.. todo::
Felipe Monteiro0854ded2017-05-05 16:30:55 +010074
Felipe Monteiro1c8620a2018-02-25 18:52:22 +000075 Patrole does not have a hacking check for role overriding, but one may be
76 added in the future.
Felipe Monteiro9ae705d2018-03-26 22:14:44 -040077
78Branchless Patrole Considerations
79---------------------------------
80
81Like Tempest, Patrole is branchless. This is to better ensure API and RBAC
82consistency between releases because API and RBAC behavior should not change
83between releases. This means that the stable branches are also gated by the
84Patrole master branch, which also means that proposed commits to Patrole must
85work against both the master and all the currently supported stable branches
86of the projects. As such there are a few special considerations that have to
87be accounted for when pushing new changes to Patrole.
88
891. New Tests for new features
90^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
91
92Patrole, like Tempest, *implicitly* tests new features because new policies
93oftentimes accompany new features. The same `Tempest philosophy`_ regarding
94feature flags and new features also applies to Patrole.
95
96.. _Tempest philosophy: https://docs.openstack.org/tempest/latest/HACKING.html#new-tests-for-new-features
97
982. New Tests for new policies
99^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
100
101When adding tests for new policies that were not in previous releases of the
102projects, the new test must be properly skipped with a feature flag. This
103involves using the ``testtools.skip(Unless|If)`` decorator above the test
104to check if the required policy is enabled. Similarly, a feature flag must
105be used whenever an OpenStack service covered by Patrole changes one of its
106policies in a backwards-incompatible way. If there isn't a method of selecting
107the new policy from the config file then there won't be a mechanism to disable
108the test with older stable releases and the new test won't be able to merge.
109
110Introduction of a new feature flag requires specifying a default value for the
111corresponding config option that is appropriate in the latest OpenStack
112release. Because Patrole is branchless, the feature flag's default value will
113need to be overridden to a value that is appropriate in earlier releases in
114which the feature isn't available. In DevStack, this can be accomplished by
115modifying Patrole's lib installation script for previous branches (because
116DevStack is branched).
117
1183. Bug fix on core project needing Patrole changes
119^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
120
121When trying to land a bug fix which changes a tested API you'll have to use the
122following procedure:
123
124 #. Propose change to the project, get a +2 on the change even with the
125 test failing Patrole side.
126 #. Propose skip to the relevant Patrole test which will only be approved
127 after the corresponding change in the project has a +2.
128 #. Land project change in master and all open stable branches
129 (if required).
130 #. Land changed test in Patrole.
131
132Otherwise the bug fix won't be able to land in the project.
133
1344. New Tests for existing features or policies
135^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
136
137The same `Tempest logic`_ regarding new tests for existing features or
138policies also applies to Patrole.
139
140.. _Tempest logic: https://docs.openstack.org/tempest/latest/HACKING.html#new-tests-for-existing-features
Felipe Monteiro4d4cb1e2018-07-29 13:44:10 -0400141
142
143Black Box vs. White Box Testing
144-------------------------------
145
146Tempest is a `black box testing framework`_, meaning that it is concerned with
147testing public API endpoints and doesn't concern itself with testing internal
148implementation details. Patrole, as a Tempest plugin, also falls underneath
149the category of black box testing. However, even with policy in code
150documentation, some degree of white box testing is required in order to
151correctly write RBAC tests.
152
153This is because :ref:`policy-in-code` documentation, while useful in many
154respects, is usually quite brief and its main purpose is to help operators
155understand how to customize policy configuration rather than to help
156developers understand complex policy authorization work flows. For example,
157policy in code documentation doesn't make deriving
158:ref:`multiple policies <multiple-policies>` easy. Such documentation also
159doesn't usually mention that a specific parameter needs to be set, or that a
160particular microversion must be enabled, or that a particular set of
161prerequisite API or policy actions must be executed, in order for the policy
162under test to be enforced by the server. This means that test writers must
163account for the internal RBAC implementation in API code in order to correctly
164understand the complete RBAC work flow within an API.
165
166Besides, as mentioned :ref:`elsewhere <design-principles>` in this
167documentation, not all services currently implement policy in code, making
168some degree of white box testing a "necessary evil" for writing robust RBAC
169tests.
170
171.. _black box testing framework: https://docs.openstack.org/tempest/latest/HACKING.html#negative-tests