通过 L3 扩展 API 注册 RouterInfo

Launchpad 蓝图: https://blueprints.launchpad.net/neutron/+spec/router-factory-with-l3-extension

目前,大多数与 L3 相关的插件实现都重写了 L3NATAgent 类本身来实现它们自己的逻辑,因为没有合适的接口来扩展 RouterInfo 类。这给只想扩展代理机制而不是整个 L3 功能相关的 RPC 的开发者增加了不必要的复杂性。

本规范引入了 RouterFactory 类,它充当创建 RouterInfo 类的工厂,并为 L3 代理扩展 API 添加了一个新参数,使其能够动态地将 RouterInfo 注册到工厂。现在插件开发者可以使用新的扩展 API 来实现他们自己的特定路由器。

问题描述

Neutron 中当前的 L3 代理实现通常由两部分组成。一部分是从 Neutron 服务器实现 RPC 插件 API,另一部分是使用从服务器 RPC API 获取的数据创建端口、命名空间和 iptables 规则。更具体地说,前者是 L3NATAgent 类,后者是 RouterInfo 类。

问题在于这两部分现在紧密耦合,这意味着没有明确的方法可以单独扩展每个部分。许多与 Neutron 相关的项目,例如 networking-* [1], [2], [3] 都在通过扩展 L3NATAgent 类来创建新的 L3 代理类,即使他们没有修改 RPC 机制,而只是更改了在服务器上运行的 RouterInfo 机制。

此外,当前的 RouterInfo 类没有抽象接口,这使得插件开发者更难扩展该类。他们必须找到 RouterInfo 中哪些函数和变量在 L3 代理中外部使用,才能扩展 RouterInfo 的行为。

提议的变更

今天,RouterInfo 以多种方式扩展,具体取决于特定的路由器功能,例如分布式、HA 和分布式 + HA。本文档建议更改 L3 代理,使其具有一个名为 RouterFactory 的新类,该类具有几个预注册的类,用于使用某些功能扩展 RouterInfo 类。在创建实际的 RouterInfo 实例时,L3 代理会根据路由器的功能从 RouterFactory 创建一个新实例。现有代码没有功能性更改。

L3AgentExtensionAPI 现在有一个新参数 router_factory 和一个新函数 register_router。将添加一个新的抽象类,名为 BaseRouterInfo。它将声明当前外部使用的接口。

L3 扩展可以使用 register_router API 注册他们自己的 RouterInfo 类,该类实现了 BaseRouterInfo,该 API 有两个参数。

  1. router: 在扩展中声明的 RouterInfo,它覆盖了 RouterFactory 中预注册的一个。

  2. features: RouterInfo 的特性。目前应该是以下之一。

    特性应该是一个描述路由器特征的字符串列表,并且顺序无关紧要,因为它在内部被解释为集合。(['ha', 'distributed']['distributed', 'ha'] 相同)

    • []: 无特性。(例如 LegacyRouter

    • ['distributed']: 分布式路由器。(例如 DvrEdgeRouter,

      DvrLocalRouter)

    • ['ha']: HA 路由器。(例如 HaRouter

    • ['ha', 'distributed']: 分布式 HA 路由器。(例如

      DvrEdgeHaRouter, DvrLocalRouter

    请注意,具有 ['ha', 'distributed'] 特性的路由器在 L3 代理模式不是 dvr_snat 时可以为 DvrLocalRouter [4]

L3 扩展可以在使用 initialize 函数初始化时覆盖 Neutron 代码库中实现的 RouterInfo 类。

实现

负责人

工作项

  • L3AgentExensionAPI 中添加 RouterInfo 注册,并将现有的 RouterInfo 预注册到 L3NATAgent[5]

  • neutron_lib 中添加名为 RouterNotFoundInRouterFactory 的新异常。 [6]

参考资料