为 image-list 调用添加 ‘protected’ 过滤器

https://blueprints.launchpad.net/glance/+spec/add-protected-filter

镜像包含一个布尔类型的 ‘protected’ 字段。目前不支持在 image-list 请求中根据此字段进行过滤。然而,使用 ‘protected’ 字段来防止意外删除镜像的操作者和用户会发现这种过滤很有用。不支持对此字段进行过滤与 Glance 支持过滤所有其他镜像字段相悖。

问题描述

用例

  • 一个终端用户想要列出该终端用户可访问的受保护镜像。

  • 一个终端用户想要列出该终端用户可访问的未受保护镜像。

提议的变更

添加代码,以便当 ‘protected=<value>’ 包含在 image-list 调用的查询字符串中时,该值将被转换为布尔值,使其适合于数据库过滤(‘protected’ 字段在数据库后端是一个布尔值)。

为了与 image-create 和 image-update 调用保持一致的用户体验,此参数的唯一接受值将是精确的大小写匹配的 ‘true’ 或 ‘false’。任何其他参数值都应返回 400,以指示错误的请求。

总结

  1. GET v2/images 调用中引入一个新的查询参数,即 protected

  2. 该参数将作为对镜像的 ‘protected’ 字段的过滤器。

  3. 该参数的值集合将是严格的,也就是说,该调用仅接受满足 JSON 布尔数据类型的字符串(换句话说,仅精确的大小写匹配的 ‘true’ 或 ‘false’)。

  4. 未识别的值将导致 400(错误请求)响应,并附带适当的消息。

  5. 当未提供 protected 查询参数时,将不会对镜像的 ‘protected’ 字段进行任何过滤。(换句话说,没有默认值。)

备选方案

  1. 不做任何操作。这实际上不是一个选项,因为即使 ‘protected’ 目前不支持作为过滤器,但将 ‘protected’ 值传递到查询字符串中的 image-list 调用也会被接受并产生影响(API 的行为就像指定了 protected=False)。这种行为对终端用户来说显得很奇怪。

  2. 实现过滤器,但接受宽松的值集合,例如,识别任何大小写组合的 ‘true’ 或 ‘false’;任何大小写组合的 ‘yes’ 或 ‘no’;以及 1 或 0。这可以通过使用 oslo 字符串实用程序来实现,其中包含一个 bool_from_string 函数,该函数将字符串转换为适当的布尔值 [APF-1]。使用 oslo 库还有一个额外的优势,即用法将与其他 OpenStack 项目保持一致。

    这种替代方案的缺点是它与 Images v2 API 中的 image-create 和 image-update 调用不一致。后者的调用受 Image json-schema 约束,该 schema 明确指定 JSON 布尔类型作为 protected 字段的值,因此这些调用仅接受精确的大小写匹配的 ‘true’ 或 ‘false’。因此,在查询字符串中宽松地接受通常被认为是布尔值的字符串可能会导致 API 用户在这些宽松的值对 image-create 或 image-update 无效时感到惊讶,从而导致用户不满。

  3. 实现过滤器,但非常宽松,也就是说,任何未映射到 oslo bool_from_string 函数的布尔值 True 的值都将被视为 False。这实际上不太方便用户。例如,使用法语的发言者应用查询过滤器 ‘protected=oui’ 将收到与请求相反的结果。

数据模型影响

REST API 影响

这是对 GET v2/images 调用的一次非常小的修改。唯一的更改是

  • 现在可以通过 URL 传递的参数包括 protected

安全影响

无。

通知影响

无。

其他最终用户影响

对 python-glanceclient 的唯一影响是命令

glance image-list --property protected=true

现在可以正常工作了。

性能影响

无。

其他部署者影响

无。

开发人员影响

无。

实现

负责人

主要负责人

  • fengzhr

其他贡献者

  • rosmaita

  • dharinic

工作项

依赖项

无。

测试

与当前 image-list 过滤测试一致的功能测试。

文档影响

对 api-ref 中 v2 image-list 文档的小幅补充。

参考资料