替换扩展的概念¶
用支持稳定、实验性和树外功能的机制替换 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 基本文档以支持包含实验性内容
更新文档以指示实验性和稳定功能
添加文档以描述实验性到稳定的毕业流程
添加文档以描述未毕业实验性的移除流程
依赖项¶
无
测试¶
无
文档影响¶
对扩展构建和启用文档的更改。
参考资料¶
无