blob: ce1c1b54162cb911369303d8eadf512fc31cb5b4 [file] [log] [blame]
Dean Troyer07c35572012-03-05 07:15:30 -06001Contributing to DevStack
2========================
3
4
5General
6-------
7
Dean Troyerb8dd27b2013-10-17 12:03:55 -05008DevStack is written in UNIX shell script. It uses a number of bash-isms
Dean Troyerd97ee302015-02-04 12:35:39 -06009and so is limited to Bash (version 4 and up) and compatible shells.
Dean Troyerb8dd27b2013-10-17 12:03:55 -050010Shell script was chosen because it best illustrates the steps used to
11set up and interact with OpenStack components.
Dean Troyer07c35572012-03-05 07:15:30 -060012
Adrien Cunineaff3e12014-10-21 13:46:54 +020013DevStack's official repository is located on git.openstack.org at
14https://git.openstack.org/openstack-dev/devstack. Besides the master branch that
Dean Troyer07c35572012-03-05 07:15:30 -060015tracks the OpenStack trunk branches a separate branch is maintained for all
16OpenStack releases starting with Diablo (stable/diablo).
17
Dean Troyer6d04fd72012-12-21 11:03:37 -060018Contributing code to DevStack follows the usual OpenStack process as described
19in `How To Contribute`__ in the OpenStack wiki. `DevStack's LaunchPad project`__
Roger Luethic21cfc92014-07-22 15:35:02 +020020contains the usual links for blueprints, bugs, etc.
Dean Troyer6d04fd72012-12-21 11:03:37 -060021
22__ contribute_
zhangbailinc63d9332017-09-01 19:46:16 -070023.. _contribute: https://docs.openstack.org/infra/manual/developers.html
Dean Troyer6d04fd72012-12-21 11:03:37 -060024
25__ lp_
26.. _lp: https://launchpad.net/~devstack
27
Ian Wienand6f6e2fd2015-03-20 12:16:28 +110028The `Gerrit review
29queue <https://review.openstack.org/#/q/project:openstack-dev/devstack,n,z>`__
30is used for all commits.
31
Dean Troyer07c35572012-03-05 07:15:30 -060032The primary script in DevStack is ``stack.sh``, which performs the bulk of the
33work for DevStack's use cases. There is a subscript ``functions`` that contains
34generally useful shell functions and is used by a number of the scripts in
35DevStack.
36
37A number of additional scripts can be found in the ``tools`` directory that may
Dean Troyercc6b4432013-04-08 15:38:03 -050038be useful in supporting DevStack installations. Of particular note are ``info.sh``
Adam Spiersd9034762013-10-04 23:20:24 +010039to collect and report information about the installed system, and ``install_prereqs.sh``
Dean Troyercc6b4432013-04-08 15:38:03 -050040that handles installation of the prerequisite packages for DevStack. It is
41suitable, for example, to pre-load a system for making a snapshot.
Dean Troyer07c35572012-03-05 07:15:30 -060042
Ian Wienand6f6e2fd2015-03-20 12:16:28 +110043Repo Layout
44-----------
45
46The DevStack repo generally keeps all of the primary scripts at the root
47level.
48
49``doc`` - Contains the Sphinx source for the documentation.
Chang Liu2c42fd02018-08-03 16:15:20 +080050A complete doc build can be run with ``tox -edocs``.
Ian Wienand6f6e2fd2015-03-20 12:16:28 +110051
52``exercises`` - Contains the test scripts used to sanity-check and
53demonstrate some OpenStack functions. These scripts know how to exit
54early or skip services that are not enabled.
55
56``extras.d`` - Contains the dispatch scripts called by the hooks in
57``stack.sh``, ``unstack.sh`` and ``clean.sh``. See :doc:`the plugins
58docs <plugins>` for more information.
59
60``files`` - Contains a variety of otherwise lost files used in
61configuring and operating DevStack. This includes templates for
62configuration files and the system dependency information. This is also
63where image files are downloaded and expanded if necessary.
64
65``lib`` - Contains the sub-scripts specific to each project. This is
66where the work of managing a project's services is located. Each
67top-level project (Keystone, Nova, etc) has a file here. Additionally
68there are some for system services and project plugins. These
69variables and functions are also used by related projects, such as
70Grenade, to manage a DevStack installation.
71
72``samples`` - Contains a sample of the local files not included in the
73DevStack repo.
74
75``tests`` - the DevStack test suite is rather sparse, mostly consisting
76of test of specific fragile functions in the ``functions`` and
77``functions-common`` files.
78
79``tools`` - Contains a collection of stand-alone scripts. While these
80may reference the top-level DevStack configuration they can generally be
81run alone. There are also some sub-directories to support specific
82environments such as XenServer.
83
Dean Troyer07c35572012-03-05 07:15:30 -060084
85Scripts
86-------
87
88DevStack scripts should generally begin by calling ``env(1)`` in the shebang line::
89
90 #!/usr/bin/env bash
91
92Sometimes the script needs to know the location of the DevStack install directory.
93``TOP_DIR`` should always point there, even if the script itself is located in
94a subdirectory::
95
Dean Troyerb8dd27b2013-10-17 12:03:55 -050096 # Keep track of the current DevStack directory.
Dean Troyer07c35572012-03-05 07:15:30 -060097 TOP_DIR=$(cd $(dirname "$0") && pwd)
98
99Many scripts will utilize shared functions from the ``functions`` file. There are
100also rc files (``stackrc`` and ``openrc``) that are often included to set the primary
101configuration of the user environment::
102
Dean Troyerb8dd27b2013-10-17 12:03:55 -0500103 # Keep track of the current DevStack directory.
Dean Troyer51fb4542012-03-09 22:21:59 -0600104 TOP_DIR=$(cd $(dirname "$0") && pwd)
Dean Troyer07c35572012-03-05 07:15:30 -0600105
106 # Import common functions
Dean Troyer51fb4542012-03-09 22:21:59 -0600107 source $TOP_DIR/functions
Dean Troyer07c35572012-03-05 07:15:30 -0600108
109 # Import configuration
Dean Troyer51fb4542012-03-09 22:21:59 -0600110 source $TOP_DIR/openrc
Dean Troyer07c35572012-03-05 07:15:30 -0600111
112``stack.sh`` is a rather large monolithic script that flows through from beginning
Dean Troyercc6b4432013-04-08 15:38:03 -0500113to end. It has been broken down into project-specific subscripts (as noted above)
114located in ``lib`` to make ``stack.sh`` more manageable and to promote code reuse.
Dean Troyer05f23652012-08-29 15:20:21 -0500115
116These library sub-scripts have a number of fixed entry points, some of which may
117just be stubs. These entry points will be called by ``stack.sh`` in the
118following order::
119
120 install_XXXX
121 configure_XXXX
122 init_XXXX
123 start_XXXX
124 stop_XXXX
125 cleanup_XXXX
126
127There is a sub-script template in ``lib/templates`` to be used in creating new
128service sub-scripts. The comments in ``<>`` are meta comments describing
129how to use the template and should be removed.
Dean Troyer07c35572012-03-05 07:15:30 -0600130
Dean Troyer6d04fd72012-12-21 11:03:37 -0600131In order to show the dependencies and conditions under which project functions
132are executed the top-level conditional testing for things like ``is_service_enabled``
133should be done in ``stack.sh``. There may be nested conditionals that need
134to be in the sub-script, such as testing for keystone being enabled in
135``configure_swift()``.
136
Dean Troyer07c35572012-03-05 07:15:30 -0600137
Dean Troyer2b7ce5a2013-01-10 13:22:45 -0600138stackrc
139-------
140
141``stackrc`` is the global configuration file for DevStack. It is responsible for
Dean Troyerb8dd27b2013-10-17 12:03:55 -0500142calling ``local.conf`` (or ``localrc`` if it exists) so local user configuration
143is recognized.
Dean Troyer2b7ce5a2013-01-10 13:22:45 -0600144
145The criteria for what belongs in ``stackrc`` can be vaguely summarized as
146follows:
147
Dean Troyerb8dd27b2013-10-17 12:03:55 -0500148* All project repositories and branches handled directly in ``stack.sh``
149* Global configuration that may be referenced in ``local.conf``, i.e. ``DEST``, ``DATA_DIR``
Dean Troyer2b7ce5a2013-01-10 13:22:45 -0600150* Global service configuration like ``ENABLED_SERVICES``
151* Variables used by multiple services that do not have a clear owner, i.e.
Daniel Genind4708672014-10-31 15:01:29 -0400152 ``VOLUME_BACKING_FILE_SIZE`` (nova-compute, nova-volumes and cinder) or
153 ``PUBLIC_NETWORK_NAME`` (nova-network and neutron)
Dean Troyer2b7ce5a2013-01-10 13:22:45 -0600154* Variables that can not be cleanly declared in a project file due to
155 dependency ordering, i.e. the order of sourcing the project files can
156 not be changed for other reasons but the earlier file needs to dereference a
157 variable set in the later file. This should be rare.
158
Dean Troyerb8dd27b2013-10-17 12:03:55 -0500159Also, variable declarations in ``stackrc`` before ``local.conf`` is sourced
160do NOT allow overriding (the form
161``FOO=${FOO:-baz}``); if they did then they can already be changed in ``local.conf``
Dean Troyer2b7ce5a2013-01-10 13:22:45 -0600162and can stay in the project file.
163
Dean Troyercc6b4432013-04-08 15:38:03 -0500164
Dean Troyer07c35572012-03-05 07:15:30 -0600165Documentation
166-------------
167
Dean Troyerf5cb1ce2014-10-21 11:16:58 -0500168The DevStack repo now contains all of the static pages of devstack.org in
169the ``doc/source`` directory. The OpenStack CI system rebuilds the docs after every
170commit and updates devstack.org (now a redirect to docs.openstack.org/developer/devstack).
Dean Troyer07c35572012-03-05 07:15:30 -0600171
172All of the scripts are processed with shocco_ to render them with the comments
173as text describing the script below. For this reason we tend to be a little
174verbose in the comments _ABOVE_ the code they pertain to. Shocco also supports
175Markdown formatting in the comments; use it sparingly. Specifically, ``stack.sh``
176uses Markdown headers to divide the script into logical sections.
177
Dean Troyerb8dd27b2013-10-17 12:03:55 -0500178.. _shocco: https://github.com/dtroyer/shocco/tree/rst_support
179
180The script used to drive <code>shocco</code> is <code>tools/build_docs.sh</code>.
Dean Troyerf5cb1ce2014-10-21 11:16:58 -0500181The complete docs build is also handled with <code>tox -edocs</code> per the
182OpenStack project standard.
Dean Troyer07c35572012-03-05 07:15:30 -0600183
184
185Exercises
186---------
187
188The scripts in the exercises directory are meant to 1) perform basic operational
189checks on certain aspects of OpenStack; and b) document the use of the
190OpenStack command-line clients.
191
192In addition to the guidelines above, exercise scripts MUST follow the structure
193outlined here. ``swift.sh`` is perhaps the clearest example of these guidelines.
194These scripts are executed serially by ``exercise.sh`` in testing situations.
195
196* Begin and end with a banner that stands out in a sea of script logs to aid
197 in debugging failures, particularly in automated testing situations. If the
198 end banner is not displayed, the script ended prematurely and can be assumed
199 to have failed.
200
201 ::
202
203 echo "**************************************************"
204 echo "Begin DevStack Exercise: $0"
205 echo "**************************************************"
206 ...
207 set +o xtrace
208 echo "**************************************************"
209 echo "End DevStack Exercise: $0"
210 echo "**************************************************"
211
212* The scripts will generally have the shell ``xtrace`` attribute set to display
213 the actual commands being executed, and the ``errexit`` attribute set to exit
214 the script on non-zero exit codes::
215
216 # This script exits on an error so that errors don't compound and you see
Joe Gordon46400262013-06-30 04:32:27 -0700217 # only the first error that occurred.
Dean Troyer07c35572012-03-05 07:15:30 -0600218 set -o errexit
219
220 # Print the commands being run so that we can see the command that triggers
igor01acdab2016-07-29 13:11:53 +0200221 # an error. It is also useful for following as the install occurs.
Dean Troyer07c35572012-03-05 07:15:30 -0600222 set -o xtrace
223
Dean Troyer51fb4542012-03-09 22:21:59 -0600224* Settings and configuration are stored in ``exerciserc``, which must be
225 sourced after ``openrc`` or ``stackrc``::
226
227 # Import exercise configuration
228 source $TOP_DIR/exerciserc
229
Dean Troyer07c35572012-03-05 07:15:30 -0600230* There are a couple of helper functions in the common ``functions`` sub-script
231 that will check for non-zero exit codes and unset environment variables and
232 print a message and exit the script. These should be called after most client
233 commands that are not otherwise checked to short-circuit long timeouts
234 (instance boot failure, for example)::
235
236 swift post $CONTAINER
237 die_if_error "Failure creating container $CONTAINER"
238
239 FLOATING_IP=`euca-allocate-address | cut -f2`
240 die_if_not_set FLOATING_IP "Failure allocating floating IP"
241
Chmouel Boudjnah408b0092012-03-15 23:21:55 +0000242* If you want an exercise to be skipped when for example a service wasn't
243 enabled for the exercise to be run, you can exit your exercise with the
244 special exitcode 55 and it will be detected as skipped.
245
Dean Troyer07c35572012-03-05 07:15:30 -0600246* The exercise scripts should only use the various OpenStack client binaries to
247 interact with OpenStack. This specifically excludes any ``*-manage`` tools
248 as those assume direct access to configuration and databases, as well as direct
249 database access from the exercise itself.
250
251* If specific configuration needs to be present for the exercise to complete,
Einst Crazyf54f60a2015-10-30 23:00:57 +0800252 it should be staged in ``stack.sh``, or called from ``stack.sh``.
Dean Troyer07c35572012-03-05 07:15:30 -0600253
254* The ``OS_*`` environment variables should be the only ones used for all
255 authentication to OpenStack clients as documented in the CLIAuth_ wiki page.
256
zhangbailinc63d9332017-09-01 19:46:16 -0700257.. _CLIAuth: https://wiki.openstack.org/CLIAuth
Dean Troyer07c35572012-03-05 07:15:30 -0600258
259* The exercise MUST clean up after itself if successful. If it is not successful,
260 it is assumed that state will be left behind; this allows a chance for developers
261 to look around and attempt to debug the problem. The exercise SHOULD clean up
262 or graciously handle possible artifacts left over from previous runs if executed
263 again. It is acceptable to require a reboot or even a re-install of DevStack
264 to restore a clean test environment.
Sean Dague6db28922013-11-22 12:16:02 -0500265
266
267Bash Style Guidelines
268~~~~~~~~~~~~~~~~~~~~~
Roger Luethi473b6282014-04-13 13:47:42 +0200269DevStack defines a bash set of best practices for maintaining large
Sean Dague6db28922013-11-22 12:16:02 -0500270collections of bash scripts. These should be considered as part of the
271review process.
272
Dean Troyerf5cb1ce2014-10-21 11:16:58 -0500273DevStack uses the bashate_ style checker
274to enforce basic guidelines, similar to pep8 and flake8 tools for Python. The
275list below is not complete for what bashate checks, nor is it all checked
276by bashate. So many lines of code, so little time.
277
278.. _bashate: https://pypi.python.org/pypi/bashate
Sean Dague6db28922013-11-22 12:16:02 -0500279
280Whitespace Rules
281----------------
282
283- lines should not include trailing whitespace
284- there should be no hard tabs in the file
285- indents are 4 spaces, and all indentation should be some multiple of
286 them
287
288Control Structure Rules
289-----------------------
Ian Wienand6f6e2fd2015-03-20 12:16:28 +1100290
Sean Dague6db28922013-11-22 12:16:02 -0500291- then should be on the same line as the if
292- do should be on the same line as the for
293
294Example::
295
296 if [[ -r $TOP_DIR/local.conf ]]; then
297 LRC=$(get_meta_section_files $TOP_DIR/local.conf local)
298 for lfile in $LRC; do
299 if [[ "$lfile" == "localrc" ]]; then
300 if [[ -r $TOP_DIR/localrc ]]; then
301 warn $LINENO "localrc and local.conf:[[local]] both exist, using localrc"
302 else
303 echo "# Generated file, do not edit" >$TOP_DIR/.localrc.auto
304 get_meta_section $TOP_DIR/local.conf local $lfile >>$TOP_DIR/.localrc.auto
305 fi
306 fi
307 done
308 fi
309
310Variables and Functions
311-----------------------
Ian Wienand6f6e2fd2015-03-20 12:16:28 +1100312
Sean Dague6db28922013-11-22 12:16:02 -0500313- functions should be used whenever possible for clarity
314- functions should use ``local`` variables as much as possible to
315 ensure they are isolated from the rest of the environment
316- local variables should be lower case, global variables should be
317 upper case
318- function names should_have_underscores, NotCamelCase.
Ian Wienandaee18c72014-02-21 15:35:08 +1100319- functions should be declared as per the regex ^function foo {$
320 with code starting on the next line
Ian Wienandc7df4df2015-03-20 12:18:52 +1100321
322
323Review Criteria
Clark Boylan2a6112e2017-05-12 10:16:33 -0700324---------------
Ian Wienandc7df4df2015-03-20 12:18:52 +1100325
326There are some broad criteria that will be followed when reviewing
327your change
328
329* **Is it passing tests** -- your change will not be reviewed
Swapnil Kulkarni (coolsvap)7f0be4f2015-11-20 10:52:59 +0530330 thoroughly unless the official CI has run successfully against it.
Ian Wienandc7df4df2015-03-20 12:18:52 +1100331
332* **Does this belong in DevStack** -- DevStack reviewers have a
333 default position of "no" but are ready to be convinced by your
334 change.
335
336 For very large changes, you should consider :doc:`the plugins system
337 <plugins>` to see if your code is better abstracted from the main
338 repository.
339
340 For smaller changes, you should always consider if the change can be
341 encapsulated by per-user settings in ``local.conf``. A common example
342 is adding a simple config-option to an ``ini`` file. Specific flags
343 are not usually required for this, although adding documentation
344 about how to achieve a larger goal (which might include turning on
345 various settings, etc) is always welcome.
346
347* **Work-arounds** -- often things get broken and DevStack can be in a
348 position to fix them. Work-arounds are fine, but should be
349 presented in the context of fixing the root-cause of the problem.
350 This means it is well-commented in the code and the change-log and
351 mostly likely includes links to changes or bugs that fix the
352 underlying problem.
353
354* **Should this be upstream** -- DevStack generally does not override
355 default choices provided by projects and attempts to not
Atsushi SAKAI20401432015-07-27 20:42:44 +0900356 unexpectedly modify behavior.
Ian Wienandc7df4df2015-03-20 12:18:52 +1100357
358* **Context in commit messages** -- DevStack touches many different
359 areas and reviewers need context around changes to make good
360 decisions. We also always want it to be clear to someone -- perhaps
361 even years from now -- why we were motivated to make a change at the
362 time.
363
364* **Reviewers** -- please see ``MAINTAINERS.rst`` for a list of people
365 that should be added to reviews of various sub-systems.
Clark Boylan2a6112e2017-05-12 10:16:33 -0700366
367
368Making Changes, Testing, and CI
369-------------------------------
370
371Changes to Devstack are tested by automated continuous integration jobs
372that run on a variety of Linux Distros using a handful of common
373configurations. What this means is that every change to Devstack is
374self testing. One major benefit of this is that developers do not
375typically need to add new non voting test jobs to add features to
376Devstack. Instead the features can be added, then if testing passes
377with the feature enabled the change is ready to merge (pending code
378review).
379
380A concrete example of this was the switch from screen based service
381management to systemd based service management. No new jobs were
382created for this. Instead the features were added to devstack, tested
383locally and in CI using a change that enabled the feature, then once
384the enabling change was passing and the new behavior communicated and
385documented it was merged.
386
387Using this process has been proven to be effective and leads to
388quicker implementation of desired features.