Watcher 的 API 微版本

https://blueprints.launchpad.net/watcher/+spec/api-microversioning

问题描述

随着 Watcher 的发展和新功能的获得,这些功能也体现在 API 变更中,因此支持 Watcher 的新版本而不破坏现有基础设施是必要的。

用例

作为 OpenStack 操作员,我希望从客户端 v1.1 向 Watcher API 服务器发送请求,版本为最新版本 1.2,并获得包含版本 1.1 资源的适当响应。

作为 OpenStack 操作员,我希望发送不指定 API 版本的资源请求,并获得包含默认版本资源的响应。

作为 OpenStack 操作员,我希望发送指定 API 版本为 1.2 的资源请求,并获得包含版本 1.2 资源的响应。

提议的变更

Watcher API 应该从客户端接收 API 版本,该版本代表它可以处理的资源列表及其 GET/POST/PATCH 属性。如果用户使用错误的 API 微版本发送请求,则应返回 HTTP 406 Not Acceptable。

由于 Watcher API 使用 Pecan + WSME 捆绑包,Watcher 微版本验证应在用于将资源适配到指定 API 版本的特殊方法集中完成。例如,如果补丁集在版本 1.2 中向资源添加了新属性,则版本 1.1 应该从响应中排除这些属性。我们将使用 Ironic 微版本规范 和实现的部分内容,因为它也使用了 Pecan + WSME 捆绑包。让我们看看 Watcher API 和 Watcher Client 之间通信的可能用例。我们将使用术语“旧 Watcher”来指代一个在微版本出现之前且不了解它们的 Watcher 版本。

不指定 API 微版本进行通信(旧 Watcher)

  • 客户端建立与 Watcher 的连接,未指定 HTTP 标头 OpenStack-API-Version。

  • Watcher 未看到 OpenStack-API-Version HTTP 标头

  • Watcher 使用 REST API 的 v1.0 进行通信,所有与客户端的通信都使用该版本的接口。

旧客户端与新 Watcher API 之间的通信

  • 客户端建立与 Watcher 的连接,指定 HTTP 标头 OpenStack-API-Version,版本为 1.0

  • Watcher 使用 REST API 的 v1.0 进行通信,所有与客户端的通信都使用该版本的接口。

新客户端与新 Watcher API 之间的通信

  • 客户端建立与 Watcher 的连接,指定 HTTP 标头 OpenStack-API-Version,版本为 1.1。

  • Watcher 使用 REST API 的 v1.1 进行通信,所有与客户端的通信都使用该版本的接口。响应附带新的 HTTP 标头 OpenStack-API-Version。

新客户端与新 Watcher API 之间的通信(使用最新的微版本)

  • 客户端建立与 Watcher 的连接,在 OpenStack-API-Version HTTP 标头中提供“latest”作为版本

  • Watcher 通过使用其支持的最新 API 版本进行响应,并在 OpenStack-API-Version 标头中包含此版本,以及 -Min- 和 -Max- 标头。

新客户端/新 API 之间的协商,不指定版本

Watcher 客户端支持版本 1.1 到 1.3,Watcher API 支持版本 1.1 到 1.2。

  • 用户未向客户端指定版本

  • 客户端建立与 Watcher 的连接,提供 1.3 作为微版本,因为这是客户端支持的最新微版本。

  • Watcher 响应 406 Not Acceptable,以及它可以支持的 -Min- 和 -Max- 标头(在本例中为 1.1 和 1.2)

  • 客户端应该透明地进行,协商出客户端和服务器都将使用 v1.2。客户端还应该缓存此微版本,以便后续尝试无需重新协商微版本。

新客户端/新 API 之间的协商,指定版本

Watcher 客户端支持版本 1.1 到 1.3,Watcher API 支持版本 1.1 到 1.2。

  • 用户指定客户端应使用的特定微版本(例如 1.3)

  • 客户端建立与 Watcher 的连接,提供 1.3 作为微版本

  • Watcher 响应 406 Not Acceptable,以及它可以支持的 -Min- 和 -Max- 标头(在本例中为 1.1 和 1.2)

  • 客户端将此报告给用户并退出

新客户端/新 API 之间的通信,使用不受支持的版本

  • 客户端建立与 Watcher 的连接,提供 1.3 作为请求的微版本。

  • Watcher 响应 406 Not Acceptable,以及它可以支持的 -Min- 和 -Max- 标头(在本例中为 1.1 和 1.2)

  • 客户端将此错误报告给用户

要使用微服务,客户端应在发送请求之前将 OpenStack-API-Version 标头添加到 HTTP 请求中。python-watcherclient 已经为其请求提供了 OpenStack-API-Version 标头。目前,版本为 1.0,我建议提供“latest”,这将始终请求 Watcher 的最新 API 版本。

什么变更需要新的微版本

  • 查询参数的变更 例如:添加新参数、删除旧参数、更改参数类型。

  • 资源的变更 例如:添加新资源、删除旧资源。

  • 请求体的变更 例如:POST 请求体中新增字段 ‘audit_description’。

本规范还依赖于 微版本规范 作为所提议变更的基础。

备选方案

保持不变,当用户连同新的 OpenStack 发布一起更新 Watcher 时。这可能会导致无法为旧客户端提供服务的潜在问题。

数据模型影响

REST API 影响

Watcher API 应该接受 OpenStack-API-Version HTTP 标头。

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

Watcher 的 REST API 的任何未来变更(无论是在请求中还是在任何响应中)都必须导致微版本更新,并在代码中进行适当的保护。

实现

负责人

主要负责人

alexchadin (aschadin@sbcloud.ru)

工作项

  • 将 OpenStack-API-Version 标头推送到 API 层。

  • 添加特殊的过滤方法。

  • 实现 versions.py 模块,其中包含 API 变更的历史记录。

依赖项

测试

应添加适当的单元和功能测试。

文档影响

参考资料

https://specs.openstack.org/openstack/api-wg/guidelines/microversion_specification.html

历史