ML2 中扩展的支持

https://blueprints.launchpad.net/neutron/+spec/extensions-in-ml2

此蓝图定义了一个可插拔框架,用于扩展 ML2 中的核心资源属性。

问题描述

在当前的 ML2 插件实现中,只有在 Ml2Plugin 类本身中定义的扩展可用,并且没有办法使用特定机制驱动程序所需的属性来扩展核心资源。当需要这些扩展时,无论是用于未来核心 API 版本中可能包含的新通用功能,还是为了更好地支持特定的网络技术,当前的唯一选择是实现一个新的单体插件。

提议的变更

此提案为 ML2 添加了对扩展驱动程序的支持,这些驱动程序管理 ML2 插件实现的 neutron 核心资源(网络、子网和端口)上的扩展属性。

扩展驱动程序与机制驱动程序完全正交。操作员配置一组扩展驱动程序,并配置另一组机制驱动程序。配置的扩展驱动程序集决定了核心资源上存在的扩展属性。这些扩展驱动程序管理这些扩展属性的设置、默认值、更新和返回持久值。这些扩展属性的值随后可供所有配置的机制驱动程序使用,并且不会根据使用扩展属性的机制驱动程序而变化。如果一个机制驱动程序理解一个扩展,它可以强制执行其语义。如果不是,它只是忽略这些扩展属性。

每个需要特定于供应商的扩展的机制驱动程序都将拥有自己的扩展驱动程序。也可能有“社区”扩展驱动程序,其中几个不同的机制驱动程序可能能够强制执行扩展的语义。

以下内容描述了 ML2 中的更改,以定义扩展驱动程序并为 ML2 机制驱动程序提供对扩展的支持

1. 引入 ExtensionDriver API 和 ExtensionManager(类似于 MechanismDriver 和 MechanismManager)。

2. 定义一个新的配置参数,其中包含要加载的扩展驱动程序列表(即 extension_drivers)。

3. ExtensionDriver - 定义以下 ML2 扩展驱动程序接口的抽象类

  • initialize: 抽象方法 - 执行扩展驱动程序初始化

  • extension_alias: 抽象属性 - 返回支持的扩展别名

  • process_create_network: 处理创建网络的扩展属性

  • process_create_subnet: 处理创建子网的扩展属性

  • process_create_port: 处理创建端口的扩展属性

  • process_update_network: 处理更新网络的扩展属性

  • process_update_subnet: 处理更新子网的扩展属性

  • process_update_port: 处理更新端口的扩展属性

  • extend_network_dict: 将扩展属性添加到网络字典

  • extend_subnet_dict: 将扩展属性添加到子网字典

  • extend_port_dict: 将扩展属性添加到端口字典

4. ExtensionManager - 以类似于现有的 TypeManager 和 MechanismManager 类的方式管理扩展驱动程序的加载和初始化。提供方法,这些方法将分派到已注册扩展驱动程序的有序列表,以执行 ExtensionDriver 上定义的每个 process_create_<resource>、process_update_<resource> 和 extend_<resource>_dict 抽象操作。

5. Ml2Plugin 将在启动时初始化 ExtensionManager,这将加载和初始化配置的 ExtensionDrivers。

6. 将 Ml2Plugin 的 supported_extension_aliases 抽象属性更改为包含每个已注册 ExtensionDriver 的 extension_alias 属性。

7. 在资源(即 Ml2Plugin 中的网络、端口、子网)的创建和更新中,在调用 pre/post_commit 之前,应调用扩展驱动程序中的 process_create/update 来验证和持久化驱动程序定义的任何扩展资源属性。扩展属性也必须返回。

8. 在构建 Ml2Plugin 用于网络、子网和端口资源的字典的每个情况下,将调用 ExtensionManager 的 extend_<resource>_dict 函数,以便已注册的 ExtensionDrivers 可以添加其扩展属性。

备选方案

下面的链接包含 icehouse 会议中关于此主题的讨论

https://etherpad.openstack.org/p/icehouse-neutron-vendor-extension

此外,还考虑了直接在机制驱动程序中实现扩展的替代方案,但由于各种原因被拒绝,包括无法从 get 操作返回扩展属性

数据模型影响

ExtensionDriver 实现将添加表来存储其扩展属性,但 BP 中不包含任何 ExtensionDrivers。

REST API 影响

现在可以使用 ML2 进行核心资源扩展,类似于以前可以使用单体插件进行扩展。

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

如果机制驱动程序需要将扩展属性添加到资源,则需要创建一个扩展驱动程序(基于 ExtensionDriver API),并将名称添加到 setup.cfg 和 ml2_conf.ini 中。扩展名称和扩展路径应添加到扩展驱动程序中。

实现

负责人

主要负责人

Nader Lahouti (nlahouti)

其他贡献者

工作项

  • ExtensionManager - 新实现

  • ExtensionDriver - 新实现

  • 在 Ml2Plugin 类中添加一个新方法,用于将机制驱动程序中支持的扩展添加到类中的支持扩展中。

  • 调用扩展驱动程序的方法(例如 process_create resource)在 create/update/delete_<resource’s name> 中,以在持久表中添加/更新/删除属性。

依赖项

测试

插件的常规测试仍然适用。但是,将添加新的单元测试,其中包含一个测试 ExtensionDriver,该驱动程序验证扩展属性是否在创建和更新操作中正确处理,从创建、更新和获取操作返回,并且可以在 MechanismDriver 方法中使用。

文档影响

ExtensionDriver API 将包含描述新 API 的文档字符串,因此生成的文档将涵盖它。需要更新部署文档以获取新的配置变量。主要将在需要扩展驱动程序的供应商文档中涵盖。

参考资料