blob: 99920172ad6707fe30cf70372aa5b66f656cae60 [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
Felipe Monteirobbbdd932018-10-31 23:28:39 -040044.. _extension test class: https://github.com/openstack/patrole/tree/master/patrole_tempest_plugin/tests/api/network#neutron-extension-rbac-tests
Felipe Monteiro0854ded2017-05-05 16:30:55 +010045
Felipe Monteiro1c8620a2018-02-25 18:52:22 +000046Role Overriding
47---------------
Felipe Monteiro0854ded2017-05-05 16:30:55 +010048
Felipe Monteiro1c8620a2018-02-25 18:52:22 +000049Correct role overriding is vital to correct RBAC testing within Patrole. If a
50test does not call ``rbac_utils.override_role`` within the RBAC test, followed
51by the API endpoint that enforces the expected policy action, then the test is
52**not** a valid Patrole test: The API endpoint under test will be performed
53with admin role, which is always wrong unless ``CONF.patrole.rbac_test_role``
54is also admin.
Felipe Monteiro0854ded2017-05-05 16:30:55 +010055
Felipe Monteiro1c8620a2018-02-25 18:52:22 +000056.. todo::
Felipe Monteiro0854ded2017-05-05 16:30:55 +010057
Felipe Monteiro1c8620a2018-02-25 18:52:22 +000058 Patrole does not have a hacking check for role overriding, but one may be
59 added in the future.
Felipe Monteiro9ae705d2018-03-26 22:14:44 -040060
61Branchless Patrole Considerations
62---------------------------------
63
64Like Tempest, Patrole is branchless. This is to better ensure API and RBAC
65consistency between releases because API and RBAC behavior should not change
66between releases. This means that the stable branches are also gated by the
67Patrole master branch, which also means that proposed commits to Patrole must
68work against both the master and all the currently supported stable branches
69of the projects. As such there are a few special considerations that have to
70be accounted for when pushing new changes to Patrole.
71
721. New Tests for new features
73^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
74
75Patrole, like Tempest, *implicitly* tests new features because new policies
76oftentimes accompany new features. The same `Tempest philosophy`_ regarding
77feature flags and new features also applies to Patrole.
78
79.. _Tempest philosophy: https://docs.openstack.org/tempest/latest/HACKING.html#new-tests-for-new-features
80
812. New Tests for new policies
82^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
83
84When adding tests for new policies that were not in previous releases of the
85projects, the new test must be properly skipped with a feature flag. This
86involves using the ``testtools.skip(Unless|If)`` decorator above the test
87to check if the required policy is enabled. Similarly, a feature flag must
88be used whenever an OpenStack service covered by Patrole changes one of its
89policies in a backwards-incompatible way. If there isn't a method of selecting
90the new policy from the config file then there won't be a mechanism to disable
91the test with older stable releases and the new test won't be able to merge.
92
93Introduction of a new feature flag requires specifying a default value for the
94corresponding config option that is appropriate in the latest OpenStack
95release. Because Patrole is branchless, the feature flag's default value will
96need to be overridden to a value that is appropriate in earlier releases in
97which the feature isn't available. In DevStack, this can be accomplished by
98modifying Patrole's lib installation script for previous branches (because
99DevStack is branched).
100
1013. Bug fix on core project needing Patrole changes
102^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
103
104When trying to land a bug fix which changes a tested API you'll have to use the
105following procedure:
106
107 #. Propose change to the project, get a +2 on the change even with the
108 test failing Patrole side.
109 #. Propose skip to the relevant Patrole test which will only be approved
110 after the corresponding change in the project has a +2.
111 #. Land project change in master and all open stable branches
112 (if required).
113 #. Land changed test in Patrole.
114
115Otherwise the bug fix won't be able to land in the project.
116
1174. New Tests for existing features or policies
118^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
119
120The same `Tempest logic`_ regarding new tests for existing features or
121policies also applies to Patrole.
122
123.. _Tempest logic: https://docs.openstack.org/tempest/latest/HACKING.html#new-tests-for-existing-features