blob: e8f90c78d73098649ba87f58eee2fc6b7113312a [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
10on setting up and interacting with OpenStack components. DevStack specifies
11BASH and is compatible with Bash 3.
12
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
18The primary script in DevStack is ``stack.sh``, which performs the bulk of the
19work for DevStack's use cases. There is a subscript ``functions`` that contains
20generally useful shell functions and is used by a number of the scripts in
21DevStack.
22
23A number of additional scripts can be found in the ``tools`` directory that may
24be useful in setting up special-case uses of DevStack. These include: bare metal
25deployment, ramdisk deployment and Jenkins integration.
26
27
28Scripts
29-------
30
31DevStack scripts should generally begin by calling ``env(1)`` in the shebang line::
32
33 #!/usr/bin/env bash
34
35Sometimes the script needs to know the location of the DevStack install directory.
36``TOP_DIR`` should always point there, even if the script itself is located in
37a subdirectory::
38
39 # Keep track of the current devstack directory.
40 TOP_DIR=$(cd $(dirname "$0") && pwd)
41
42Many scripts will utilize shared functions from the ``functions`` file. There are
43also rc files (``stackrc`` and ``openrc``) that are often included to set the primary
44configuration of the user environment::
45
Dean Troyer51fb4542012-03-09 22:21:59 -060046 # Keep track of the current devstack directory.
47 TOP_DIR=$(cd $(dirname "$0") && pwd)
Dean Troyer07c35572012-03-05 07:15:30 -060048
49 # Import common functions
Dean Troyer51fb4542012-03-09 22:21:59 -060050 source $TOP_DIR/functions
Dean Troyer07c35572012-03-05 07:15:30 -060051
52 # Import configuration
Dean Troyer51fb4542012-03-09 22:21:59 -060053 source $TOP_DIR/openrc
Dean Troyer07c35572012-03-05 07:15:30 -060054
55``stack.sh`` is a rather large monolithic script that flows through from beginning
Dean Troyer05f23652012-08-29 15:20:21 -050056to end. The process of breaking it down into project-level sub-scripts has begun
57with the introduction of ``lib/cinder`` and ``lib/ceilometer``.
58
59These library sub-scripts have a number of fixed entry points, some of which may
60just be stubs. These entry points will be called by ``stack.sh`` in the
61following order::
62
63 install_XXXX
64 configure_XXXX
65 init_XXXX
66 start_XXXX
67 stop_XXXX
68 cleanup_XXXX
69
70There is a sub-script template in ``lib/templates`` to be used in creating new
71service sub-scripts. The comments in ``<>`` are meta comments describing
72how to use the template and should be removed.
Dean Troyer07c35572012-03-05 07:15:30 -060073
74
75Documentation
76-------------
77
78The official DevStack repo on GitHub does not include a gh-pages branch that
79GitHub uses to create static web sites. That branch is maintained in the
80`CloudBuilders DevStack repo`__ mirror that supports the
81http://devstack.org site. This is the primary DevStack
82documentation along with the DevStack scripts themselves.
83
84__ repo_
85.. _repo: https://github.com/cloudbuilders/devstack
86
87All of the scripts are processed with shocco_ to render them with the comments
88as text describing the script below. For this reason we tend to be a little
89verbose in the comments _ABOVE_ the code they pertain to. Shocco also supports
90Markdown formatting in the comments; use it sparingly. Specifically, ``stack.sh``
91uses Markdown headers to divide the script into logical sections.
92
93.. _shocco: http://rtomayko.github.com/shocco/
94
95
96Exercises
97---------
98
99The scripts in the exercises directory are meant to 1) perform basic operational
100checks on certain aspects of OpenStack; and b) document the use of the
101OpenStack command-line clients.
102
103In addition to the guidelines above, exercise scripts MUST follow the structure
104outlined here. ``swift.sh`` is perhaps the clearest example of these guidelines.
105These scripts are executed serially by ``exercise.sh`` in testing situations.
106
107* Begin and end with a banner that stands out in a sea of script logs to aid
108 in debugging failures, particularly in automated testing situations. If the
109 end banner is not displayed, the script ended prematurely and can be assumed
110 to have failed.
111
112 ::
113
114 echo "**************************************************"
115 echo "Begin DevStack Exercise: $0"
116 echo "**************************************************"
117 ...
118 set +o xtrace
119 echo "**************************************************"
120 echo "End DevStack Exercise: $0"
121 echo "**************************************************"
122
123* The scripts will generally have the shell ``xtrace`` attribute set to display
124 the actual commands being executed, and the ``errexit`` attribute set to exit
125 the script on non-zero exit codes::
126
127 # This script exits on an error so that errors don't compound and you see
128 # only the first error that occured.
129 set -o errexit
130
131 # Print the commands being run so that we can see the command that triggers
132 # an error. It is also useful for following allowing as the install occurs.
133 set -o xtrace
134
Dean Troyer51fb4542012-03-09 22:21:59 -0600135* Settings and configuration are stored in ``exerciserc``, which must be
136 sourced after ``openrc`` or ``stackrc``::
137
138 # Import exercise configuration
139 source $TOP_DIR/exerciserc
140
Dean Troyer07c35572012-03-05 07:15:30 -0600141* There are a couple of helper functions in the common ``functions`` sub-script
142 that will check for non-zero exit codes and unset environment variables and
143 print a message and exit the script. These should be called after most client
144 commands that are not otherwise checked to short-circuit long timeouts
145 (instance boot failure, for example)::
146
147 swift post $CONTAINER
148 die_if_error "Failure creating container $CONTAINER"
149
150 FLOATING_IP=`euca-allocate-address | cut -f2`
151 die_if_not_set FLOATING_IP "Failure allocating floating IP"
152
Chmouel Boudjnah408b0092012-03-15 23:21:55 +0000153* If you want an exercise to be skipped when for example a service wasn't
154 enabled for the exercise to be run, you can exit your exercise with the
155 special exitcode 55 and it will be detected as skipped.
156
Dean Troyer07c35572012-03-05 07:15:30 -0600157* The exercise scripts should only use the various OpenStack client binaries to
158 interact with OpenStack. This specifically excludes any ``*-manage`` tools
159 as those assume direct access to configuration and databases, as well as direct
160 database access from the exercise itself.
161
162* If specific configuration needs to be present for the exercise to complete,
163 it should be staged in ``stack.sh``, or called from ``stack.sh`` (see
164 ``files/keystone_data.sh`` for an example of this).
165
166* The ``OS_*`` environment variables should be the only ones used for all
167 authentication to OpenStack clients as documented in the CLIAuth_ wiki page.
168
169.. _CLIAuth: http://wiki.openstack.org/CLIAuth
170
171* The exercise MUST clean up after itself if successful. If it is not successful,
172 it is assumed that state will be left behind; this allows a chance for developers
173 to look around and attempt to debug the problem. The exercise SHOULD clean up
174 or graciously handle possible artifacts left over from previous runs if executed
175 again. It is acceptable to require a reboot or even a re-install of DevStack
176 to restore a clean test environment.