允许 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 目前不在大型帐篷内。

提议的变更

以下是类图,概述了为了支持添加配置选项而需要进行的更改

../../../_images/class_diagram_plugin_parameters.png

此外,当前所有插件都由 DefaultLoader 在其 load() 方法被调用时实例化。应该改进此方法,以便它还可以使用每个插件类都应实现的抽象类方法 get_config_opts() 获取插件提供的配置。后者需要是一个类方法,以便当 Watcher 收集每个插件的配置时,无需实例化它们。

../../../_images/sequence_diagram_plugin_parameters_load_plugin_parameters.png

为了向管理员公开这些插件参数,我们还必须在使用配置文件生成器时自动发现它们,该生成器由 Watcher 文档的生成或使用 tox -e config 命令手动触发。

../../../_images/sequence_diagram_plugin_parameters_generate_config.png

为了能够实现上述序列图描述的过程,以下是需要进行的更改的总结

  • 让每个插件提供一个名为 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 抽象类继承

    • BaseStrategy

    • BaseAction

    • BasePlanner

    • BaseWorkflowFlowEngine

  • 对于上述每个类,提供 get_config_opts() 的默认实现,该实现返回一个空列表,这应该是默认行为。

  • 增强 DefaultLoader 类的 load() 方法,以便现在也加载与我们要加载的插件相关的配置选项,并在实例化时将它们注入到加载的插件中。

依赖项

测试

  • 添加必要的单元测试来覆盖此蓝图引入的新功能

  • 更新损坏的单元测试

文档影响

更新所有插件实现文档,以说明现在可以通过 get_config_opts() 方法指定配置选项。

参考资料

历史