新的图像 API /v2/images/{id}/tasks 用于任务信息

https://blueprints.launchpad.net/glance/+spec/messages-api

图像服务现在支持使用 glance 任务导入图像或复制现有图像到多个 glance 存储,但有一个限制,即为了避免竞争条件,不允许同时对单个图像执行一个以上的导入或复制操作。

问题描述

任务 API 不可供普通用户使用。在 Victoria 版本中,我们修复了在多个存储中复制现有图像时的竞争条件,该条件使用“task-id”来获取图像上的锁,以防止对同一图像进行其他导入操作。额外的图像属性“os_glance_import_task”将被用于存储“task id”。我们正在更新任务的‘message’属性,这有助于根据任务的最后更新时间来解除锁,并显示已复制该图像的数据量。复制操作可能需要很长时间,并且普通用户可能不清楚锁何时会被解除或为什么他们的(其他)请求被拒绝,除非联系管理员。

提议变更

向任务数据库添加新的字段 image_idrequest_iduser 字段,以及新的 API /v2/images/{id}/tasks,该 API 将获取与该图像的 image_id 关联的任务并将其返回给用户。此新 API 将返回与图像关联的所有未过期的任务。此过期时间是在任务达到 successfailure 的最终状态时使用 glance-api.conf 文件中定义的 task_time_to_live 配置参数计算得出的。如果对于给定的图像没有活动的任务,则它将向用户返回一个空列表。

request-id 将有效地帮助用户了解他的请求发生了什么,为什么他的请求被拒绝,以及当前正在对图像执行什么任务。

user 字段是 request-id 字段的替代方案。通常,客户端工具可以访问/生成 request-ids,但普通用户可能无法访问 request-ids,在这种情况下,user 字段将帮助他们识别他们的特定任务及其状态。因此,从现在开始,任务将与 request-iduser 或两者相关联。

有关此 API 的更多详细信息,请参阅此规范的 REST API 部分。

备选方案

添加新的 API 端点 /v2/messages/{task_id},该端点将向用户返回相关的任务信息。在这种情况下,用户必须提前知道 task_id。要知道 task_id,他需要调用图像的 GET API 来确定 os_glance_import_task 属性是否已设置为图像。

另一种选择是将任务 show API 暴露给所有用户。目前,任务 API 使用两种不同的策略进行管理;“tasks_api_access”以及 CRUD 级别的策略,例如“add_task”、“get_tasks”等。因此,在这种情况下,我们首先需要将 tasks_api_access 暴露给所有用户(而不是管理员),然后需要将各个级别的策略暴露给最终用户。这可能会令人困惑,需要仔细记录,否则可能会错误地为所有任务 API 提供默认访问权限。

数据模型影响

本规范建议向任务数据库表添加 image_idrequest-iduser 字段。这些字段将为空,不需要任何迁移脚本将此信息添加到现有记录中。

REST API 影响

新的 API

  • 显示与给定图像关联的任务,例如,与图像关联的所有活动(未过期)任务的信息。

常见响应代码

  • 未找到:404 Not Found 包含详细信息。

API 版本

所有 URL 都在 v2 Glance API 下。如果未明确指定,则假定 /v2/<url>

[新的 API] 获取与图像关联的任务

显示与给定图像关联的任务

GET /v2/images/{image_id}/tasks

此 API 不接受任何查询参数,授权后将返回与给定图像关联的任务。如果未找到与图像关联的任何活动任务,则它将向用户返回一个空列表。有效响应示例

{
    "tasks": [
        {
            "task": {
                "id": "ee22890e-8948-4ea6-9668-831f973c84f5",
                "image_id": "dddddddd-dddd-dddd-dddd-dddddddddddd",
                "request-id": "rrrrrrr-rrrr-rrrr-rrrr-rrrrrrrrrrrr",
                "user": "uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu",
                "type": "api_image_import",
                "status": "processing",
                "owner": "64f0efc9955145aeb06f297a8a6fe402",
                "expires_at": null,
                "created_at": "2020-12-18T05:20:38.000000",
                "updated_at": "2020-12-18T05:25:39.000000",
                "deleted_at": null,
                "deleted": false,
                "input": {
                    "image_id": "829c729b-ebc4-4cc7-a164-6f43f1149b17",
                    "import_req": {
                        "method": {"name": "copy-image"},
                        "all_stores": true,
                        "all_stores_must_succeed": false
                    }
                    "backend": [
                        "fast",
                        "cheap",
                        "slow",
                        "reliable",
                        "common"
                    ]
                },
                "result": null,
                "message": "Copied 15 MiB"
            },
        }
    ]
}

响应代码

  • 200 – 授权并成功请求后。响应体包含包含已知存储的 JSON 有效负载。

示例 curl 用法

curl -g -i -X GET -H "X-Auth-Token: $token"
    -H "Content-Type: application/octet-stream"
    $image_url/v2/images/{image_id}/tasks

安全影响

通知影响

其他最终用户影响

本提案引入了其他一些值得注意的用户影响。

Glance 客户端 理想情况下,glance 客户端(CLI + REST 客户端)应根据此规范进行更新。特别是

  • CLI / API 支持从图像获取任务信息。

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

abhishek-kekane

其他贡献者

工作项

实施任务可能包括

  • 添加扩展脚本以向 tasks 数据库添加新字段

  • 修改 tasks 数据层以使用新添加的字段

  • 修改 tasks CRUD 操作以使用新添加的字段

  • 添加对新 API 的支持。

  • 添加 python-glanceclient 支持

  • 添加新 API 的 API 文档

依赖项

测试

  • 需要添加新的单元测试以进行覆盖

文档影响

如“工作项目”部分所述,我们需要确保 glance 文档已更新,以用于

  • 新的从图像获取任务的 REST API。

  • 关于 glance 多存储的整体文档,以教育部署者有关该功能以及如何/何时使用它。

参考资料