灵活的 API 过滤器

https://blueprints.launchpad.net/manila/+spec/like-filter

本规范建议更改 API 过滤器行为,以实现过滤器值的非精确匹配。

问题描述

目前,我们只能通过精确匹配来过滤 manila 资源。这不够灵活,因为客户需要记住完整的共享名称,并且无法通过关键词快速获取共享。然而,对于客户来说,如果支持部分相似的过滤器来通过用户输入检索共享,这将有助于用户灵活地按名称过滤共享,特别是对于管理大量由 manila 管理的共享的用户。

顺便说一下,它已经在许多其他项目中引入,我们可以利用这些现有的机制,nova [1] 和 ironic [2]。在 nova 中,它更改为 sqlalchemy 中的正则表达式过滤器匹配。在 ironic 中,它增加了一种通过名称(正则表达式和通配符)在 API 中过滤节点的方式。

用例

用户拥有大量的共享。他们根据自己的需求使用不同的模板命名它们。并且他们可能希望根据共享名称的一部分过滤共享。 “描述”的情况也一样。

提议的变更

值得一提的是,此功能也已在 cinder [4] 中提出,并且依赖于通用的资源过滤器 [5],但在 manila 中,使 API 行为可配置仍然是一个问题,因此我们将只选择我们想要的部分,同时保持与 cinder 的 API 一致性。

使用 ‘~’ 运算符在过滤器键之后触发类似过滤操作,这也是我们的 API 将呈现的样子

GET /v2/<tenant_id>/shares?name~=test

仅对指定的资源支持类似过滤器(cinder 让管理员通过配置文件做出此决定)

  • 列出共享 (名称, 描述)

  • 列出快照 (名称, 描述)

  • 列出共享网络 (名称, 描述)

  • 列出共享组 (名称, 描述)

Manila 客户端将在 ‘list’ API 中添加新的命令行参数 ‘–name~’ 和 ‘–description~’,以通过非精确匹配过滤 manila 资源。

我们可以提供基于正则表达式过滤器的资源过滤,但我们有可能遇到 ReDos [3] 攻击。考虑到过滤器在这种情况下足够灵活和安全。我们可以引入 ‘LIKE’ 运算符。并且我们可以轻松地将此过滤器应用于现有的 sqlalchemy 过滤函数,并使用 ‘LIKE’ 运算符来过滤资源。

备选方案

另一种选择是我们可以部署 searchlight,它主要关注各种云资源查询,这是一个更广泛的话题。但我们也应该考虑不包含 searchlight 的云环境。

还有另一种选择是用户可以收集所有原始数据并自行进行过滤,但显然这是我们试图避免的,因为它会造成大量的资源浪费。

数据模型影响

REST API 影响

此更改需要 Microversion 升级。

  • 在 list API 接口中添加 name~description~ 参数。这意味着我们可以使用这个新参数进行非精确过滤

    List shares with share name
    
    GET /v2/<tenant_id>/shares?name~=test
    
    Accept: application/json
    
    JSON Response
    
    {
       "shares": [
             {
                "status": "available",
                "export_location": %ip%:/opt/stack/data/manila/mnt/share-%share_id%,
                "name": "test_1",
                ...
           },
           {
                "status": "available",
                "export_location": null,
                "name": "2_test",
                ...
           }
       ]
    }
    
    
    List snapshot with share snapshot name
    
    GET /v2/<tenant_id>/snapshots?name~=snap_test
    
    Accept: application/json
    
    JSON Response
    
    {
       "shares": [
           {
                "status": "available",
                "name": "snap_test_1",
                ...
           },
           {
                "status": "available",
                "name": "snap_test_xxxxx",
                ...
           }
       ]
    }
    

客户端影响

Manila 客户端将在 ‘list’ 中添加新的命令行参数 ‘–name~’ 和 ‘–description~’,以通过非精确匹配过滤 manila 资源

manila list [--name~ <name~>] [--description~ <description~>]

我们假设我们有两个名称为’test_1’、’2_test’的共享,通常如果我们输入此命令,将无法获得任何一个。

manila list --name test

但是,合并此功能后,如果我们输入此命令,我们将获得两者,并且命令相同

manila list --name~ test

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

开发人员应更新过滤函数,以支持精确/非精确过滤(在 DB API 中使用 ‘LIKE’ 运算符过滤资源),每当 list/show API 更改时。

实现

负责人

主要负责人

tommylikehu(tommylikehu@gmail.com) jun.zhongjun(jun.zhongjun2@gmail.com)

工作项

  • 功能测试

  • 实现核心功能

  • 添加相关的单元测试

  • 更新 python-manilaclient

依赖项

测试

  • 添加单元测试和功能测试,以涵盖过滤过程的更改。

文档影响

更新 API 文档。

参考资料

它实际上提出了与 cinder [5] 相同的规范。

[1]: https://review.openstack.org/#/c/45026/ [2]: https://review.openstack.org/#/c/266688/ [3]: https://en.wikipedia.org/wiki/ReDoS [4]: https://review.openstack.org/#/c/442982/ [5]: https://review.openstack.org/#/c/441516/