跳转到: 导航, 搜索

Neutron/Spec-l3apis-into-core

将 L3 API 移入 Quantum 核心

范围

该蓝图的目标是将 L3 API 成为官方 'core' Quantum API 的一部分,正如 Grizzly 会议上所同意的那样。

从用户角度来看,几乎不会有任何变化(参见 'API' 部分)。插件实现者应注意 '数据模型变更' 部分讨论的数据库模型变更。 此外,现在引入到 Quantum 仓库中的新插件需要实现 L3 基础插件。

插件接口、插件加载机制以及将 API 调用分派到插件的更改超出了此蓝图的范围。 如果您正在查看 L2 和 L3 插件可能如何分离,请查看此蓝图

用例

此蓝图不会引入任何新的用例。

实现概述

在许多方面,此蓝图主要涉及代码重构; 除了重构之外,最重要的更改涉及 API 和数据模型。

在 API 层,我们计划

  • router:external 重命名为 external 用于网络资源; 这与 'router' 扩展别名现在已被删除的事实一致,因为代码现在位于核心 API 中。
  • 计划是否将 API 提升到 2.1(有关更多信息,请参见 未解决的问题
 This would require us to maintain both 2.0 and 2.1 APIs, as well as doing the appropriate changes into the API layer for handling multiple versions.
 2.0 API would be the 'Folsom' API, whereas version 2.1 would be the 'Grizzly' API. 2.1 will not break backward compatibility.

在 DB 层,此蓝图提出了一种自然简化,它源于所有插件现在都支持 Layer-3 API 的事实:与其为存储 'external' 属性并每次查询网络时执行连接的单独表,我们可以轻松地合并这两个表。 由于大多数插件只是使用 mixin 类,因此这应该相当容易。 但是,此蓝图将负责适当地调整使用 L3 db 模型显式使用的插件,以及用于将数据填充到发送到 L3 代理的 RPC 同步例程,该代理由多个插件使用。

重构活动

  • 将 L3 扩展资源属性映射、异常和验证器移入 quantum/api/v2 包
  • 删除 L3 扩展并相应地调整所有插件(从 supported_extension_aliases 中删除 'router')
  • 重构 db 和插件类,以便现在可以使需要显式 L3 感知的 L2 方法更加流畅。 这将特别涉及简化围绕 _extend_network_dict_l3 和 _process_l3_create 的逻辑
  • 将 l3 扩展的 'ad-hoc' 身份验证检查合并到主策略引擎中(参见 _enforce_l3_xxx_auth 方法)
  • 根据建议的数据模型更改调整 db 逻辑

数据模型变更

以下类将被删除


class ExternalNetwork(model_base.BASEV2):
    network_id = sa.Column(sa.String(36),
                           sa.ForeignKey('networks.id', ondelete="CASCADE"),
                           primary_key=True)


网络模型将按如下方式更改


class Network(model_base.BASEV2, HasId, HasTenant):
    """Represents a v2 quantum network."""
    name = sa.Column(sa.String(255))
    ports = orm.relationship(Port, backref='networks')
    subnets = orm.relationship(Subnet, backref='networks')
    status = sa.Column(sa.String(16))
    admin_state_up = sa.Column(sa.Boolean)
    shared = sa.Column(sa.Boolean)
    external = sa.Column(sa.Boolean)


配置变量

在此蓝图的范围内没有更改。

API

由于 'router' 扩展别名将不再存在,因此应将 'router:external' 属性(网络资源的扩展属性)简单地重命名为 'external'。 由于这将为 Folsom 用户生成不兼容的更改,因此仍将允许将 'router:external' 属性用作 'router:external' 的别名。

应在 Grizzly API 参考中弃用在 'external' 处使用 'router:external'。

测试用例

由于此蓝图不会显着更改 Quantum 服务提供的功能,因此我们预计不会出现新的测试用例或测试模块。 但是,对于在实现过程中应添加的例程和方法,将提供适当的单元测试。

未解决的问题

此更改是否应将 API 版本提升到 2.1,或者我们是否应继续使用 2.0。 提升到 2.1 将允许我们在将请求发送到 /v2.0/networks 时继续使用 'router:external',并在将请求发送到 /v2.1 时使用 'external' 或 'router:external',如 API 更改部分所述。

另一方面,它将增加维护 Quantum API 的 2.0 和 2.1 版本的负担。 由于我们目前没有计划淘汰旧的、向后兼容的版本并添加新版本,这在长期内可能会构成问题。 征求社区反馈以达成共识。 如果社区无法达成共识,API 版本应保持为 2.0