Guestagent 配置管理器¶
Launchpad Blueprint: https://blueprints.launchpad.net/trove/+spec/guestagent-configuration-manager
问题描述¶
目前每个数据存储都需要实现一种策略来维护其配置文件,包括解析、更新属性、保存和管理覆盖的功能。随着支持的数据存储数量增加,这种方法导致生产和测试代码库中大量重复。
提议的变更¶
通过实现一个管理器类来促进代码重用,该类可以被所有 guestagent 用于管理其配置文件和覆盖。
补丁集将包含四个主要特性。
用于配置文件的序列化和反序列化的编解码器。
这些编解码器将负责将 Python 结构(字典)解析为适当的序列化形式(参见下面的简单示例)。
INI 样式的文件(序列化形式)
[section_1] key1 = value1 key2 = value2 ... [section_2] key1 = value1 key2 = value2 ...上述内容的字典表示形式(反序列化形式)
{'section_1': {'key1': 'value1', 'key2': 'value2', ...}, 'section_2': {'key1': 'value1', 'key2': 'value2', ...} ... }将实现适用于 Trove 中当前存在的常见配置格式的编解码器。
- 这些包括
INI 样式格式:参见上面的示例
YAML 格式:有关 Python 表示形式的示例,请参见 http://pyyaml.org/wiki/PyYAMLDocumentation。
属性格式
序列化形式
key1 k1arg1 k1arg2 ... k1argN key2 k2arg1 k2arg2 ... k2argN key3 k3arg1 k3arg2 ... key3 k3arg3 k3arg4 ...上述内容的字典表示形式(反序列化形式)
{'key1': [k1arg1, k1arg2 ... k1argN], 'key2': [k2arg1, k2arg2 ... k2argN], 'key3': [[k3arg1, k3arg2, ...], [k3arg3, k3arg4, ...]]}使用给定编解码器读取和写入的函数。
一个“write”函数将给定字典的序列化形式保存到文件中。应用于文件上的“read”函数将生成与先前步骤中写入的字典结构相同的结构。write 函数将在提供可选的“as_root”关键字时使用超级用户权限写入文件。这将通过首先写入临时文件,然后使用现有的操作系统调用将其移动到指定位置来实现。
配置管理器。
ConfigurationManager 将负责管理数据存储配置文件。其基本功能包括读取和写入配置文件以及更新或检索当前值。它还将负责验证用户输入和请求。当提供覆盖策略(如下所示)时,它允许用户管理配置覆盖。
配置管理器将负责强制执行应用覆盖的数量限制(当前一次只能对实例应用一个覆盖)。
常见的覆盖策略。
一个覆盖策略对象,负责在配置管理器中管理覆盖(如果提供)。
它将实现以下函数:
apply 将更新的值应用于配置文件的当前版本。
remove 删除上次应用的覆盖,并有效地恢复配置文件的先前版本。
此补丁集提供的策略将是
滚动覆盖策略
一种适用于不支持在其配置文件中包含 includes 的应用程序的策略。它在应用更新到配置文件的同时,会维护先前版本的备份,以便在删除覆盖时可以恢复。
应用过程
将当前配置文件的备份副本保存到已知的可配置位置。
加载并解析当前配置文件为字典(使用适当的编解码器)。
使用覆盖的值更新字典。
使用字典的序列化形式覆盖配置文件(使用相同的编解码器)。
删除过程
将适当的备份版本移动到当前配置文件之上。
导入覆盖策略
一种适用于支持在其配置文件中导入的 datastore 的策略(如 MySQL)。覆盖存储在已知的可配置目录中,然后由基础配置文件导入,而基础配置文件本身保持不变。
应用过程
将覆盖字典的序列化形式(使用适当的编解码器)存储在导入的位置。
删除过程
从导入的位置删除适当的文件。
配置¶
无
数据库¶
无
公共 API¶
无
公共 API 安全¶
无
Python API¶
无
CLI (python-troveclient)¶
无
内部 API¶
无
Guest Agent¶
受影响的文件将包括
guestagent/common/operating_system.py:I/O 函数
common/stream_codecs.py:编解码器的实现。
common/configurations.py:在配置解析器中重用编解码器。
guestagent/common/configuration.py:配置管理器和覆盖策略的实现。
备选方案¶
无
实现¶
负责人¶
Petr Malik <pmalik@tesora.com>
里程碑¶
Liberty-1
工作项¶
实现用于序列化和反序列化常见配置文件的编解码器。
实现使用给定编解码器读取和写入文件的函数。
实现配置管理器。
实现常见的覆盖策略。
为上述功能添加单元测试。
升级影响¶
无
依赖项¶
当前实现规避了 Python 2.6 中 ConfigParser 的限制。OpenStack 不再支持此版本的 Python,并且 Trove gate 测试在 Python 2.7 上运行。因此,我们可以删除兼容性要求,并在现有代码库中充分利用 Python 2.7 中的 ConfigParser。
测试¶
将添加单元测试以覆盖非平凡的代码路径。
文档影响¶
无
参考资料¶
无