blob: 0217d094578b497da1f936e0c23753639868417b [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
19the scripts are called, and with a suffix of ``.sh``. DevSack reserves
20for 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.
110- ``plugin.sh`` - the actual plugin. It will be executed by devstack
111 during it's run. The run order will be done in the registration
112 order for these plugins, and will occur immediately after all in
113 tree extras.d dispatch at the phase in question. The plugin.sh
114 looks like the extras.d dispatcher above **except** it should not
115 include the is_service_enabled conditional. All external plugins are
116 always assumed to be enabled.
117
118Plugins are registered by adding the following to the localrc section
119of ``local.conf``.
120
121They are added in the following format::
122
123 enable_plugin <NAME> <GITURL> [GITREF]
124
125- ``name`` - an arbitrary name. (ex: glustfs, docker, zaqar, congress)
126- ``giturl`` - a valid git url that can be cloned
127- ``gitref`` - an optional git ref (branch / ref / tag) that will be
128 cloned. Defaults to master.
129
130An example would be as follows::
131
132 enable_plugin glusterfs https://github.com/sdague/devstack-plugins glusterfs
133
Ian Wienanddb1152c2015-01-13 10:18:49 +1100134Plugins for gate jobs
135---------------------
136
137All OpenStack plugins that wish to be used as gate jobs need to exist
138in OpenStack's gerrit. Both ``openstack`` namespace and ``stackforge``
139namespace are fine. This allows testing of the plugin as well as
140provides network isolation against upstream git repository failures
141(which we see often enough to be an issue).
142
143Ideally plugins will be implemented as ``devstack`` directory inside
144the project they are testing. For example, the stackforge/ec2-api
145project has it's pluggin support in it's tree.
146
147In the cases where there is no "project tree" per say (like
148integrating a backend storage configuration such as ceph or glusterfs)
149it's also allowed to build a dedicated
150``stackforge/devstack-plugin-FOO`` project to house the plugin.
151
152Note jobs must not require cloning of repositories during tests.
153Tests must list their repository in the ``PROJECTS`` variable for
154`devstack-gate
155<https://git.openstack.org/cgit/openstack-infra/devstack-gate/tree/devstack-vm-gate-wrap.sh>`_
156for the repository to be available to the test. Further information
157is provided in the project creator's guide.
158
Sean M. Collins09e550c2014-10-21 11:40:08 -0400159Hypervisor
Sean Dague32930462014-11-18 06:51:16 -0500160==========
Sean M. Collins09e550c2014-10-21 11:40:08 -0400161
162Hypervisor plugins are fairly new and condense most hypervisor
163configuration into one place.
164
165The initial plugin implemented was for Docker support and is a useful
166template for the required support. Plugins are placed in
167``lib/nova_plugins`` and named ``hypervisor-<name>`` where ``<name>`` is
168the value of ``VIRT_DRIVER``. Plugins must define the following
169functions:
170
171- ``install_nova_hypervisor`` - install any external requirements
172- ``configure_nova_hypervisor`` - make configuration changes, including
173 those to other services
174- ``start_nova_hypervisor`` - start any external services
175- ``stop_nova_hypervisor`` - stop any external services
176- ``cleanup_nova_hypervisor`` - remove transient data and cache