.. Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.

.. include:: ../../common.defs

.. _developer-doc-plugins:

Documenting Plugins
*******************

Plugins can provide tremendously useful functionality for users of |TS|, but it
does them little good if there are no instructions on how to use the plugins
properly. In the interest of encouraging useful documentation on all the
features available to those deploying |TS| in their infrastructure, this
section lays out a series of guidelines and offers a basic template for adding
new entries to the :ref:`admin-plugins` chapter of the :ref:`admin-guide`.

Structure
=========

Ideally, every plugin will provide documentation covering the following general
topics (preferably in top-level sections named to match):

Introduction
------------

A brief section in which the plugin's core functionality is explained in a
quickly digestible paragraph or two. For the sake of brevity, this section
should omit discussion of configuration details in favor of providing a more
10,000 foot view of the plugin features.

Purpose
-------

Why would someone want to use this particular plugin? What problems does it
solve, or what features not attainable otherwise (through core functionality or
other plugins) does it provide to an administrator or user? While not exactly a
product pitch, this is the section in which the case for using the plugin at
all should be made.

Dependencies
------------

If the plugin has external dependencies, they should be listed in full, with
the exception of items already required by a bare-bones |TS| build. If the
plugin has no unusual or non-standard dependencies, this section may be safely
omitted.

For example, there is no need to list a C++ compiler as a requirement, but if
the plugin requires OpenCL and a specific brand of GPU expansion card to
perform some wacky image transformations on cached objects - that really should
be disclosed.

If any of the dependencies are optional, that should be noted as well as the
functionality that may be missing should the dependency not be present.

Installation
------------

Detailed instructions on how to install the plugin if it is not built by
default with |TS| or requires any additional libraries, services, or
applications outside of |TS| to be present.

If the plugin is marked stable and included by default in |TS| builds, then it
may not be necessary to include any installation steps beyond noting that it is
part of the default |TS|.

Configuration
-------------

Detailed instructions on how and where to provide configuration data for the
plugin's features. It is important to use |RST| references for all mentions of
|TS| configuration variables, as well as their containing configuration files.

If configurations are generated by scripts included with the plugin source
code, those scripts should be mentioned and their usage should be shown.

Caveats (or Limitations)
------------------------

Notes about any peculiarities with the plugin, incompatibilities or strange
behaviors when used in conjunction with other features, or special
considerations for its deployment that might affect an administrator's use of
the plugin or their infrastructure's architecture.

If the plugin contains known limitations (perhaps it only works with some
protocols, can understand only some media types, or is especially
non-performant under specific configurations) they should be noted. If
possible, workarounds for these limitations should be suggested, or if none are
available that should be noted.

Examples
--------

Every plugin should aim to have at least one, complete example of its usage
beginning with its basic installation, showing a complete (and ideally working)
configuration, as well as sample output from |TS| in which the plugin's effects
may be observed.

Further Reading
---------------

Consolidated list of references to outside materials and documents which may be
relevant to the plugin, such as RFCs and white papers. If the plugin is related
to external projects, or has been the subject of benchmarks or articles, those
may be useful to list as well.

Additional Sections
===================

Not all plugins will fit perfectly within that list of sections. Some may
require additional details, or such extended discussion that it is best to
break the plugin's documentation down a bit further. In general, it is
recommended to place these additional documentation sections in between
*Configuration* and *Caveats* or *Limitations*.

This ordering permits a quick scanning of the plugin's purpose, basic method of
installation, and initial overview of its configuration before becoming mired
down in dissertation length details of every possible configuration, warning,
and trade-off that may affect deployments.

In cases where the array of configuration possibilities is extensive, it is
recommended that the initial *Configuration* section describe the most common
configuration scenario(s), while noting that there are many other possibilities
that will be covered in the sections that follow. This, it is hoped, will get
the usual case out of the way quickly for most |TS| administrators while
limiting the paralysis of choice they may face otherwise.

Documentation Template
======================

For the convenience of plugin developers, this manual includes a
:ref:`plugin documentation template <developer-doc-plugin-template>` which you
may use as a base. The template includes placeholders, with markup, for common
features of the documentation which may be relevant for your plugin. Developers
are very strongly encouraged to use this template whenever possible, as a means
of producing and maintaining a consistent format for plugin documentation.


.. _developer-doc-plugin-template:

.. note:: *to be done*
