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
3.2 KiB
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 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