Guestagent 配置管理器

Launchpad Blueprint: https://blueprints.launchpad.net/trove/+spec/guestagent-configuration-manager

问题描述

目前每个数据存储都需要实现一种策略来维护其配置文件,包括解析、更新属性、保存和管理覆盖的功能。随着支持的数据存储数量增加,这种方法导致生产和测试代码库中大量重复。

提议的变更

通过实现一个管理器类来促进代码重用,该类可以被所有 guestagent 用于管理其配置文件和覆盖。

补丁集将包含四个主要特性。

  1. 用于配置文件的序列化和反序列化的编解码器。

    这些编解码器将负责将 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, ...]]}
      
  2. 使用给定编解码器读取和写入的函数。

    一个“write”函数将给定字典的序列化形式保存到文件中。应用于文件上的“read”函数将生成与先前步骤中写入的字典结构相同的结构。write 函数将在提供可选的“as_root”关键字时使用超级用户权限写入文件。这将通过首先写入临时文件,然后使用现有的操作系统调用将其移动到指定位置来实现。

  3. 配置管理器。

    ConfigurationManager 将负责管理数据存储配置文件。其基本功能包括读取和写入配置文件以及更新或检索当前值。它还将负责验证用户输入和请求。当提供覆盖策略(如下所示)时,它允许用户管理配置覆盖。

    配置管理器将负责强制执行应用覆盖的数量限制(当前一次只能对实例应用一个覆盖)。

  4. 常见的覆盖策略。

    一个覆盖策略对象,负责在配置管理器中管理覆盖(如果提供)。

    它将实现以下函数:

    • 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。

测试

将添加单元测试以覆盖非平凡的代码路径。

文档影响

参考资料