允许 Watcher 插件的开发者添加特定参数¶
https://blueprints.launchpad.net/watcher/+spec/plugins-parameters
在 Watcher 中,可以部署和配置新的策略、动作、规划器等,并将每个“插件”关联到 Python 类,而无需重新部署 Watcher 的新版本。
然而,应该能够根据 OpenStack 集群的配置或 Watcher 运行的一些行为(例如,超时、权重等)传递一些额外的参数。
因此,我们应该赋予开发者在插件上添加一些参数的能力,这些参数取决于 OpenStack 集群的配置。
问题描述¶
目前,开发者实现的每个插件在实例化之前都作为普通的 Python 类加载。因此,这意味着 Watcher 不会传递任何超出硬编码参数之外的内容。所以,如果开发者当前想要定义一组特定于其自身插件的配置选项,他/她必须手动声明它们。这种做法会带来以下问题:
缺乏声明配置选项的标准方式会增加管理员配置 Watcher 的难度
生成的配置文件会缺少这些参数,这将进一步增加配置的复杂性。
如何在不查看代码的情况下找到这些参数?
每个插件开发者都需要编写相同的逻辑来声明和获取这些选项。
因此,Watcher 应该提供一种简化声明和获取额外选项的过程的方法,这些选项取决于 OpenStack 集群的配置或 Watcher 运行的一些行为(例如,超时、权重、工作线程等),同时从管理员的角度保持简单。
因此,我们应该向开发者提供一种标准方式来声明和获取配置选项,以便管理员生成 Watcher 配置示例文件时,其中包含当前可用的插件的配置选项。
用例¶
作为开发者,我希望能够为我的插件指定一组配置选项,以便允许管理员根据 OpenStack 集群的配置来调整/优化我的插件的行为。
作为管理员,我希望能够访问和修改所有可用插件的配置选项,以便能够根据我的 OpenStack 集群的需求来调整/优化它们的行为。
作为管理员,我希望能够生成一个包含每个可用插件提供的选项的配置文件,以便我能够在不查看代码库的情况下了解如何使用每个插件。
项目优先级¶
不相关,因为 Watcher 目前不在大型帐篷内。
提议的变更¶
以下是类图,概述了为了支持添加配置选项而需要进行的更改
此外,当前所有插件都由 DefaultLoader 在其 load() 方法被调用时实例化。应该改进此方法,以便它还可以使用每个插件类都应实现的抽象类方法 get_config_opts() 获取插件提供的配置。后者需要是一个类方法,以便当 Watcher 收集每个插件的配置时,无需实例化它们。
为了向管理员公开这些插件参数,我们还必须在使用配置文件生成器时自动发现它们,该生成器由 Watcher 文档的生成或使用 tox -e config 命令手动触发。
为了能够实现上述序列图描述的过程,以下是需要进行的更改的总结
让每个插件提供一个名为
get_config_opts()的类方法,该方法将定义其所有配置选项。更新
list_opts()函数,以便它还可以从所有可用插件收集配置选项,以便通过tox -e config命令生成配置文件时将其包含在配置示例文件中。
然后,管理员将需要根据任何给定 OpenStack 集群的要求来调整此配置示例文件。
备选方案¶
与其使用 Loadable 抽象类,不如采用约定。实际上,主要解决方案依赖于定义 get_config_opts() 方法的 Loadable 抽象基类。但是,我们可以使用鸭子类型来表示,按照约定,每个插件都应该实现一个 get_config_opts(),而无需在代码中强制执行。这种替代方案意味着更少的代码,但对于插件开发者来说也更容易出错。
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
将向 Watcher 配置文件添加新的配置部分和选项。因此,管理员应该了解它们。这也意味着应该更新文档,以鼓励插件开发者为声明的每个配置选项提供详细的描述。
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
vincent-francoise
- 其他贡献者
david-tardivel
工作项¶
实现
Loadable抽象类添加一个名为
get_config_opts()的抽象类方法,该方法应返回一个oslo_config.cfg.Opt实例列表。
让以下类从
Loadable抽象类继承BaseStrategyBaseActionBasePlannerBaseWorkflowFlowEngine
对于上述每个类,提供
get_config_opts()的默认实现,该实现返回一个空列表,这应该是默认行为。增强
DefaultLoader类的load()方法,以便现在也加载与我们要加载的插件相关的配置选项,并在实例化时将它们注入到加载的插件中。
依赖项¶
测试¶
添加必要的单元测试来覆盖此蓝图引入的新功能
更新损坏的单元测试
文档影响¶
更新所有插件实现文档,以说明现在可以通过 get_config_opts() 方法指定配置选项。
参考资料¶
无
历史¶
无