配置验证器

https://blueprints.launchpad.net/oslo.config/+spec/oslo-validator

支持对操作员配置文件中的 oslo.config 选项进行基本级别的验证,以及潜在地在服务启动时验证选项(示例用法)。

问题描述

对于任何项目来说,拥有无效的配置文件都非常容易。

  • 无效的段落

  • 无效的选项名称

  • 已弃用的选项

  • 拼写错误

  • 高级选项的使用(警告)

  • 缺少配置的必需选项

  • 超出范围的选择的使用

  • 在配置文件中使用默认值

配置验证,以其基本形式,可以通过提供一种验证选项和配置值的方式,手动通过 CLI 以及在服务启动时(示例用法)来帮助缓解这些基本问题。操作员们已经要求这个功能一段时间了,因为选项的版本差异可能很大。

用例

作为操作员,能够在部署前验证配置是无价的,为 CI/CD 利用和手动检查提供了清晰的路径。

作为开发人员,能够为操作员提供针对项目配置文件的基本验证选项。这可以通过 shell 脚本遍历每个命名空间来实现,就像 Neutron 使用的那样,或者可以通过特定的配置验证参数来实现,例如 ironic-api –validate-config。实现方式可以根据项目进行自定义。

提议的变更

新的验证器模块将提供两种使用方式:CLI 命令和在服务启动时使用验证器的能力(示例用法)。Oslo 配置验证器将是对常见配置错误的简单检查,绝不提供关于正确配置或期望配置的意见。

对于 CLI 使用,将在 oslo.config 中添加一个新的入口点,oslo-config-validator。类似于 oslo-config-generator,操作员可以传递一个参数,–namespace,来指示他们的配置文件将要验证的应用程序命名空间。或者,可选地,操作员/开发人员可以传递 –validator-config-file,其中包含应用程序命名空间。此外,–config-file 将是一个必需的参数,用于指示配置文件的位置。理想情况下,每个项目都应该实现一个 shell 脚本工具来遍历项目使用的命名空间以进行验证。例如,以下是 Neutron 中的用法: neutron/blob/master/tools/generate_config_file_samples.sh

对于模块导入,开发人员可以使用 validator.validate 并传递一个必需的配置选项集合,以对照 oslo.config 中注册的命名空间和选项进行检查。这可以在服务启动时(示例用法)执行,在摄取配置文件后,并输出到配置的日志文件。它也可以在每个项目中用作额外的参数,例如 ironic-api –validate-config,其中配置随后被验证为单独的操作,如果未开发上述 shell 脚本。两种选项都可用,每个项目如何实现配置验证超出此规范的范围。

validator.validate 的一个用例是在服务启动时失败,其中 validate 返回 valid_configuration(bool)invalid_configuration_items(dict)。返回值可以帮助确定服务是否能够启动,方法是检查 invalid_configuration_items[‘errors’] (bool) 如果 valid_configurationfalse。这将允许开发人员通过拥有 invalid_configuration_items[‘errors’] (bool)invalid_configuration_items[‘warnings’] (bool) 分开的各自的可迭代项目列表来控制警告的抑制。

invalid_configuration_items['config_errors'] = [
    {'config_item': 'namespace', 'item_name': 'DEFULT',
     'message': 'Namespace DEFULT does not exist.'},
    {'config_item': 'option', 'item_name': 'auth_uri',
     'message': 'Option auth_uri has no value assigned.'},
]

以及配置警告

invalid_configuration_items['config_warnings'] = [
    {'config_item': 'option', 'item_name': 'auth_strategy',
     'message': 'Option is configured with the default value, not required.'},
    {'config_item': 'option', 'item_name': 'some_advanced_option',
     'message': 'Option some_advanced_option is an advanced option and may'
                'effect performance.'},
]

这些只是潜在返回的数据结构的示例,并且在实现配置验证器时可能会更改。无论如何,将返回一个错误/警告列表,以便于输出到控制台或日志。

配置验证器将报告以下差异

  • 选项不在命名空间中(错误)

  • 选项没有值(错误)

  • 选项没有值且是必需的(错误)

  • 选项值不在范围内(错误)

  • 选项值为默认值,配置中不需要(警告)

  • 选项已弃用(警告)

  • 选项是高级选项(警告)

  • 选项类型验证,例如 ‘2’ 与 2(错误)

  • 无效的配置段(错误)

  • 缺少配置段,例如 [DEFAULT](警告)

要添加的文件

  • oslo.config/oslo_config/validator.py

  • oslo.config/doc/source/validator.rst

要修改的文件

  • oslo.config/setup.cfg

备选方案

无。

Impact on Existing APIs

无。

安全影响

无。

性能影响

这可能是服务启动时的额外检查(示例用法),这可能会影响完全运行所需的时间。以最基本的形式,通过 CLI 进行手动检查不会产生性能影响。

Configuration Impact

无。

开发人员影响

无。

Testing Impact

需要额外的单元测试来涵盖验证器提供的已引发的警告和错误。

实现

负责人

主要负责人

跳过

里程碑

完成目标里程碑

ocata-1

工作项

  • 创建新模块 validator.py

  • 创建新的入口点 oslo-config-validator

  • 创建新的文档文件 validator.rst

孵化

无。

采用

很可能这个模块将在整个 OpenStack 中使用,因为它满足了操作员对复杂配置文件的需求。

oslo.config

预计 API 稳定

无。

文档影响

需要在 validator.rst 中开发额外的文档,以详细说明如何在 CLI 级别和作为模块使用验证器。

依赖项

这个额外的模块不需要任何依赖项。

参考资料

oslo.config: https://docs.openstack.org/oslo.config/latest/

neutron: https://docs.openstack.org/neutron/latest/

ironic: https://docs.openstack.org/ironic/latest/

注意

本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode