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/resource-cleanup

Tempest 测试资源清理

问题描述

在类级别测试fixture中创建/分配的测试资源的清理/释放是在类级别tearDown fixture中调用的。但是,unittest框架仅在setUpClass成功的情况下才会调用tearDownClass。这导致资源在以下情况下泄漏:

  • 在已经分配了资源(通常是测试帐户)之后,引发了跳过异常

  • 被测系统中出现临时故障,导致setUpClass失败

test-accounts bp 引入了使用配置的预置测试帐户列表来并行运行测试的可能性。测试帐户由每个测试类分配和释放,并且未能释放会导致测试帐户耗尽。

提议的变更

禁止使用hacking rule覆盖setUpClassBaseTestCase中定义的内容。定义setUpClass,使其调用一个(或多个)其他方法,这些方法将被后代类覆盖。使用@safe_setup装饰器对其进行装饰。这样,tearDownClass将始终被调用。

@classmethod
@safe_setup
def setUpClass(cls):
    cls.setUpClassCalled = True
    cls.resource_setup()

在进行此更改时,可以通过将设置结构化为一系列方法来获得额外的好处,以强制在失败之前分配尽可能少的资源,从而也能快速清理。

此PoC在此处提供:https://review.openstack.org/#/c/115353

@classmethod
@safe_setup
def setUpClass(cls):
    cls.setUpClassCalled = True
    # All checks that may generate a skip
    cls.setup_skip_checks()
    # Any setup code that does not require / generate test resources
    cls.setup_pre_resources()
    # Allocation of all required credentials
    cls.setup_allocate_credentials()
    # Shortcuts to clients
    cls.setup_clients()
    # Allocation of shared test resources
    cls.setup_create_resources()
    # Any setup code to be run after resource allocation
    cls.setup_post_resources()

tearDownClass fixture需要在多个地方进行修复,因为一些tearDownClass实现将变得不安全,因为它们期望在setUpClass期间定义的属性,而这些属性可能不再存在。

禁止使用hacking rule覆盖tearDownClassBaseTestCase中定义的内容。定义tearDownClass,使其调用后代类特定的清理代码,最后清理凭据。

@classmethod
def tearDownClass(cls):
    at_exit_set.discard(cls)
    try:
        cls.resource_cleanup()
    finally:
        cls._cleanup_credentials() # Defined in BaseTestCase

替代方案

已经确定了两种替代方案。

大规模fixture装饰

使用@safe_setup装饰所有setUpClass实现,并使用@safe_teardown装饰所有tearDownClass实现。这种方法需要对tempest进行大规模更改,其优点是可以几乎通过脚本实现(PoC:https://review.openstack.org/#/c/115123/)。它的缺点是需要每个新的测试类添加这两个装饰器。

迁移到TestResources

这在长期来看可能仍然是一个选项,但目前迁移的工作量将大于从中获得的收益。无论如何,仍然需要额外的工程工作来确保资源的清理。

实现

负责人

Andrea Frittoli <andrea.frittoli@hp.com>

里程碑

完成目标里程碑

Juno-final

工作项

依赖项