65c2c4418c
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
89 lines
3.2 KiB
ReStructuredText
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
|