添加与 Openstack 一致的版本响应

Launchpad 蓝图: https://blueprints.launchpad.net/barbican/+spec/fix-version-api

Barbican 当前为根资源的 GET 请求返回一次性的版本信息。此蓝图要求将此响应替换为基于 json-home 的与 Openstack 一致的响应(参见 http://http://tools.ietf.org/html/draft-nottingham-json-home-03),其中包含当前支持的 API 版本。例如,将此版本信息附加到从 Keystone 服务目录检索到的端点信息后,可以促进服务的自动发现。

问题描述

当使用 GET 请求查询 Barbican 的根资源时,它应该使用基于 json-home 的与 Openstack 其他项目一致的版本响应。这在 2014 年 7 月 Keystone 和 Barbican 的年中会议上讨论过(有关详细信息,请参见 https://etherpad.openstack.org/p/keystone-juno-hackathon)。以下是来自 Keystone 的 json-home 类型响应的实现示例(记录在此处:https://docs.openstack.org/api/openstack-identity-service/2.0/content/Versions-d1e472.html)

{
    "choices": [
        {
            "id": "v1.0",
            "status": "DEPRECATED",
            "links": [
                {
                    "rel": "self",
                    "href": "https://identity.api.openstack.org/v1.0"
                }
            ],
            "media-types": {
                "values": [
                    {
                        "base": "application/xml",
                        "type": "application/vnd.openstack.identity+xml;version=1.0"
                    },
                    {
                        "base": "application/json",
                        "type": "application/vnd.openstack.identity+json;version=1.0"
                    }
                ]
            }
        },
        {
            "id": "v1.1",
            "status": "CURRENT",
            "links": [
                {
                    "rel": "self",
                    "href": "https://identity.api.openstack.org/v1.1"
                }
            ],
            "media-types": {
                "values": [
                    {
                        "base": "application/xml",
                        "type": "application/vnd.openstack.identity+xml;version=1.1"
                    },
                    {
                        "base": "application/json",
                        "type": "application/vnd.openstack.identity+json;version=1.1"
                    }
                ]
            }
        },
        {
            "id": "v2.0",
            "status": "BETA",
            "links": [
                {
                    "rel": "self",
                    "href": "https://identity.api.openstack.org/v2.0"
                }
            ],
            "media-types": {
                "values": [
                    {
                        "base": "application/xml",
                        "type": "application/vnd.openstack.identity+xml;version=2.0"
                    },
                    {
                        "base": "application/json",
                        "type": "application/vnd.openstack.identity+json;version=2.0"
                    }
                ]
            }
        }
    ],
    "choices_links": ""
}

当对特定版本执行 GET 操作时,应提供版本详细信息作为响应,例如此 Keystone 示例

 {
    "version": {
        "status": "stable",
        "updated": "2014-04-17T00:00:00Z",
        "media-types": [
        {
                "base": "application/json",
                "type": "application/vnd.openstack.identity-v2.0+json"
            },
            {
                "base": "application/xml",
                "type": "application/vnd.openstack.identity-v2.0+xml"
            }
        ],
        "id": "v2.0",
        "links": [
            {
                "href": "http://23.253.228.211:5000/v2.0/",
                "rel": "self"
            },
            {
                "href": "https://docs.openstack.org/api/openstack-identity-service/2.0/content/",
                "type": "text/html",
                "rel": "describedby"
            },
            {
                "href": "https://docs.openstack.org/api/openstack-identity-service/2.0/identity-dev-guide-2.0.pdf",
                "type": "application/pdf",
                "rel": "describedby"
            }
        ]
    }
}

提议的变更

然而,正如 Chad Lung 在 Launchpad 蓝图中指出的那样,几个项目记录并实现了上述版本响应,因此 Barbican 可以遵循相同的方法。Barbican 仅支持 JSON 格式的请求和响应,因此此蓝图将不支持或实现 XML 格式。

Keystone 的 keystone/controllers.py 实现了 GET 请求并构建了版本响应。请注意,MEDIA_TYPE_JSON 应该为 ‘application/vnd.openstack.keymanagement-%s+json’。此文件定义的 ‘Version’ 控制器通过 keystone/routers.py 模块映射到 URI 路径。最后,keystone/service.py 模块构建了最终的 WSGI 应用程序,并包含 routers.py 中定义的版本路由器。

对于 Barbican,barbican/api/controllers/versions.py 中的 VersionController 类可以类似于 Keystone 的 controllers.py 进行修改,但应重命名为 VersionsController 以处理根请求,并添加一个新的 VersionController 以返回特定的版本详细信息响应。

barbican/api/app.py 文件应修改为在当前使用 VersionController 的地方使用新的 VersionsController。请注意,虽然根版本资源将支持未经身份验证的请求,但特定的版本资源请求将需要身份验证。

此外,现在响应根资源构建版本信息仍然需要提供,以支持自动部署和测试过程。此蓝图建议在根资源上添加一个查询参数,例如 ?build_version,该参数将返回类似于当前响应的 JSON 响应,但不包含版本信息,如下所示

{
    "build": "2014.1.dev43.g22d1a96"
}

在下面的“替代方案”部分详细介绍了检索此构建信息的替代方法。

最后,Barbican Python 客户端应更新以利用这些新的版本发现信息,以增强它从 Keystone 服务目录检索到的端点信息。

备选方案

关于利用现有框架生成版本信息,似乎没有 Python 库实现 json-home。

关于构建版本信息,json-home 规范并未解决这个问题,尽管在 IETF 参考的附录 C 中,在标记为“未解决的问题”的部分中,似乎有一个名为“release info?” 的占位符,将来可能会解决这个问题。所以也许我们可以将构建信息添加到根版本响应中。

数据模型影响

无。

REST API 影响

根版本响应将从现在返回的一次性版本信息更改为与 Openstack 一致的响应。需要添加一个特定的版本详细信息响应(例如,对 v1/ 执行 GET 操作时)。当前包含构建版本的根响应需要修改,以便仅在指定查询参数时才返回此信息。

安全影响

无。

通知影响

无。

其他最终用户影响

任何依赖于当前构建版本响应的过程都需要进行修改。使用 Barbican Python 客户端的客户端需要在进行此蓝图中的更改后更新到发布版本。

性能影响

无。

其他部署者影响

无。

开发人员影响

无。

实现

负责人

主要负责人

jaosorior

其他潜在贡献者

john-wood-w chad-lung

工作项

以下 CR 将构建此蓝图

  1. 根据上述建议修改版本相关模块。

2) 在根资源上实现 build_version 查询参数以返回构建版本。

3) 更新 Barbican Python 客户端代码库以查询根资源以获取版本信息,然后将其应用于从 Keystone 服务目录检索到的端点信息。

依赖项

无。

测试

将添加版本资源的单元测试。

文档影响

使用 API 更改更新此页面:https://github.com/cloudkeep/barbican/wiki/Application-Programming-Interface

参考资料

请参阅此蓝图中嵌入的代码和文档参考。

有关 json-home 的信息可在 http://http://tools.ietf.org/html/draft-nottingham-json-home-03 找到。

有关 json-home 讨论的说明可在 2014 年 7 月 Barbican 和 Keystone 的年中会议上找到,网址为 https://etherpad.openstack.org/p/keystone-juno-hackathon