blob: c4ed2285cb621cd1a70df8e0b8435bc7a6e8c4e7 [file] [log] [blame]
Dean Troyer0986a7b2014-10-29 22:08:13 -05001=======
2Plugins
3=======
Sean M. Collins09e550c2014-10-21 11:40:08 -04004
5DevStack has a couple of plugin mechanisms to allow easily adding
6support for additional projects and features.
7
8Extras.d Hooks
Sean Dague32930462014-11-18 06:51:16 -05009==============
Sean M. Collins09e550c2014-10-21 11:40:08 -040010
Dean Troyerea3cdfa2014-11-08 08:29:16 -060011These hooks are an extension of the service calls in
12``stack.sh`` at specific points in its run, plus ``unstack.sh`` and
Sean M. Collins09e550c2014-10-21 11:40:08 -040013``clean.sh``. A number of the higher-layer projects are implemented in
14DevStack using this mechanism.
15
16The script in ``extras.d`` is expected to be mostly a dispatcher to
17functions in a ``lib/*`` script. The scripts are named with a
18zero-padded two digits sequence number prefix to control the order that
YAMAMOTO Takashib1a153e2015-02-09 12:43:12 +090019the scripts are called, and with a suffix of ``.sh``. DevStack reserves
Sean M. Collins09e550c2014-10-21 11:40:08 -040020for itself the sequence numbers 00 through 09 and 90 through 99.
21
22Below is a template that shows handlers for the possible command-line
23arguments:
24
25::
26
27 # template.sh - DevStack extras.d dispatch script template
28
29 # check for service enabled
30 if is_service_enabled template; then
31
32 if [[ "$1" == "source" ]]; then
33 # Initial source of lib script
34 source $TOP_DIR/lib/template
35 fi
36
37 if [[ "$1" == "stack" && "$2" == "pre-install" ]]; then
38 # Set up system services
39 echo_summary "Configuring system services Template"
40 install_package cowsay
41
42 elif [[ "$1" == "stack" && "$2" == "install" ]]; then
43 # Perform installation of service source
44 echo_summary "Installing Template"
45 install_template
46
47 elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
48 # Configure after the other layer 1 and 2 services have been configured
49 echo_summary "Configuring Template"
50 configure_template
51
52 elif [[ "$1" == "stack" && "$2" == "extra" ]]; then
53 # Initialize and start the template service
54 echo_summary "Initializing Template"
55 ##init_template
56 fi
57
58 if [[ "$1" == "unstack" ]]; then
59 # Shut down template services
60 # no-op
61 :
62 fi
63
64 if [[ "$1" == "clean" ]]; then
65 # Remove state and transient data
66 # Remember clean.sh first calls unstack.sh
67 # no-op
68 :
69 fi
70 fi
71
72The arguments are:
73
74- **source** - Called by each script that utilizes ``extras.d`` hooks;
75 this replaces directly sourcing the ``lib/*`` script.
76- **stack** - Called by ``stack.sh`` three times for different phases
77 of its run:
78
79 - **pre-install** - Called after system (OS) setup is complete and
80 before project source is installed.
81 - **install** - Called after the layer 1 and 2 projects source and
82 their dependencies have been installed.
83 - **post-config** - Called after the layer 1 and 2 services have
84 been configured. All configuration files for enabled services
85 should exist at this point.
86 - **extra** - Called near the end after layer 1 and 2 services have
87 been started. This is the existing hook and has not otherwise
88 changed.
89
90- **unstack** - Called by ``unstack.sh`` before other services are shut
91 down.
92- **clean** - Called by ``clean.sh`` before other services are cleaned,
93 but after ``unstack.sh`` has been called.
94
Sean Dague2c65e712014-12-18 09:44:56 -050095
96Externally Hosted Plugins
97=========================
98
99Based on the extras.d hooks, DevStack supports a standard mechansim
100for including plugins from external repositories. The plugin interface
101assumes the following:
102
103An external git repository that includes a ``devstack/`` top level
104directory. Inside this directory there can be 2 files.
105
106- ``settings`` - a file containing global variables that will be
107 sourced very early in the process. This is helpful if other plugins
108 might depend on this one, and need access to global variables to do
109 their work.
Sean Dague33127a12015-02-09 15:17:27 -0500110
111 Your settings should include any ``enable_service`` lines required
112 by your plugin. This is especially important if you are kicking off
113 services using ``run_process`` as it only works with enabled
114 services.
115
Ian Wienand51c48d42015-03-25 06:26:03 +1100116 Be careful to allow users to override global-variables for
117 customizing their environment. Usually it is best to provide a
118 default value only if the variable is unset or empty; e.g. in bash
119 syntax ``FOO=${FOO:-default}``.
120
Sean Dague2c65e712014-12-18 09:44:56 -0500121- ``plugin.sh`` - the actual plugin. It will be executed by devstack
122 during it's run. The run order will be done in the registration
123 order for these plugins, and will occur immediately after all in
124 tree extras.d dispatch at the phase in question. The plugin.sh
Sean Dague33127a12015-02-09 15:17:27 -0500125 looks like the extras.d dispatcher above.
Sean Dague2c65e712014-12-18 09:44:56 -0500126
127Plugins are registered by adding the following to the localrc section
128of ``local.conf``.
129
130They are added in the following format::
131
Sean Dague33127a12015-02-09 15:17:27 -0500132 [[local|localrc]]
Sean Dague2c65e712014-12-18 09:44:56 -0500133 enable_plugin <NAME> <GITURL> [GITREF]
134
135- ``name`` - an arbitrary name. (ex: glustfs, docker, zaqar, congress)
136- ``giturl`` - a valid git url that can be cloned
137- ``gitref`` - an optional git ref (branch / ref / tag) that will be
138 cloned. Defaults to master.
139
140An example would be as follows::
141
Sean Dague33127a12015-02-09 15:17:27 -0500142 enable_plugin ec2api git://git.openstack.org/stackforge/ec2api
Sean Dague2c65e712014-12-18 09:44:56 -0500143
Ian Wienanddb1152c2015-01-13 10:18:49 +1100144Plugins for gate jobs
145---------------------
146
147All OpenStack plugins that wish to be used as gate jobs need to exist
148in OpenStack's gerrit. Both ``openstack`` namespace and ``stackforge``
149namespace are fine. This allows testing of the plugin as well as
150provides network isolation against upstream git repository failures
151(which we see often enough to be an issue).
152
153Ideally plugins will be implemented as ``devstack`` directory inside
154the project they are testing. For example, the stackforge/ec2-api
155project has it's pluggin support in it's tree.
156
157In the cases where there is no "project tree" per say (like
158integrating a backend storage configuration such as ceph or glusterfs)
159it's also allowed to build a dedicated
160``stackforge/devstack-plugin-FOO`` project to house the plugin.
161
162Note jobs must not require cloning of repositories during tests.
163Tests must list their repository in the ``PROJECTS`` variable for
164`devstack-gate
165<https://git.openstack.org/cgit/openstack-infra/devstack-gate/tree/devstack-vm-gate-wrap.sh>`_
166for the repository to be available to the test. Further information
167is provided in the project creator's guide.
168
Sean M. Collins09e550c2014-10-21 11:40:08 -0400169Hypervisor
Sean Dague32930462014-11-18 06:51:16 -0500170==========
Sean M. Collins09e550c2014-10-21 11:40:08 -0400171
172Hypervisor plugins are fairly new and condense most hypervisor
173configuration into one place.
174
175The initial plugin implemented was for Docker support and is a useful
176template for the required support. Plugins are placed in
177``lib/nova_plugins`` and named ``hypervisor-<name>`` where ``<name>`` is
178the value of ``VIRT_DRIVER``. Plugins must define the following
179functions:
180
181- ``install_nova_hypervisor`` - install any external requirements
182- ``configure_nova_hypervisor`` - make configuration changes, including
183 those to other services
184- ``start_nova_hypervisor`` - start any external services
185- ``stop_nova_hypervisor`` - stop any external services
186- ``cleanup_nova_hypervisor`` - remove transient data and cache
Adam Gandelman7ca90cd2015-03-04 17:25:07 -0800187
188System Packages
189===============
190
191Devstack provides a framework for getting packages installed at an early
192phase of its execution. This packages may be defined in a plugin as files
193that contain new-line separated lists of packages required by the plugin
194
195Supported packaging systems include apt and yum across multiple distributions.
196To enable a plugin to hook into this and install package dependencies, packages
197may be listed at the following locations in the top-level of the plugin
198repository:
199
200- ``./devstack/files/debs/$plugin_name`` - Packages to install when running
201 on Ubuntu, Debian or Linux Mint.
202
203- ``./devstack/files/rpms/$plugin_name`` - Packages to install when running
204 on Red Hat, Fedora, CentOS or XenServer.
205
206- ``./devstack/files/rpms-suse/$plugin_name`` - Packages to install when
207 running on SUSE Linux or openSUSE.