新的图像 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_id、request_id 和 user 字段,以及新的 API /v2/images/{id}/tasks,该 API 将获取与该图像的 image_id 关联的任务并将其返回给用户。此新 API 将返回与图像关联的所有未过期的任务。此过期时间是在任务达到 success 或 failure 的最终状态时使用 glance-api.conf 文件中定义的 task_time_to_live 配置参数计算得出的。如果对于给定的图像没有活动的任务,则它将向用户返回一个空列表。
request-id 将有效地帮助用户了解他的请求发生了什么,为什么他的请求被拒绝,以及当前正在对图像执行什么任务。
user 字段是 request-id 字段的替代方案。通常,客户端工具可以访问/生成 request-ids,但普通用户可能无法访问 request-ids,在这种情况下,user 字段将帮助他们识别他们的特定任务及其状态。因此,从现在开始,任务将与 request-id 或 user 或两者相关联。
有关此 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_id、request-id 和 user 字段。这些字段将为空,不需要任何迁移脚本将此信息添加到现有记录中。
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 多存储的整体文档,以教育部署者有关该功能以及如何/何时使用它。