Add plugin interface documentation
This commit starts the docs section on creating and using tempest plugins. It describes how to create a plugin class, an entrypoint, and a recommended dir structure. As well notes how to use tempest and tempest-lib in creating a plugin. It'll likely be expanded in the future as the plugin interface evolves. Partially Implements bp external-plugin-interface Change-Id: If2e0c47d0a719d869a3301ddbca07495c81cc498
This commit is contained in:
parent
83a19aa4b1
commit
3a851dc08b
|
@ -10,6 +10,7 @@ Contents:
|
|||
overview
|
||||
HACKING
|
||||
REVIEWING
|
||||
plugin
|
||||
|
||||
------------
|
||||
Field Guides
|
||||
|
|
|
@ -0,0 +1,120 @@
|
|||
=============================
|
||||
Tempest Test Plugin Interface
|
||||
=============================
|
||||
|
||||
Tempest has an external test plugin interface which enables anyone to integrate
|
||||
an external test suite as part of a tempest run. This will let any project
|
||||
leverage being run with the rest of the tempest suite while not requiring the
|
||||
tests live in the tempest tree.
|
||||
|
||||
Creating a plugin
|
||||
=================
|
||||
|
||||
Creating a plugin is fairly straightforward and doesn't require much additional
|
||||
effort on top of creating a test suite using tempest-lib. One thing to note with
|
||||
doing this is that the interfaces exposed by tempest are not considered stable
|
||||
(with the exception of configuration variables which ever effort goes into
|
||||
ensuring backwards compatibility). You should not need to import anything from
|
||||
tempest itself except where explicitly noted. If there is an interface from
|
||||
tempest that you need to rely on in your plugin it likely needs to be migrated
|
||||
to tempest-lib. In that situation, file a bug, push a migration patch, etc. to
|
||||
expedite providing the interface in a reliable manner.
|
||||
|
||||
Plugin Class
|
||||
------------
|
||||
|
||||
To provide tempest with all the required information it needs to be able to run
|
||||
your plugin you need to create a plugin class which tempest will load and call
|
||||
to get information when it needs. To simplify creating this tempest provides an
|
||||
abstract class that should be used as the parent for your plugin. To use this
|
||||
you would do something like the following::
|
||||
|
||||
from tempest.test_discover import plugin
|
||||
|
||||
class MyPlugin(plugin.TempestPlugin):
|
||||
|
||||
Then you need to ensure you locally define all of the methods in the abstract
|
||||
class, you can refer to the api doc below for a reference of what that entails.
|
||||
|
||||
Also, note eventually this abstract class will likely live in tempest-lib, when
|
||||
that migration occurs a deprecation shim will be added to tempest so as to not
|
||||
break any existing plugins. But, when that occurs migrating to using tempest-lib
|
||||
as the source for the abstract class will be prudent.
|
||||
|
||||
Abstract Plugin Class
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. autoclass:: tempest.test_discover.plugins.TempestPlugin
|
||||
:members:
|
||||
|
||||
Entry Point
|
||||
-----------
|
||||
|
||||
Once you've created your plugin class you need to add an entry point to your
|
||||
project to enable tempest to find the plugin. The entry point must be added
|
||||
to the "tempest.test_plugins" namespace.
|
||||
|
||||
If you are using pbr this is fairly straightforward, in the setup.cfg just add
|
||||
something like the following::
|
||||
|
||||
[entry_points]
|
||||
tempest.test_plugins =
|
||||
plugin_name = module.path:PluginClass
|
||||
|
||||
Plugin Structure
|
||||
----------------
|
||||
|
||||
While there are no hard and fast rules for the structure a plugin, there are
|
||||
basically no constraints on what the plugin looks like as long as the 2 steps
|
||||
above are done. However, there are some recommended patterns to follow to make
|
||||
it easy for people to contribute and work with your plugin. For example, if you
|
||||
create a directory structure with something like::
|
||||
|
||||
plugin_dir/
|
||||
config.py
|
||||
plugin.py
|
||||
tests/
|
||||
api/
|
||||
scenario/
|
||||
services/
|
||||
client.py
|
||||
|
||||
That will mirror what people expect from tempest. The file
|
||||
|
||||
* **config.py**: contains any plugin specific configuration variables
|
||||
* **plugin.py**: contains the plugin class used for the entry point
|
||||
* **tests**: the directory where test discovery will be run, all tests should
|
||||
be under this dir
|
||||
* **services**: where the plugin specific service clients are
|
||||
|
||||
Additionally, when you're creating the plugin you likely want to follow all
|
||||
of the tempest developer and reviewer documentation to ensure that the tests
|
||||
being added in the plugin act and behave like the rest of tempest.
|
||||
|
||||
Using Plugins
|
||||
=============
|
||||
|
||||
Tempest will automatically discover any installed plugins when it is run. So by
|
||||
just installing the python packages which contain your plugin you'll be using
|
||||
them with tempest, nothing else is really required.
|
||||
|
||||
However, you should take care when installing plugins. By their very nature
|
||||
there are no guarantees when running tempest with plugins enabled about the
|
||||
quality of the plugin. Additionally, while there is no limitation on running
|
||||
with multiple plugins it's worth noting that poorly written plugins might not
|
||||
properly isolate their tests which could cause unexpected cross interactions
|
||||
between plugins.
|
||||
|
||||
Notes for using plugins with virtualenvs
|
||||
----------------------------------------
|
||||
|
||||
When using a tempest inside a virtualenv (like when running under tox) you have
|
||||
to ensure that the package that contains your plugin is either installed in the
|
||||
venv too or that you have system site-packages enabled. The virtualenv will
|
||||
isolate the tempest install from the rest of your system so just installing the
|
||||
plugin package on your system and then running tempest inside a venv will not
|
||||
work.
|
||||
|
||||
Tempest also exposes a tox job, all-plugin, which will setup a tox virtualenv
|
||||
with system site-packages enabled. This will let you leverage tox without
|
||||
requiring to manually install plugins in the tox venv before running tests.
|
Loading…
Reference in New Issue