实现计算哈希 API

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

问题描述

当镜像处于 active 状态但没有 os_hash_value 和 checksum 时,将存在 2 种情况,

  1. 在实现新的添加位置 API [1] 时,发现有些镜像在将位置添加到镜像后,如果哈希计算失败,将仍然处于“active”状态,而没有 checksum 和 os_hash_value。

  2. 一些由实例快照或卷快照(当 Glance 后端为 Cinder 时,通过上传卷操作创建的镜像)等消费者创建的旧镜像可能也没有 checksum、os_hash_value 和 os_hash_algo 设置。

目前没有其他方法可以为这些镜像计算哈希值。

提议的变更

我们计划添加一个新的仅限管理员访问的 API,用于计算处于 active 状态的镜像的 os_hash_value 和 checksum。

此 API 的处理方式如下

  1. 由于哈希计算将是一个长时间运行的操作,它将在异步任务中通过在计算过程开始之前设置 os_hash_algo 的值在后台执行。如果哈希计算失败,将通过使用现有的配置选项 http_retries 进行最大重试次数的重试机制。如果所有重试后,哈希计算仍然失败,我们将不会更新哈希和 checksum 值,镜像将保持在 active 状态,并且 os_hash_algo 将恢复为 None

  2. 如果在计算镜像的哈希值期间尝试删除镜像,则从存储读取数据时会出现不同的响应,

    • 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 扩展和用法更新文档。

参考资料