替换扩展的概念

bp replace-extensions

用支持稳定、实验性和树外功能的机制替换 Keystone 中现有的扩展概念。

问题描述

在许多项目中,已经尝试通过独立的、wsgi 可插拔的扩展来引入新功能。虽然这允许云提供商明确决定要启用哪些新功能,但对于任何使用 Keystone 的客户端或其他服务来说,这也会造成困扰,即在任何给定安装中实际支持哪些功能(在任何特定时间)。Nova 在这方面遇到了重大问题,其 API 拥有许多此类扩展。此外,我们当前的扩展模型也无法清楚地表明,给定的扩展是稳定的、实验性的、还是对某些核心 API 的可选替换等。

我们需要的是对新功能的定义更加严格,同时最大限度地减少这给实际可用功能带来的困惑。

提议的变更

建议在 Keystone 中放弃当前的扩展机制,而采用三种类型的功能

  • 功能是稳定的,并且是 Keystone 树的一部分

  • 功能是实验性的,但仍然是 Keystone 树的一部分

  • 功能是树外的,可以按需加载,但不提供正式支持。这种树外功能通常将使用与树内功能相同的标准插件点连接到 Keystone,只是这种功能不被认为是核心的一部分。

JSON-Home 功能将指示任何给定功能的类别。将提供一个查询参数来获取特定的分类(例如,实验性,例如 GET /v3/?experimental=True)。

所有现有的 contrib 内容将被重新分类为上述前两种类别之一,其中大部分将被标记为稳定(尽管我们可能也会将一些标记为已弃用)。这意味着所有这些 contrib 项目现在都将自动加载,并且不依赖于 wsgi 管道设置。

默认情况下,建议添加到树内的主要新功能将从实验状态开始。通常,至少需要一个周期才能从实验状态过渡到稳定状态,尽管在特殊情况下,这可能会在一个周期内发生。实验状态表明,虽然我们的意图是保持 API 不变,但我们保留在将其标记为稳定之前更改它的权利。不打算让功能长期处于实验状态。它应该要么毕业到稳定状态,要么被删除(或者可能移动到树外)。处于实验状态超过 2 个版本的,预计将过渡到其他状态之一。

任何被提议为实验性的新功能,如果引发了对安全性的担忧,则必须有一个配置开关来禁用它(默认设置为禁用)。此要求将作为此新功能规范的一部分进行指定。禁用的功能集仍然应该响应 JSON-Home 请求,但状态为禁用。如果功能被禁用,则响应应该是 HTTP 403(FORBIDDEN)。即使它被分类为实验性并被禁用,也不应从 JSON-Home 文档中列出的任何资源返回 HTTP 404(NOT FOUND)。

备选方案

我们保留当前的扩展机制,并接受客户端的复杂性,但也许可以增强 JSON-Home 支持以实现更好的检测。

数据模型影响

目前扩展拥有自己的 SQL 仓库 - 此提案不会隐式地更改这一点。我们可能会将其中一些合并到主仓库中,并缩减对 N-2 版本的升级支持。

对于新功能,建议使用主仓库,以便最大限度地减少管理员所需的步骤,因为该功能都是“核心的一部分”。

REST API 影响

无。

安全影响

没有,除了关于使用配置来禁用具有安全隐患的新功能的问题。

通知影响

其他最终用户影响

性能影响

其他部署者影响

将不再可以通过简单地将其从 wsgi 管道中删除来禁用单个实验性功能。相反,对于那些被认为具有安全影响的项目,将使用配置开关。

开发人员影响

对于构建被归类为树外功能的开发人员,他们必须为代码提供自己的托管环境以及交付机制。Stackforge 是提供此类代码的推荐场所。

实现

负责人

  • 摩根·费因伯格 (mdrnstm)

  • Steve Martinelli (stevemar)

  • Henry Nash (henry-nash)

  • Brant Knudson (bknudson)

  • Adam Young (ayoung)

工作项

  • 将当前扩展分类为稳定或实验性

  • 更新 JSON-Home 基本文档以支持包含实验性内容

  • 更新文档以指示实验性和稳定功能

  • 添加文档以描述实验性到稳定的毕业流程

  • 添加文档以描述未毕业实验性的移除流程

依赖项

测试

文档影响

对扩展构建和启用文档的更改。

参考资料