实现计算哈希 API¶
https://blueprints.launchpad.net/glance/+spec/calculate-hash-api
问题描述¶
当镜像处于 active 状态但没有 os_hash_value 和 checksum 时,将存在 2 种情况,
在实现新的添加位置 API [1] 时,发现有些镜像在将位置添加到镜像后,如果哈希计算失败,将仍然处于“active”状态,而没有 checksum 和 os_hash_value。
一些由实例快照或卷快照(当 Glance 后端为 Cinder 时,通过上传卷操作创建的镜像)等消费者创建的旧镜像可能也没有 checksum、os_hash_value 和 os_hash_algo 设置。
目前没有其他方法可以为这些镜像计算哈希值。
提议的变更¶
我们计划添加一个新的仅限管理员访问的 API,用于计算处于 active 状态的镜像的 os_hash_value 和 checksum。
此 API 的处理方式如下
由于哈希计算将是一个长时间运行的操作,它将在异步任务中通过在计算过程开始之前设置 os_hash_algo 的值在后台执行。如果哈希计算失败,将通过使用现有的配置选项
http_retries进行最大重试次数的重试机制。如果所有重试后,哈希计算仍然失败,我们将不会更新哈希和 checksum 值,镜像将保持在active状态,并且 os_hash_algo 将恢复为 None。如果在计算镜像的哈希值期间尝试删除镜像,则从存储读取数据时会出现不同的响应,
RBD 在读取数据时会抛出 ImageNotFound,但会从后端删除数据,并且即使删除调用失败并出现 InUseByStore 错误,镜像仍将保持在 active 状态。为此问题报告了一个错误 [1]。在这种情况下,作为一种解决方法,哈希计算将被标记为失败,并附带适当的日志消息,如果删除 API 没有将其标记为 deleted,则镜像将被标记为 deleted。
文件系统后端会抛出 NotFound,因为删除操作是成功的。
Swift 允许在读取数据或镜像下载期间删除镜像。
Cinder 后端不允许删除镜像,因为在从卷读取数据或下载镜像时,卷将处于使用中状态。
由于这是一个异步 API 调用,管理员可以使用 API /v2/images/{id}/tasks 来检查任务的进度。
我们将引入一个新的仅限管理员访问的策略 calculate_hash。
备选方案¶
我们可以在 glance-manage 下创建一个单独的新命令,从 cron 运行。
数据模型影响¶
无
REST API 影响¶
新的 API
计算哈希
本规范提出以下新的端点
POST /v2/images/{image_id}/hash
JSON 请求体
{ "os_hash_algo": "sha512" }
响应 - Accepted - 202
- 错误 - 409(如果镜像不在 ACTIVE 状态),
403(普通用户禁止) 400(如果传递了无效的 os_hash_algo) 404(镜像 ID 不存在)
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
需要对 glanceclient 和 openstackclient 进行更改,才能仅向管理员公开。
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
pranali-deore
- 其他贡献者
无
工作项¶
使用单元/功能测试实现 API
在 api-ref 中记录 API
编写 tempest 测试来检查这些 API
在 OSC/SDK 中实现支持
在 glanceclient 中实现支持
添加有关新 API 行为的文档
依赖项¶
无
测试¶
Glance 中的单元和功能测试。针对相同的 Tempest 测试。
文档影响¶
需要使用新的 API 扩展和用法更新文档。