L3 插件提供商验证

https://blueprints.launchpad.net/neutron/+spec/l3-svcs-vendor-validation

目前,终端用户选择的验证与参考实现紧密绑定。因此,替代提供商在资源已经持久化之后,才能验证终端用户配置选择。

问题描述

当 Neutron 收到 L3 服务请求时,它会调用相应的服务插件,该插件会验证持久化请求的信息(通常在一个步骤中完成)。最后,插件会调用服务驱动程序来应用更改。

应用阶段,提供商的服务驱动程序才有机会对请求采取行动。如果提供商有额外的约束条件,它可以拒绝该请求,但资源已经会先被持久化。

例如,在使用选择 v2 的 IKE 策略创建 VPN IPsec 站点连接时,连接将通过验证,被持久化,并调用服务驱动程序。对于目前通过其 REST API 不支持 v2 的 Cisco CSR 而言,服务驱动程序可以在应用期间引发异常。但是,连接已经创建并持久化了。

此外,如果服务驱动程序有需要执行的持久化操作,则必须在应用阶段执行。

提议的变更

本提案旨在将验证分解为单独的函数,并提供一种方式,让提供商服务驱动程序可以扩展或覆盖验证逻辑(如果需要)。

对当前验证的研究表明,为了处理多个客户端同时更改相同资源的情况,必须在持久化步骤期间完成验证。事务将强制一致性。

计划的方法是在服务驱动程序抽象基类中创建默认验证逻辑,并在持久化期间选择活动服务驱动程序并调用其验证方法。

服务驱动程序可以在默认逻辑之前、之后或代替默认逻辑执行验证,或者不提供验证方法,则将执行抽象基类中的默认验证。

目标是将相同的提案推广到所有 L3 服务插件。

这将是一个结构性更改,而不是行为性更改。

在 Juno 会议期间,讨论了使用 TaskFlow 包来管理验证、持久化和应用操作的处理流程。

需要对 TaskFlow 进行更多研究,但无论如何,验证逻辑都应与持久化逻辑分离,并且可以作为初步工作完成。

备选方案

另一种方法是将资源状态/状态标记为ERROR,但数据库仍然与请求操作的实际状态不一致。

数据模型影响

预计不会对数据库模式或操作进行任何更改,除了现在可以准确反映资源的实际状态。

REST API 影响

预计不会对 REST API 进行任何更改。

安全影响

无。

通知影响

没有?

其他最终用户影响

无。

性能影响

预计没有显著的性能影响。

其他部署者影响

无。

开发人员影响

提供商希望更新其服务驱动程序,以利用新的验证和拒绝请求的能力,具体取决于提供商的功能。

实现

负责人

主要负责人

pmichali

其他贡献者

任何人

鉴于 L3 服务的范围和数量,将非常感谢额外的贡献者!

工作项

为每个 L3 服务创建和更新 API

  • 重构数据库功能 * 提取验证逻辑并移动到服务驱动程序抽象基类 * 添加钩子以调用现在在服务驱动程序中的验证逻辑

  • 如果需要,将验证方法添加到提供商的服务驱动程序

  • 根据结构性更改更新单元测试

注意:验证逻辑的分离可以独立地在每个 L3 服务上完成(没有依赖关系),并且可以根据需要完成(例如,仅在多个实现具有不同验证需求的情况下),如果需要的话。

依赖项

测试

由于这是一个结构性更改,预计不需要额外的 tempest 测试。

单元测试需要修改,主要是由于方法名称更改,但也可能由于逻辑的更好隔离而更改。 检查验证和持久化(或执行持久化以检查验证)的测试可以拆分为更隔离的测试用例。 这应该减少测试用例中的重叠(可能消除一些测试),更好的隔离,以及可能更好的性能(不必执行多个任务来测试某些功能)。

文档影响

无。

参考资料

目前没有。