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/test-accounts

Tempest 测试帐户管理

问题描述

Tempest 依赖于租户隔离来实现并行测试执行。为了确保隔离,测试帐户会为每个测试类动态地预置。这种方法需要一个可用的身份管理管理员帐户来进行预置。此蓝图旨在提供一种替代解决方案,即预先配置的帐户,并解决与此方法相关的问题:如何将测试帐户分配给 testr 产生的不同测试进程,包括 alt 用户和其他测试帐户,以及如何在 tempest 中同时支持租户隔离和这种新的实现,并轻松地在两者之间切换。

提议的变更

将现有的租户隔离机制抽象为一个凭据提供者元类,并提供两种不同的实现

  • 一个配置好的凭据提供者,它使用在 tempest.conf 中静态配置的凭据。这可用于避免在测试运行时将管理员凭据包含在配置中

  • 一个动态凭据提供者,它使用现有的租户隔离逻辑,使用身份管理管理员凭据动态生成凭据

将选择测试帐户的逻辑从测试和测试基类移动到一个单独的 credentials_factory 类中,该类根据配置为测试提供正确的租户隔离实现。 credentials_factory 负责读取与测试帐户相关的配置,并且应该删除 auth.py 中的现有 get_credentials 方法,并将相应的逻辑实现配置好的凭据提供者中。

从类似于以下内容开始,在各种略有不同的变体中重复使用

if CONF.compute.allow_tenant_isolation:
    cls.os = clients.Manager(cls.isolated_creds.get_primary_creds())
else:
    cls.os = clients.Manager()

if CONF.compute.allow_tenant_isolation:
    cls.os = clients.Manager(cls.isolated_creds.get_alt_creds())
else:
    cls.os_alt = clients.AltManager()

到一个隐藏租户隔离的测试代码

# Provides the right implementation based on the configuration
cls.isolated_creds = credentials_factory.get_isolated_credentials()

# This may raise an AccountNotAvailable
cls.os = clients.Manager(cls.isolated_creds.get_primary_creds())
cls.os_alt = clients.Manager(cls.isolated_creds.get_alt_creds())

保留 tenant_isolation 标志,但将其从 compute 移动到一个 common 配置组。删除身份部分中的当前用户帐户设置,并在 common 配置组中创建用户、租户、密码和域的设置列表。

作为指示,用户期望一个值为 CONCURRENCY x 2 的列表。租户、密码和域将期望一个与用户列表长度相同,或者只有一个元素的列表,该元素代表所有用户的默认值。

测试完成后,它会释放它请求的帐户,并且这些帐户可供下一个测试使用。这应该突出显示测试中资源清理的问题,例如资源泄漏和非阻塞删除。

配置好的凭据提供者实现从预配置的帐户中向测试提供帐户的逻辑,确保任何时候只有一个帐户被一个测试使用。我们使用基于文件的预留机制,该机制解决了以下问题

  • 避免初始的竞争,即所有并行测试进程都想一次性分配一个测试帐户

  • 确保在测试完成后清理用于预留的文件,即使每个进程本身不知道整体测试何时完成

测试可能需要的帐户数量取决于执行哪些测试。目前,每个进程通常需要两个帐户就足够了,如果我们排除身份验证测试,因为它们大多需要管理员凭据,因此如果没有配置管理员凭据,它们将无法运行。但可能会发生没有帐户可用时测试请求的情况。在这种情况下,测试将以 AccountNotAvailable 失败。

假设

所有非管理员测试帐户都具有相同的关联角色。与帐户关联的所有需要管理员凭据才能创建的资源都是预先创建的。

替代方案

实现对测试进程的静态帐户分配,以避免预留系统。这需要测试帐户的命名约定,或者每个测试进程都了解其自身的 ID,以便可以基于哈希进行选择。

实现

负责人

Andrea Frittoli <andrea.frittoli@hp.com>

里程碑

完成目标里程碑

Juno-final

工作项

  • 将租户隔离接口暴露到一个元类中

  • 将现有的租户隔离移动到动态帐户提供者

  • 实现静态帐户提供者和预留机制,包括修改后的配置选项

  • 实现一个 credentials_factory

  • 调整测试和测试基类(分多个步骤)

依赖项