最近在学习 OpenStack 源码时,发现有些模块(如 Ceilometer)使用了动态插件加载包 Stevedore,感觉有必要记录一下。
本文的例子基本摘录自博文 Sora–OpenStack 基础库 stevedore 试用总结,并在其基础上添加一些额外的东西(如 Stevedore Extention)。
项目结构如下:
1 | sora |
插件编写
这里的插件名为 scheduler(可以有多个)。设计 API 的一个好的实践就是定义一个抽象类作为基类(这也是 Stevedore 官方样例的做法):
1 | # sora/scheduler/base.py |
接下来的两个继承类如下:
1 | # sora/scheduler/simple.py |
1 | # sora/scheduler/memory.py |
setup.py
之前还想过要写下跟 Setuptools 相关的文章,但看了一下几篇文章,感觉都没必要了,太赞了:
setup.py 文件内容如下:
1 | # sora/setup.py |
安装包
首先进入 sora 根目录,安装下插件:python setup.py install
。安装效果如下图所示:
测试
下边用几种方式来测试该插件。
原始方式
1 | # sora/tests/test-ori-usage.py |
DriverManager
我们可以使用 DriverManager 来一个个加载插件:
1 | # sora/tests/test.py |
ExtensionManager
Stevedore 的扩展功能允许我们同时加载多个插件(在插件很多的时候优势很明显):
1 | # sora/tests/test-extension.py |