blob: 5a610634b438471b8460667bcd944ed9c78e013c [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
Sean Dague2c65e712014-12-18 09:44:56 -0500116- ``plugin.sh`` - the actual plugin. It will be executed by devstack
117 during it's run. The run order will be done in the registration
118 order for these plugins, and will occur immediately after all in
119 tree extras.d dispatch at the phase in question. The plugin.sh
Sean Dague33127a12015-02-09 15:17:27 -0500120 looks like the extras.d dispatcher above.
Sean Dague2c65e712014-12-18 09:44:56 -0500121
122Plugins are registered by adding the following to the localrc section
123of ``local.conf``.
124
125They are added in the following format::
126
Sean Dague33127a12015-02-09 15:17:27 -0500127 [[local|localrc]]
Sean Dague2c65e712014-12-18 09:44:56 -0500128 enable_plugin <NAME> <GITURL> [GITREF]
129
130- ``name`` - an arbitrary name. (ex: glustfs, docker, zaqar, congress)
131- ``giturl`` - a valid git url that can be cloned
132- ``gitref`` - an optional git ref (branch / ref / tag) that will be
133 cloned. Defaults to master.
134
135An example would be as follows::
136
Sean Dague33127a12015-02-09 15:17:27 -0500137 enable_plugin ec2api git://git.openstack.org/stackforge/ec2api
Sean Dague2c65e712014-12-18 09:44:56 -0500138
Ian Wienanddb1152c2015-01-13 10:18:49 +1100139Plugins for gate jobs
140---------------------
141
142All OpenStack plugins that wish to be used as gate jobs need to exist
143in OpenStack's gerrit. Both ``openstack`` namespace and ``stackforge``
144namespace are fine. This allows testing of the plugin as well as
145provides network isolation against upstream git repository failures
146(which we see often enough to be an issue).
147
148Ideally plugins will be implemented as ``devstack`` directory inside
149the project they are testing. For example, the stackforge/ec2-api
150project has it's pluggin support in it's tree.
151
152In the cases where there is no "project tree" per say (like
153integrating a backend storage configuration such as ceph or glusterfs)
154it's also allowed to build a dedicated
155``stackforge/devstack-plugin-FOO`` project to house the plugin.
156
157Note jobs must not require cloning of repositories during tests.
158Tests must list their repository in the ``PROJECTS`` variable for
159`devstack-gate
160<https://git.openstack.org/cgit/openstack-infra/devstack-gate/tree/devstack-vm-gate-wrap.sh>`_
161for the repository to be available to the test. Further information
162is provided in the project creator's guide.
163
Sean M. Collins09e550c2014-10-21 11:40:08 -0400164Hypervisor
Sean Dague32930462014-11-18 06:51:16 -0500165==========
Sean M. Collins09e550c2014-10-21 11:40:08 -0400166
167Hypervisor plugins are fairly new and condense most hypervisor
168configuration into one place.
169
170The initial plugin implemented was for Docker support and is a useful
171template for the required support. Plugins are placed in
172``lib/nova_plugins`` and named ``hypervisor-<name>`` where ``<name>`` is
173the value of ``VIRT_DRIVER``. Plugins must define the following
174functions:
175
176- ``install_nova_hypervisor`` - install any external requirements
177- ``configure_nova_hypervisor`` - make configuration changes, including
178 those to other services
179- ``start_nova_hypervisor`` - start any external services
180- ``stop_nova_hypervisor`` - stop any external services
181- ``cleanup_nova_hypervisor`` - remove transient data and cache
Adam Gandelman7ca90cd2015-03-04 17:25:07 -0800182
183System Packages
184===============
185
186Devstack provides a framework for getting packages installed at an early
187phase of its execution. This packages may be defined in a plugin as files
188that contain new-line separated lists of packages required by the plugin
189
190Supported packaging systems include apt and yum across multiple distributions.
191To enable a plugin to hook into this and install package dependencies, packages
192may be listed at the following locations in the top-level of the plugin
193repository:
194
195- ``./devstack/files/debs/$plugin_name`` - Packages to install when running
196 on Ubuntu, Debian or Linux Mint.
197
198- ``./devstack/files/rpms/$plugin_name`` - Packages to install when running
199 on Red Hat, Fedora, CentOS or XenServer.
200
201- ``./devstack/files/rpms-suse/$plugin_name`` - Packages to install when
202 running on SUSE Linux or openSUSE.