Dean Troyer | 07c3557 | 2012-03-05 07:15:30 -0600 | [diff] [blame] | 1 | Contributing to DevStack |
| 2 | ======================== |
| 3 | |
| 4 | |
| 5 | General |
| 6 | ------- |
| 7 | |
Dean Troyer | b8dd27b | 2013-10-17 12:03:55 -0500 | [diff] [blame] | 8 | DevStack is written in UNIX shell script. It uses a number of bash-isms |
Dean Troyer | d97ee30 | 2015-02-04 12:35:39 -0600 | [diff] [blame] | 9 | and so is limited to Bash (version 4 and up) and compatible shells. |
Dean Troyer | b8dd27b | 2013-10-17 12:03:55 -0500 | [diff] [blame] | 10 | Shell script was chosen because it best illustrates the steps used to |
| 11 | set up and interact with OpenStack components. |
Dean Troyer | 07c3557 | 2012-03-05 07:15:30 -0600 | [diff] [blame] | 12 | |
Adrien Cunin | eaff3e1 | 2014-10-21 13:46:54 +0200 | [diff] [blame] | 13 | DevStack's official repository is located on git.openstack.org at |
| 14 | https://git.openstack.org/openstack-dev/devstack. Besides the master branch that |
Dean Troyer | 07c3557 | 2012-03-05 07:15:30 -0600 | [diff] [blame] | 15 | tracks the OpenStack trunk branches a separate branch is maintained for all |
| 16 | OpenStack releases starting with Diablo (stable/diablo). |
| 17 | |
Dean Troyer | 6d04fd7 | 2012-12-21 11:03:37 -0600 | [diff] [blame] | 18 | Contributing code to DevStack follows the usual OpenStack process as described |
| 19 | in `How To Contribute`__ in the OpenStack wiki. `DevStack's LaunchPad project`__ |
Roger Luethi | c21cfc9 | 2014-07-22 15:35:02 +0200 | [diff] [blame] | 20 | contains the usual links for blueprints, bugs, etc. |
Dean Troyer | 6d04fd7 | 2012-12-21 11:03:37 -0600 | [diff] [blame] | 21 | |
| 22 | __ contribute_ |
Jeremy Stanley | 3eeed23 | 2014-12-05 03:30:41 +0000 | [diff] [blame] | 23 | .. _contribute: http://docs.openstack.org/infra/manual/developers.html |
Dean Troyer | 6d04fd7 | 2012-12-21 11:03:37 -0600 | [diff] [blame] | 24 | |
| 25 | __ lp_ |
| 26 | .. _lp: https://launchpad.net/~devstack |
| 27 | |
Ian Wienand | 6f6e2fd | 2015-03-20 12:16:28 +1100 | [diff] [blame] | 28 | The `Gerrit review |
| 29 | queue <https://review.openstack.org/#/q/project:openstack-dev/devstack,n,z>`__ |
| 30 | is used for all commits. |
| 31 | |
Dean Troyer | 07c3557 | 2012-03-05 07:15:30 -0600 | [diff] [blame] | 32 | The primary script in DevStack is ``stack.sh``, which performs the bulk of the |
| 33 | work for DevStack's use cases. There is a subscript ``functions`` that contains |
| 34 | generally useful shell functions and is used by a number of the scripts in |
| 35 | DevStack. |
| 36 | |
| 37 | A number of additional scripts can be found in the ``tools`` directory that may |
Dean Troyer | cc6b443 | 2013-04-08 15:38:03 -0500 | [diff] [blame] | 38 | be useful in supporting DevStack installations. Of particular note are ``info.sh`` |
Adam Spiers | d903476 | 2013-10-04 23:20:24 +0100 | [diff] [blame] | 39 | to collect and report information about the installed system, and ``install_prereqs.sh`` |
Dean Troyer | cc6b443 | 2013-04-08 15:38:03 -0500 | [diff] [blame] | 40 | that handles installation of the prerequisite packages for DevStack. It is |
| 41 | suitable, for example, to pre-load a system for making a snapshot. |
Dean Troyer | 07c3557 | 2012-03-05 07:15:30 -0600 | [diff] [blame] | 42 | |
Ian Wienand | 6f6e2fd | 2015-03-20 12:16:28 +1100 | [diff] [blame] | 43 | Repo Layout |
| 44 | ----------- |
| 45 | |
| 46 | The DevStack repo generally keeps all of the primary scripts at the root |
| 47 | level. |
| 48 | |
| 49 | ``doc`` - Contains the Sphinx source for the documentation. |
| 50 | ``tools/build_docs.sh`` is used to generate the HTML versions of the |
| 51 | DevStack scripts. A complete doc build can be run with ``tox -edocs``. |
| 52 | |
| 53 | ``exercises`` - Contains the test scripts used to sanity-check and |
| 54 | demonstrate some OpenStack functions. These scripts know how to exit |
| 55 | early or skip services that are not enabled. |
| 56 | |
| 57 | ``extras.d`` - Contains the dispatch scripts called by the hooks in |
| 58 | ``stack.sh``, ``unstack.sh`` and ``clean.sh``. See :doc:`the plugins |
| 59 | docs <plugins>` for more information. |
| 60 | |
| 61 | ``files`` - Contains a variety of otherwise lost files used in |
| 62 | configuring and operating DevStack. This includes templates for |
| 63 | configuration files and the system dependency information. This is also |
| 64 | where image files are downloaded and expanded if necessary. |
| 65 | |
| 66 | ``lib`` - Contains the sub-scripts specific to each project. This is |
| 67 | where the work of managing a project's services is located. Each |
| 68 | top-level project (Keystone, Nova, etc) has a file here. Additionally |
| 69 | there are some for system services and project plugins. These |
| 70 | variables and functions are also used by related projects, such as |
| 71 | Grenade, to manage a DevStack installation. |
| 72 | |
| 73 | ``samples`` - Contains a sample of the local files not included in the |
| 74 | DevStack repo. |
| 75 | |
| 76 | ``tests`` - the DevStack test suite is rather sparse, mostly consisting |
| 77 | of test of specific fragile functions in the ``functions`` and |
| 78 | ``functions-common`` files. |
| 79 | |
| 80 | ``tools`` - Contains a collection of stand-alone scripts. While these |
| 81 | may reference the top-level DevStack configuration they can generally be |
| 82 | run alone. There are also some sub-directories to support specific |
| 83 | environments such as XenServer. |
| 84 | |
Dean Troyer | 07c3557 | 2012-03-05 07:15:30 -0600 | [diff] [blame] | 85 | |
| 86 | Scripts |
| 87 | ------- |
| 88 | |
| 89 | DevStack scripts should generally begin by calling ``env(1)`` in the shebang line:: |
| 90 | |
| 91 | #!/usr/bin/env bash |
| 92 | |
| 93 | Sometimes the script needs to know the location of the DevStack install directory. |
| 94 | ``TOP_DIR`` should always point there, even if the script itself is located in |
| 95 | a subdirectory:: |
| 96 | |
Dean Troyer | b8dd27b | 2013-10-17 12:03:55 -0500 | [diff] [blame] | 97 | # Keep track of the current DevStack directory. |
Dean Troyer | 07c3557 | 2012-03-05 07:15:30 -0600 | [diff] [blame] | 98 | TOP_DIR=$(cd $(dirname "$0") && pwd) |
| 99 | |
| 100 | Many scripts will utilize shared functions from the ``functions`` file. There are |
| 101 | also rc files (``stackrc`` and ``openrc``) that are often included to set the primary |
| 102 | configuration of the user environment:: |
| 103 | |
Dean Troyer | b8dd27b | 2013-10-17 12:03:55 -0500 | [diff] [blame] | 104 | # Keep track of the current DevStack directory. |
Dean Troyer | 51fb454 | 2012-03-09 22:21:59 -0600 | [diff] [blame] | 105 | TOP_DIR=$(cd $(dirname "$0") && pwd) |
Dean Troyer | 07c3557 | 2012-03-05 07:15:30 -0600 | [diff] [blame] | 106 | |
| 107 | # Import common functions |
Dean Troyer | 51fb454 | 2012-03-09 22:21:59 -0600 | [diff] [blame] | 108 | source $TOP_DIR/functions |
Dean Troyer | 07c3557 | 2012-03-05 07:15:30 -0600 | [diff] [blame] | 109 | |
| 110 | # Import configuration |
Dean Troyer | 51fb454 | 2012-03-09 22:21:59 -0600 | [diff] [blame] | 111 | source $TOP_DIR/openrc |
Dean Troyer | 07c3557 | 2012-03-05 07:15:30 -0600 | [diff] [blame] | 112 | |
| 113 | ``stack.sh`` is a rather large monolithic script that flows through from beginning |
Dean Troyer | cc6b443 | 2013-04-08 15:38:03 -0500 | [diff] [blame] | 114 | to end. It has been broken down into project-specific subscripts (as noted above) |
| 115 | located in ``lib`` to make ``stack.sh`` more manageable and to promote code reuse. |
Dean Troyer | 05f2365 | 2012-08-29 15:20:21 -0500 | [diff] [blame] | 116 | |
| 117 | These library sub-scripts have a number of fixed entry points, some of which may |
| 118 | just be stubs. These entry points will be called by ``stack.sh`` in the |
| 119 | following order:: |
| 120 | |
| 121 | install_XXXX |
| 122 | configure_XXXX |
| 123 | init_XXXX |
| 124 | start_XXXX |
| 125 | stop_XXXX |
| 126 | cleanup_XXXX |
| 127 | |
| 128 | There is a sub-script template in ``lib/templates`` to be used in creating new |
| 129 | service sub-scripts. The comments in ``<>`` are meta comments describing |
| 130 | how to use the template and should be removed. |
Dean Troyer | 07c3557 | 2012-03-05 07:15:30 -0600 | [diff] [blame] | 131 | |
Dean Troyer | 6d04fd7 | 2012-12-21 11:03:37 -0600 | [diff] [blame] | 132 | In order to show the dependencies and conditions under which project functions |
| 133 | are executed the top-level conditional testing for things like ``is_service_enabled`` |
| 134 | should be done in ``stack.sh``. There may be nested conditionals that need |
| 135 | to be in the sub-script, such as testing for keystone being enabled in |
| 136 | ``configure_swift()``. |
| 137 | |
Dean Troyer | 07c3557 | 2012-03-05 07:15:30 -0600 | [diff] [blame] | 138 | |
Dean Troyer | 2b7ce5a | 2013-01-10 13:22:45 -0600 | [diff] [blame] | 139 | stackrc |
| 140 | ------- |
| 141 | |
| 142 | ``stackrc`` is the global configuration file for DevStack. It is responsible for |
Dean Troyer | b8dd27b | 2013-10-17 12:03:55 -0500 | [diff] [blame] | 143 | calling ``local.conf`` (or ``localrc`` if it exists) so local user configuration |
| 144 | is recognized. |
Dean Troyer | 2b7ce5a | 2013-01-10 13:22:45 -0600 | [diff] [blame] | 145 | |
| 146 | The criteria for what belongs in ``stackrc`` can be vaguely summarized as |
| 147 | follows: |
| 148 | |
Dean Troyer | b8dd27b | 2013-10-17 12:03:55 -0500 | [diff] [blame] | 149 | * All project repositories and branches handled directly in ``stack.sh`` |
| 150 | * Global configuration that may be referenced in ``local.conf``, i.e. ``DEST``, ``DATA_DIR`` |
Dean Troyer | 2b7ce5a | 2013-01-10 13:22:45 -0600 | [diff] [blame] | 151 | * Global service configuration like ``ENABLED_SERVICES`` |
| 152 | * Variables used by multiple services that do not have a clear owner, i.e. |
Daniel Genin | d470867 | 2014-10-31 15:01:29 -0400 | [diff] [blame] | 153 | ``VOLUME_BACKING_FILE_SIZE`` (nova-compute, nova-volumes and cinder) or |
| 154 | ``PUBLIC_NETWORK_NAME`` (nova-network and neutron) |
Dean Troyer | 2b7ce5a | 2013-01-10 13:22:45 -0600 | [diff] [blame] | 155 | * Variables that can not be cleanly declared in a project file due to |
| 156 | dependency ordering, i.e. the order of sourcing the project files can |
| 157 | not be changed for other reasons but the earlier file needs to dereference a |
| 158 | variable set in the later file. This should be rare. |
| 159 | |
Dean Troyer | b8dd27b | 2013-10-17 12:03:55 -0500 | [diff] [blame] | 160 | Also, variable declarations in ``stackrc`` before ``local.conf`` is sourced |
| 161 | do NOT allow overriding (the form |
| 162 | ``FOO=${FOO:-baz}``); if they did then they can already be changed in ``local.conf`` |
Dean Troyer | 2b7ce5a | 2013-01-10 13:22:45 -0600 | [diff] [blame] | 163 | and can stay in the project file. |
| 164 | |
Dean Troyer | cc6b443 | 2013-04-08 15:38:03 -0500 | [diff] [blame] | 165 | |
Dean Troyer | 07c3557 | 2012-03-05 07:15:30 -0600 | [diff] [blame] | 166 | Documentation |
| 167 | ------------- |
| 168 | |
Dean Troyer | f5cb1ce | 2014-10-21 11:16:58 -0500 | [diff] [blame] | 169 | The DevStack repo now contains all of the static pages of devstack.org in |
| 170 | the ``doc/source`` directory. The OpenStack CI system rebuilds the docs after every |
| 171 | commit and updates devstack.org (now a redirect to docs.openstack.org/developer/devstack). |
Dean Troyer | 07c3557 | 2012-03-05 07:15:30 -0600 | [diff] [blame] | 172 | |
| 173 | All of the scripts are processed with shocco_ to render them with the comments |
| 174 | as text describing the script below. For this reason we tend to be a little |
| 175 | verbose in the comments _ABOVE_ the code they pertain to. Shocco also supports |
| 176 | Markdown formatting in the comments; use it sparingly. Specifically, ``stack.sh`` |
| 177 | uses Markdown headers to divide the script into logical sections. |
| 178 | |
Dean Troyer | b8dd27b | 2013-10-17 12:03:55 -0500 | [diff] [blame] | 179 | .. _shocco: https://github.com/dtroyer/shocco/tree/rst_support |
| 180 | |
| 181 | The script used to drive <code>shocco</code> is <code>tools/build_docs.sh</code>. |
Dean Troyer | f5cb1ce | 2014-10-21 11:16:58 -0500 | [diff] [blame] | 182 | The complete docs build is also handled with <code>tox -edocs</code> per the |
| 183 | OpenStack project standard. |
Dean Troyer | 07c3557 | 2012-03-05 07:15:30 -0600 | [diff] [blame] | 184 | |
| 185 | |
| 186 | Exercises |
| 187 | --------- |
| 188 | |
| 189 | The scripts in the exercises directory are meant to 1) perform basic operational |
| 190 | checks on certain aspects of OpenStack; and b) document the use of the |
| 191 | OpenStack command-line clients. |
| 192 | |
| 193 | In addition to the guidelines above, exercise scripts MUST follow the structure |
| 194 | outlined here. ``swift.sh`` is perhaps the clearest example of these guidelines. |
| 195 | These scripts are executed serially by ``exercise.sh`` in testing situations. |
| 196 | |
| 197 | * Begin and end with a banner that stands out in a sea of script logs to aid |
| 198 | in debugging failures, particularly in automated testing situations. If the |
| 199 | end banner is not displayed, the script ended prematurely and can be assumed |
| 200 | to have failed. |
| 201 | |
| 202 | :: |
| 203 | |
| 204 | echo "**************************************************" |
| 205 | echo "Begin DevStack Exercise: $0" |
| 206 | echo "**************************************************" |
| 207 | ... |
| 208 | set +o xtrace |
| 209 | echo "**************************************************" |
| 210 | echo "End DevStack Exercise: $0" |
| 211 | echo "**************************************************" |
| 212 | |
| 213 | * The scripts will generally have the shell ``xtrace`` attribute set to display |
| 214 | the actual commands being executed, and the ``errexit`` attribute set to exit |
| 215 | the script on non-zero exit codes:: |
| 216 | |
| 217 | # This script exits on an error so that errors don't compound and you see |
Joe Gordon | 4640026 | 2013-06-30 04:32:27 -0700 | [diff] [blame] | 218 | # only the first error that occurred. |
Dean Troyer | 07c3557 | 2012-03-05 07:15:30 -0600 | [diff] [blame] | 219 | set -o errexit |
| 220 | |
| 221 | # Print the commands being run so that we can see the command that triggers |
| 222 | # an error. It is also useful for following allowing as the install occurs. |
| 223 | set -o xtrace |
| 224 | |
Dean Troyer | 51fb454 | 2012-03-09 22:21:59 -0600 | [diff] [blame] | 225 | * Settings and configuration are stored in ``exerciserc``, which must be |
| 226 | sourced after ``openrc`` or ``stackrc``:: |
| 227 | |
| 228 | # Import exercise configuration |
| 229 | source $TOP_DIR/exerciserc |
| 230 | |
Dean Troyer | 07c3557 | 2012-03-05 07:15:30 -0600 | [diff] [blame] | 231 | * There are a couple of helper functions in the common ``functions`` sub-script |
| 232 | that will check for non-zero exit codes and unset environment variables and |
| 233 | print a message and exit the script. These should be called after most client |
| 234 | commands that are not otherwise checked to short-circuit long timeouts |
| 235 | (instance boot failure, for example):: |
| 236 | |
| 237 | swift post $CONTAINER |
| 238 | die_if_error "Failure creating container $CONTAINER" |
| 239 | |
| 240 | FLOATING_IP=`euca-allocate-address | cut -f2` |
| 241 | die_if_not_set FLOATING_IP "Failure allocating floating IP" |
| 242 | |
Chmouel Boudjnah | 408b009 | 2012-03-15 23:21:55 +0000 | [diff] [blame] | 243 | * If you want an exercise to be skipped when for example a service wasn't |
| 244 | enabled for the exercise to be run, you can exit your exercise with the |
| 245 | special exitcode 55 and it will be detected as skipped. |
| 246 | |
Dean Troyer | 07c3557 | 2012-03-05 07:15:30 -0600 | [diff] [blame] | 247 | * The exercise scripts should only use the various OpenStack client binaries to |
| 248 | interact with OpenStack. This specifically excludes any ``*-manage`` tools |
| 249 | as those assume direct access to configuration and databases, as well as direct |
| 250 | database access from the exercise itself. |
| 251 | |
| 252 | * If specific configuration needs to be present for the exercise to complete, |
| 253 | it should be staged in ``stack.sh``, or called from ``stack.sh`` (see |
| 254 | ``files/keystone_data.sh`` for an example of this). |
| 255 | |
| 256 | * The ``OS_*`` environment variables should be the only ones used for all |
| 257 | authentication to OpenStack clients as documented in the CLIAuth_ wiki page. |
| 258 | |
| 259 | .. _CLIAuth: http://wiki.openstack.org/CLIAuth |
| 260 | |
| 261 | * The exercise MUST clean up after itself if successful. If it is not successful, |
| 262 | it is assumed that state will be left behind; this allows a chance for developers |
| 263 | to look around and attempt to debug the problem. The exercise SHOULD clean up |
| 264 | or graciously handle possible artifacts left over from previous runs if executed |
| 265 | again. It is acceptable to require a reboot or even a re-install of DevStack |
| 266 | to restore a clean test environment. |
Sean Dague | 6db2892 | 2013-11-22 12:16:02 -0500 | [diff] [blame] | 267 | |
| 268 | |
| 269 | Bash Style Guidelines |
| 270 | ~~~~~~~~~~~~~~~~~~~~~ |
Roger Luethi | 473b628 | 2014-04-13 13:47:42 +0200 | [diff] [blame] | 271 | DevStack defines a bash set of best practices for maintaining large |
Sean Dague | 6db2892 | 2013-11-22 12:16:02 -0500 | [diff] [blame] | 272 | collections of bash scripts. These should be considered as part of the |
| 273 | review process. |
| 274 | |
Dean Troyer | f5cb1ce | 2014-10-21 11:16:58 -0500 | [diff] [blame] | 275 | DevStack uses the bashate_ style checker |
| 276 | to enforce basic guidelines, similar to pep8 and flake8 tools for Python. The |
| 277 | list below is not complete for what bashate checks, nor is it all checked |
| 278 | by bashate. So many lines of code, so little time. |
| 279 | |
| 280 | .. _bashate: https://pypi.python.org/pypi/bashate |
Sean Dague | 6db2892 | 2013-11-22 12:16:02 -0500 | [diff] [blame] | 281 | |
| 282 | Whitespace Rules |
| 283 | ---------------- |
| 284 | |
| 285 | - lines should not include trailing whitespace |
| 286 | - there should be no hard tabs in the file |
| 287 | - indents are 4 spaces, and all indentation should be some multiple of |
| 288 | them |
| 289 | |
| 290 | Control Structure Rules |
| 291 | ----------------------- |
Ian Wienand | 6f6e2fd | 2015-03-20 12:16:28 +1100 | [diff] [blame] | 292 | |
Sean Dague | 6db2892 | 2013-11-22 12:16:02 -0500 | [diff] [blame] | 293 | - then should be on the same line as the if |
| 294 | - do should be on the same line as the for |
| 295 | |
| 296 | Example:: |
| 297 | |
| 298 | if [[ -r $TOP_DIR/local.conf ]]; then |
| 299 | LRC=$(get_meta_section_files $TOP_DIR/local.conf local) |
| 300 | for lfile in $LRC; do |
| 301 | if [[ "$lfile" == "localrc" ]]; then |
| 302 | if [[ -r $TOP_DIR/localrc ]]; then |
| 303 | warn $LINENO "localrc and local.conf:[[local]] both exist, using localrc" |
| 304 | else |
| 305 | echo "# Generated file, do not edit" >$TOP_DIR/.localrc.auto |
| 306 | get_meta_section $TOP_DIR/local.conf local $lfile >>$TOP_DIR/.localrc.auto |
| 307 | fi |
| 308 | fi |
| 309 | done |
| 310 | fi |
| 311 | |
| 312 | Variables and Functions |
| 313 | ----------------------- |
Ian Wienand | 6f6e2fd | 2015-03-20 12:16:28 +1100 | [diff] [blame] | 314 | |
Sean Dague | 6db2892 | 2013-11-22 12:16:02 -0500 | [diff] [blame] | 315 | - functions should be used whenever possible for clarity |
| 316 | - functions should use ``local`` variables as much as possible to |
| 317 | ensure they are isolated from the rest of the environment |
| 318 | - local variables should be lower case, global variables should be |
| 319 | upper case |
| 320 | - function names should_have_underscores, NotCamelCase. |
Ian Wienand | aee18c7 | 2014-02-21 15:35:08 +1100 | [diff] [blame] | 321 | - functions should be declared as per the regex ^function foo {$ |
| 322 | with code starting on the next line |
Ian Wienand | c7df4df | 2015-03-20 12:18:52 +1100 | [diff] [blame] | 323 | |
| 324 | |
| 325 | Review Criteria |
| 326 | =============== |
| 327 | |
| 328 | There are some broad criteria that will be followed when reviewing |
| 329 | your change |
| 330 | |
| 331 | * **Is it passing tests** -- your change will not be reviewed |
| 332 | throughly unless the official CI has run successfully against it. |
| 333 | |
| 334 | * **Does this belong in DevStack** -- DevStack reviewers have a |
| 335 | default position of "no" but are ready to be convinced by your |
| 336 | change. |
| 337 | |
| 338 | For very large changes, you should consider :doc:`the plugins system |
| 339 | <plugins>` to see if your code is better abstracted from the main |
| 340 | repository. |
| 341 | |
| 342 | For smaller changes, you should always consider if the change can be |
| 343 | encapsulated by per-user settings in ``local.conf``. A common example |
| 344 | is adding a simple config-option to an ``ini`` file. Specific flags |
| 345 | are not usually required for this, although adding documentation |
| 346 | about how to achieve a larger goal (which might include turning on |
| 347 | various settings, etc) is always welcome. |
| 348 | |
| 349 | * **Work-arounds** -- often things get broken and DevStack can be in a |
| 350 | position to fix them. Work-arounds are fine, but should be |
| 351 | presented in the context of fixing the root-cause of the problem. |
| 352 | This means it is well-commented in the code and the change-log and |
| 353 | mostly likely includes links to changes or bugs that fix the |
| 354 | underlying problem. |
| 355 | |
| 356 | * **Should this be upstream** -- DevStack generally does not override |
| 357 | default choices provided by projects and attempts to not |
Atsushi SAKAI | 2040143 | 2015-07-27 20:42:44 +0900 | [diff] [blame] | 358 | unexpectedly modify behavior. |
Ian Wienand | c7df4df | 2015-03-20 12:18:52 +1100 | [diff] [blame] | 359 | |
| 360 | * **Context in commit messages** -- DevStack touches many different |
| 361 | areas and reviewers need context around changes to make good |
| 362 | decisions. We also always want it to be clear to someone -- perhaps |
| 363 | even years from now -- why we were motivated to make a change at the |
| 364 | time. |
| 365 | |
| 366 | * **Reviewers** -- please see ``MAINTAINERS.rst`` for a list of people |
| 367 | that should be added to reviews of various sub-systems. |