storyboard/doc/source/extending/plugin_cron.rst
Michael Krotscheck 65c2c4418c Plugins may now register cron workers.
This adds a crontab plugin hook to StoryBoard, allowing a plugin
developer to run periodic events. Example use cases include:
- Summary emails.
- Periodic report generation.
- Synchronization check points.

Plugins are expected to provide their own execution interval and
configuration indicator. The management of cron workers is
implemented as its own cron plugin as a sample, and unit tests
for all components are provided.

Change-Id: I3aa466e183f1faede9493123510ee11feb55e7aa
2014-12-17 13:20:54 -08:00

89 lines
3.2 KiB
ReStructuredText

==================================
Extending StoryBoard: Cron Plugins
==================================
Overview
--------
StoryBoard requires the occasional periodic task, to support things like
cleanup and maintenance. It does this by directly managing its own crontab
entries, and extension hooks are available for you to add your own
functionality. Crontab entries are checked every 5 minutes,
with new entries added and old/orphaned entries removed. Note that this
monitoring is only active while the storyboard api is running. As soon as the
API is shut down, all cron plugins are shut down as well.
When your plugin is executed, it is done so via `storyboard-cron` which
bootstraps configuration and storyboard. It does not maintain state
between runs, and terminates as soon as your code finishes.
We DO NOT recommend you use this extension mechanism to create long running
processes. Upon the execution of your plugin's `run()` method,
you will be provided with the time it was last executed, as well as the current
timestamp. Please limit your plugin's execution scope to events that occurred
within that time frame, and exit after.
Cron Plugin Quickstart
----------------------
Step 1: Create a new python project using setuptools
####################################################
This is left as an exercise to the reader. Don't forget to include storyboard
as a requirement.
Step 2: Implement your plugin
#############################
Add a registered entry point in your plugin's `setup.cfg`. The name should be
reasonably unique::
[entry_points]
storyboard.plugin.cron =
my-plugin-cron = my.namespace.plugin:CronWorker
Then, implement your plugin by extending `CronPluginBase`. You may register
your own configuration groups, please see
`oslo.config <http://docs.openstack.org/developer/oslo.config/api/oslo.config.cfg.html>`_
for more details.::
from storyboard.plugin.cron.base import CronPluginBase
class MyCronPlugin(CronPluginBase):
def enabled(self):
'''This method should return whether the plugin is enabled and
configured. It has access to self.config, which is a reference to
storyboard's global configuration object.
'''
return True
def interval(self):
'''This method should return the crontab interval for this
plugin's execution schedule. It is used verbatim.
'''
return "? * * * *"
def run(self, start_time, end_time):
'''Execute your plugin. The provided parameters are the start and
end times of the time window for which this particular execution
is responsible.
This particular implementation simply deletes oauth tokens that
are older than one week.
'''
lastweek = datetime.utcnow() - timedelta(weeks=1)
query = api_base.model_query(AccessToken)
query = query.filter(AccessToken.expires_at < lastweek)
query.delete()
Step 3: Install your plugin
###########################
Finally, install your plugin, which may require you switch into storyboard's
virtual environment. Pip should automatically register your plugin::
pip install my-storyboard-plugin