blob: 5f33d770f89029cc1219825312e55051d73e4bd3 [file] [log] [blame]
Dean Troyer07c35572012-03-05 07:15:30 -06001Contributing to DevStack
2========================
3
4
5General
6-------
7
8DevStack is written in POSIX shell script. This choice was made because
9it best illustrates the configuration steps that this implementation takes
Dean Troyercc6b4432013-04-08 15:38:03 -050010on setting up and interacting with OpenStack components. DevStack specifically
11uses Bash and is compatible with Bash 3.
Dean Troyer07c35572012-03-05 07:15:30 -060012
13DevStack's official repository is located on GitHub at
14https://github.com/openstack-dev/devstack.git. Besides the master branch that
15tracks 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`__
20contains the usual links for blueprints, bugs, tec.
21
22__ contribute_
23.. _contribute: http://wiki.openstack.org/HowToContribute.
24
25__ lp_
26.. _lp: https://launchpad.net/~devstack
27
Dean Troyer07c35572012-03-05 07:15:30 -060028The primary script in DevStack is ``stack.sh``, which performs the bulk of the
29work for DevStack's use cases. There is a subscript ``functions`` that contains
30generally useful shell functions and is used by a number of the scripts in
31DevStack.
32
Dean Troyercc6b4432013-04-08 15:38:03 -050033The ``lib`` directory contains sub-scripts for projects or packages that ``stack.sh``
34sources to perform much of the work related to those projects. These sub-scripts
35contain configuration defaults and functions to configure, start and stop the project
36or package. These variables and functions are also used by related projects,
37such as Grenade, to manage a DevStack installation.
38
Dean Troyer07c35572012-03-05 07:15:30 -060039A number of additional scripts can be found in the ``tools`` directory that may
Dean Troyercc6b4432013-04-08 15:38:03 -050040be useful in supporting DevStack installations. Of particular note are ``info.sh``
Adam Spiersd9034762013-10-04 23:20:24 +010041to collect and report information about the installed system, and ``install_prereqs.sh``
Dean Troyercc6b4432013-04-08 15:38:03 -050042that handles installation of the prerequisite packages for DevStack. It is
43suitable, for example, to pre-load a system for making a snapshot.
Dean Troyer07c35572012-03-05 07:15:30 -060044
45
46Scripts
47-------
48
49DevStack scripts should generally begin by calling ``env(1)`` in the shebang line::
50
51 #!/usr/bin/env bash
52
53Sometimes the script needs to know the location of the DevStack install directory.
54``TOP_DIR`` should always point there, even if the script itself is located in
55a subdirectory::
56
57 # Keep track of the current devstack directory.
58 TOP_DIR=$(cd $(dirname "$0") && pwd)
59
60Many scripts will utilize shared functions from the ``functions`` file. There are
61also rc files (``stackrc`` and ``openrc``) that are often included to set the primary
62configuration of the user environment::
63
Dean Troyer51fb4542012-03-09 22:21:59 -060064 # Keep track of the current devstack directory.
65 TOP_DIR=$(cd $(dirname "$0") && pwd)
Dean Troyer07c35572012-03-05 07:15:30 -060066
67 # Import common functions
Dean Troyer51fb4542012-03-09 22:21:59 -060068 source $TOP_DIR/functions
Dean Troyer07c35572012-03-05 07:15:30 -060069
70 # Import configuration
Dean Troyer51fb4542012-03-09 22:21:59 -060071 source $TOP_DIR/openrc
Dean Troyer07c35572012-03-05 07:15:30 -060072
73``stack.sh`` is a rather large monolithic script that flows through from beginning
Dean Troyercc6b4432013-04-08 15:38:03 -050074to end. It has been broken down into project-specific subscripts (as noted above)
75located in ``lib`` to make ``stack.sh`` more manageable and to promote code reuse.
Dean Troyer05f23652012-08-29 15:20:21 -050076
77These library sub-scripts have a number of fixed entry points, some of which may
78just be stubs. These entry points will be called by ``stack.sh`` in the
79following order::
80
81 install_XXXX
82 configure_XXXX
83 init_XXXX
84 start_XXXX
85 stop_XXXX
86 cleanup_XXXX
87
88There is a sub-script template in ``lib/templates`` to be used in creating new
89service sub-scripts. The comments in ``<>`` are meta comments describing
90how to use the template and should be removed.
Dean Troyer07c35572012-03-05 07:15:30 -060091
Dean Troyer6d04fd72012-12-21 11:03:37 -060092In order to show the dependencies and conditions under which project functions
93are executed the top-level conditional testing for things like ``is_service_enabled``
94should be done in ``stack.sh``. There may be nested conditionals that need
95to be in the sub-script, such as testing for keystone being enabled in
96``configure_swift()``.
97
Dean Troyer07c35572012-03-05 07:15:30 -060098
Dean Troyer2b7ce5a2013-01-10 13:22:45 -060099stackrc
100-------
101
102``stackrc`` is the global configuration file for DevStack. It is responsible for
103calling ``localrc`` if it exists so configuration can be overridden by the user.
104
105The criteria for what belongs in ``stackrc`` can be vaguely summarized as
106follows:
107
108* All project respositories and branches (for historical reasons)
109* Global configuration that may be referenced in ``localrc``, i.e. ``DEST``, ``DATA_DIR``
110* Global service configuration like ``ENABLED_SERVICES``
111* Variables used by multiple services that do not have a clear owner, i.e.
112 ``VOLUME_BACKING_FILE_SIZE`` (nova-volumes and cinder) or ``PUBLIC_NETWORK_NAME``
Mark McClainb05c8762013-07-06 23:29:39 -0400113 (nova-network and neutron)
Dean Troyer2b7ce5a2013-01-10 13:22:45 -0600114* Variables that can not be cleanly declared in a project file due to
115 dependency ordering, i.e. the order of sourcing the project files can
116 not be changed for other reasons but the earlier file needs to dereference a
117 variable set in the later file. This should be rare.
118
119Also, variable declarations in ``stackrc`` do NOT allow overriding (the form
120``FOO=${FOO:-baz}``); if they did then they can already be changed in ``localrc``
121and can stay in the project file.
122
Dean Troyercc6b4432013-04-08 15:38:03 -0500123
Dean Troyer07c35572012-03-05 07:15:30 -0600124Documentation
125-------------
126
127The official DevStack repo on GitHub does not include a gh-pages branch that
128GitHub uses to create static web sites. That branch is maintained in the
129`CloudBuilders DevStack repo`__ mirror that supports the
130http://devstack.org site. This is the primary DevStack
131documentation along with the DevStack scripts themselves.
132
133__ repo_
134.. _repo: https://github.com/cloudbuilders/devstack
135
136All of the scripts are processed with shocco_ to render them with the comments
137as text describing the script below. For this reason we tend to be a little
138verbose in the comments _ABOVE_ the code they pertain to. Shocco also supports
139Markdown formatting in the comments; use it sparingly. Specifically, ``stack.sh``
140uses Markdown headers to divide the script into logical sections.
141
142.. _shocco: http://rtomayko.github.com/shocco/
143
144
145Exercises
146---------
147
148The scripts in the exercises directory are meant to 1) perform basic operational
149checks on certain aspects of OpenStack; and b) document the use of the
150OpenStack command-line clients.
151
152In addition to the guidelines above, exercise scripts MUST follow the structure
153outlined here. ``swift.sh`` is perhaps the clearest example of these guidelines.
154These scripts are executed serially by ``exercise.sh`` in testing situations.
155
156* Begin and end with a banner that stands out in a sea of script logs to aid
157 in debugging failures, particularly in automated testing situations. If the
158 end banner is not displayed, the script ended prematurely and can be assumed
159 to have failed.
160
161 ::
162
163 echo "**************************************************"
164 echo "Begin DevStack Exercise: $0"
165 echo "**************************************************"
166 ...
167 set +o xtrace
168 echo "**************************************************"
169 echo "End DevStack Exercise: $0"
170 echo "**************************************************"
171
172* The scripts will generally have the shell ``xtrace`` attribute set to display
173 the actual commands being executed, and the ``errexit`` attribute set to exit
174 the script on non-zero exit codes::
175
176 # This script exits on an error so that errors don't compound and you see
Joe Gordon46400262013-06-30 04:32:27 -0700177 # only the first error that occurred.
Dean Troyer07c35572012-03-05 07:15:30 -0600178 set -o errexit
179
180 # Print the commands being run so that we can see the command that triggers
181 # an error. It is also useful for following allowing as the install occurs.
182 set -o xtrace
183
Dean Troyer51fb4542012-03-09 22:21:59 -0600184* Settings and configuration are stored in ``exerciserc``, which must be
185 sourced after ``openrc`` or ``stackrc``::
186
187 # Import exercise configuration
188 source $TOP_DIR/exerciserc
189
Dean Troyer07c35572012-03-05 07:15:30 -0600190* There are a couple of helper functions in the common ``functions`` sub-script
191 that will check for non-zero exit codes and unset environment variables and
192 print a message and exit the script. These should be called after most client
193 commands that are not otherwise checked to short-circuit long timeouts
194 (instance boot failure, for example)::
195
196 swift post $CONTAINER
197 die_if_error "Failure creating container $CONTAINER"
198
199 FLOATING_IP=`euca-allocate-address | cut -f2`
200 die_if_not_set FLOATING_IP "Failure allocating floating IP"
201
Chmouel Boudjnah408b0092012-03-15 23:21:55 +0000202* If you want an exercise to be skipped when for example a service wasn't
203 enabled for the exercise to be run, you can exit your exercise with the
204 special exitcode 55 and it will be detected as skipped.
205
Dean Troyer07c35572012-03-05 07:15:30 -0600206* The exercise scripts should only use the various OpenStack client binaries to
207 interact with OpenStack. This specifically excludes any ``*-manage`` tools
208 as those assume direct access to configuration and databases, as well as direct
209 database access from the exercise itself.
210
211* If specific configuration needs to be present for the exercise to complete,
212 it should be staged in ``stack.sh``, or called from ``stack.sh`` (see
213 ``files/keystone_data.sh`` for an example of this).
214
215* The ``OS_*`` environment variables should be the only ones used for all
216 authentication to OpenStack clients as documented in the CLIAuth_ wiki page.
217
218.. _CLIAuth: http://wiki.openstack.org/CLIAuth
219
220* The exercise MUST clean up after itself if successful. If it is not successful,
221 it is assumed that state will be left behind; this allows a chance for developers
222 to look around and attempt to debug the problem. The exercise SHOULD clean up
223 or graciously handle possible artifacts left over from previous runs if executed
224 again. It is acceptable to require a reboot or even a re-install of DevStack
225 to restore a clean test environment.