This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
重构客户端管理器¶
https://blueprints.launchpad.net/tempest/+spec/client-manager-refactor
当前的客户端管理器依赖于相对大量的配置项,即所有客户端参数的组合。这使得它迁移到 tempest-lib 变得困难。
问题描述¶
我们对客户端管理器有几个计划
将其作为 tempest.lib 中的稳定接口。这将反过来帮助凭证提供程序和服务客户端迁移到 .lib 命名空间。并且它将为编写 tempest 插件的人提供一个自定义服务客户端的归宿。
修改它,以便插件开发者可以将他们的服务客户端动态地添加到客户端管理器中,这样我们就可以有一致的方式从测试中访问测试客户端。
当前的客户端管理器依赖于 CONF,并且它的结构不容易允许在运行时注册额外的客户端。
例如,在Manager类中
self.network_client = NetworkClient(
self.auth_provider,
CONF.network.catalog_type,
CONF.network.region or CONF.identity.region,
endpoint_type=CONF.network.endpoint_type,
build_interval=CONF.network.build_interval,
build_timeout=CONF.network.build_timeout,
当前结构的另一个问题是,新的 API 版本会导致客户端管理器类中客户端属性的增殖。随着服务客户端被拆分成多个部分,客户端管理器的尺寸也相应地增长。
提议的变更¶
将客户端管理器拆分为两部分。
第一部分提供客户端的延迟加载,并且不依赖于 tempest CONF,因为它计划迁移到 tempest.lib。它涵盖了 tempest 大帐篷中六个核心服务所涵盖的六个客户端组。它暴露了一个接口来注册进一步的服务客户端。
客户端的延迟加载可以防止在 __init__ 时尝试进行 API 调用的客户端;它还有助于使用运行 tempest 所需的最小量的 CONF,用于特定测试运行中使用的客户端。
第二部分将 tempest CONF 值传递给第一部分。它注册任何非核心客户端,无论它们是否仍在 tempest 树中,还是来自插件。
客户端注册接口可能如下所示
def register_clients_group(self, name, service_clients, description=None,
group_params=None, **client_params):
"""Register a client group to the client manager
The client manager in tempest only manages the six core client.
Any extra client, provided via tempest plugin-in, must be registered
via this API.
All clients registered via this API must support all parameters
defined in common parameters.
Clients registered via this API must ensure uniqueness of client
names within the client group.
:param name: Name of the client group, e.g. 'orchestration'
:param service_clients: A list with all service clients
:param description: A description of the group
:param group_params: A set of extra parameters expected by clients
in this group
:param client_params: each is a set of client specific parameters,
where the key matches service_client.__name__
"""
tempest 插件 TempestPlugin 接口通过一种方法扩展,以返回特定于插件的服务客户端数据。每个插件定义一个新的服务客户端组和相关数据。
服务客户端数据存储在单例 ServiceClientsData 中。 ServiceClientsData 由 TempestTestPluginManager 实例化,它从每个插件获取服务客户端数据并注册它。
测试使用的客户端管理器消耗服务客户端数据单例,并动态定义一组可用于访问客户端的属性。
属性名称目前是静态定义的。它们将与现在相同,以最大限度地减少对代码库的影响。对于插件,属性名称包括组名称,以避免不同插件的服务客户端之间的名称冲突。
将来,我们可能会定义属性名称的标准命名约定,并通过自动派生名称来强制执行它。未来的名称可能不包含“_client”后缀,以节省空间并允许始终在测试代码中指定客户端提供程序,从而使代码更具可读性。此命名约定将不会作为本规范的一部分实施。
替代方案¶
将管理器保留在 tempest 侧,并让大帐篷团队编写他们自己的管理器。将长长的客户端列表作为参数传递到凭证提供程序和 tempest 的其他部分
实现¶
负责人¶
- 主要负责人
Andrea Frittoli <andrea.frittoli@hpe.com>
里程碑¶
- 完成目标里程碑
Newton-1
工作项¶
管理器第一部分的核心功能,并具有单元测试覆盖率以及一个客户端组的迁移
迁移其他客户端组(每个补丁一个)
注册接口的实现(不依赖于步骤 2)
从 tempest 树注册非核心客户端
从插件注册非核心客户端
将管理器第一部分拆分为它自己的模块,并包含 manager.py
这项工作已经开始:Change-id I3aa094449ed4348dcb9e29f224c7663c1aefeb23
依赖项¶
无