Neutron/全栈白盒测试框架

Launchpad蓝图

此蓝图指定了编写针对 Neutron 组件的新全栈测试所需的框架(与验证不同 OpenStack 组件之间集成的测试相反)。这些测试旨在为白盒测试 - 它们将验证 Neutron 的功能,主要是在操作系统级别。

换句话说,全栈测试旨在单独测试 Neutron,不涉及其他 OpenStack 组件,并且介于功能测试和 Tempest 测试之间。

问题描述

目前 Neutron 有 3 种主要的测试类型

  1. 单元测试,旨在主要在函数级别检查代码,其中每个函数都被单独测试。例如:确保函数 X 在参数为 A、B 和 C 时返回 Y 值。

  2. 功能测试,仅针对单个子组件,旨在验证与外部(系统或主机本地)资源的交互(主要是操作系统交互和外部软件包,如 Open-vSwitch 和 iproute2…)。一个功能测试示例可能如下所示

def test_router_lifecycle(self):
    """Create a router and check that the agent creates various resources.

    self.agent is an instance of type L3NATAgent (the main class in the L3
    Agent) and is created as part of the test. The assertions make sure that
    various OS resources (like interfaces, namespaces, processes) are created
    as part of the creation of a new router.
    """
    router_info = self.generate_router_info(enable_ha)
    router = self.manage_router(self.agent, router_info)

    self.assertTrue(self._namespace_exists(router))
    self.assertTrue(self._metadata_proxy_exists(self.agent.conf, router))
    self._assert_internal_devices(router)
    self._assert_external_device(router)
    self._assert_gateway(router)
    self._assert_floating_ips(router)
    self._assert_snat_chains(router)
    self._assert_floating_ip_chains(router)

    self._delete_router(self.agent, router.router_id)
    self._assert_router_does_not_exist(router)
  1. Tempest 测试,检查 OpenStack 作为整体以及 Neutron 特别地是否按预期工作。Tempest 测试分为 2 组

    1. 场景测试(启动新实例并确保该实例具有与外部网络的连接)。这些测试通常旨在一次性检查多个组件(与此处讨论的仅检查 Neutron 的全栈测试相反)。

    2. API 测试(创建一个新的路由器,确保控制器意识到它并删除它)。

目前没有办法检查 Neutron 作为独立项目以及在没有其他 OpenStack 组件(如 Nova 或 Cinder)的情况下 Neutron 不同组件之间的交互。

提议的变更

该框架将在 Neutron 树中编写,从而更容易编写新测试(与树外 Tempest 测试相反),了解测试期间使用的 Neutron 资源(执行 Neutron 代理并清理使用的资源),以及运行旨在检查 Neutron 不同组件之间交互的特定 Neutron 测试。

该框架旨在实现状态隔离,通过在需要时重置 Neutron 组件的状态和重新启动 Neutron 代理来实现(Tempest 当前手动执行此操作 - 测试期间创建的路由器需要显式删除)。

目前打算在每个全栈测试之后重置所述状态,但这可以轻松更改(一旦向框架添加足够的测试,以便可靠地进行基准测试,我们可能希望在每个测试套件之后执行此操作)。

该框架将支持

  1. 使用 unittest 模块编写全栈测试,

  2. 在适当的时候使用 setUp 和 cleanUp 重新启动所有需要的 Neutron 进程(neutron-server、L3 代理等…),

  3. 擦除数据库并清理资源(特别是运行 neutron-ovs-cleanup 和 neutron-netns-cleanup),

  4. 仅使用 python-neutronclient 与 Neutron 通信。

def test_ha_router_startup(self):
    """Create an HA router for two agents and make sure they can communicate.

    While this full-stack test look similar to 'test_router_lifecycle', it
    relies on the Neutron API (python-neutronclient) to create a new router
    and actual processes (one neutron-server, 2 pairs of L3 and OVS agents),
    meaning that once a request is made, it goes through all relevant agents
    and components (instead of a single sub-component). OS resources are also
    checked in this test.
    """
  def test_ha_router_startup(self):
      l3_agents = ['neutron-l3-1-agent', 'neutron-l3-2-agent']

      router = self.client.create_router(
          body={'router': {'name': 'router-test',
                           'tenant_id': uuidutils.generate_uuid(),
                           'ha': True}})
      router_id = router['router']['id']

      self._assert_namespaces_exists(router_id, l3_agents)
      master, slave = self._get_master_and_slave(router_id, l3_agents)

      # Only if the two agents can ping each other will the other router
      # change itself to be the backup router.
      test_daemon.wait_until(
          lambda: 'backup' in self._get_ha_state(router_id, slave))

运行全栈测试需要设置 devstack 并停止所有服务(’./stack.sh’、’./unstack.sh’),然后使用 tox 运行测试。 随着时间的推移,可能需要进一步的步骤来设置数据库和其他资源,但将运行测试所需的步骤降至最低将是优先考虑的事项。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

用户可以使用常规工具(如 tox)手动执行全栈测试,但管理员和云用户无需在部署后运行这些测试。

不需要更改 python-neutronclient。

性能影响

IPv6 影响

其他部署者影响

开发人员影响

编写新功能可能需要为它们编写全栈测试,以及单元和功能测试。

社区影响

运行全栈测试将可用于运行,类似于当前的单元和功能测试,并将提高新功能和现有 Neutron 功能的可信度和可靠性(上游和下游)。

备选方案

可以编写这些类型的测试在 Tempest 中完成,但是出于以下几个原因没有选择这种方法

  1. OpenStack 中 QA 工作的方向排除了在 Tempest 中执行这些类型的测试,因为它正在重新关注多服务测试。

  2. 全栈测试允许开发人员在编写新的 Neutron 代码时具有更大的灵活性。Tempest 策略规定只能使用各种组件的 API 测试,从而不允许涉及系统交互的检查,并限制了之前提到的一些功能的测试。由于测试将放置在树中,因此更容易确定有关新测试的策略。

  3. 有了这种新型测试,我们可以测试特定条件(例如代理重新启动后的一致性和持续连接),目前无法使用 Tempest 实现这一点。

实现

负责人

主要负责人

  1. John Schwarz <jschwarz@redhat.com>

其他贡献者

  1. Assaf Muller <amuller@redhat.com>

  2. Maru Newby <marun@redhat.com>

工作项

  1. 添加管理守护进程 Neutron 进程的能力,

  2. 实现支持全栈白盒测试框架,

  3. 添加一个全栈测试示例。

依赖项

  1. https://review.openstack.org/#/c/124136/

  2. https://review.openstack.org/#/c/125109/

测试

最终目标是将这些新型全栈测试作为 gate 的一部分运行 - 编码人员必须验证他们的代码通过特定的“全栈白盒测试”gate 作业才能使他们的补丁合并。

此外,需要对 infra 项目进行更改,才能将这些类型的测试添加到 gate(首先作为非投票,然后作为投票 gate 作业)。

Tempest 测试

功能测试

API 测试

文档影响

用户文档

开发人员文档

以下 wiki 页面包含有关树内测试和全栈测试的具体文档和“最佳实践”。 在编写新测试之前,开发人员应阅读以下 wiki 页面: https://wiki.openstack.org/wiki/Neutron/InTreeTests

应更新 TESTING.rst 以反映新的测试框架。

参考资料