Spec - 添加结果过滤支持

蓝图

Sahara 服务:https://blueprints.launchpad.net/sahara/+spec/enable-result-filtering

客户端库:https://blueprints.launchpad.net/python-saharaclient/+spec/enable-result-filtering

Horizon UI:https://blueprints.launchpad.net/horizon/+spec/data-processing-table-filtering

由于在处理非平凡的 OpenStack 环境时,结果集可能非常大,因此能够通过某些字段约束来过滤这些结果集是可取的。本规范概述了 Sahara 如何支持此类查询。API、客户端库和 Horizon UI 都需要进行更改。

问题描述

最初的需求来自于我们希望提供一种过滤 UI 中某些表格的方法。为了使这种过滤成为可能,要么 UI 必须执行过滤(效率低下,因为 API 仍然会返回大型结果集),要么 API/客户端库需要提供对此类过滤的支持。在审查了其他 API/客户端库后,看起来大多数(如果不是全部)都提供了过滤功能。Sahara 也应该实现过滤功能。

提议的变更

为了实现过滤功能,客户端库中的每个“list()”方法都应扩展为接受一个可选(默认值为 None)参数“search_opts”。“search_opts”应该是一个字典,其中包含一个或多个 {field:query} 条目。分页也可以通过允许设置 page/page_size/max results 来通过 search_opts 处理。

此外,REST API 需要扩展 list() 操作以支持查询语法。这将需要更改 Sahara 当前执行数据库查询的方式,以包含查询选项。目前,它们设置为仅为每次调用返回所有条目。

替代方案

过滤可以在 UI 中完全完成,但这是一种浪费的方式,因为每次库/API 调用仍然会返回完整的结果集。此外,REST API 或客户端库的用户将无法从该功能中受益。

也可以只在客户端库级别实现过滤,但出于与在 UI 中执行过滤相同的理由,这种方法也是次优的。

数据模型影响

不需要对模型本身进行更改。只需要更改我们查询数据库的方式。

REST API 影响

list 操作的 REST API 方法需要更改以支持查询风格的参数。基础数据库访问方法需要从基本“获取全部”功能更改为支持 **kwargs 参数(这已经在 cluster_get_all() 中完成,但需要对其他方法进行完成)。

对于作业执行表进行过滤时,需要考虑一对特殊情况。“job”和“cluster”列实际上包含 job 执行对象本身不包含的信息。对于这些字段的过滤器,应传递一个字段值“job.name”或“cluster.name”。这将触发数据库查询,以连接到作业或集群表上名称属性的过滤器。

此外,搜索作业执行状态字段需要特殊处理。这是因为状态不是作业执行本身的正确字段,而是“info”字段的一部分。为了处理这种情况,将对 info.status 字段进行手动过滤。

其他最终用户影响

REST API、客户端库和 Horizon UI 的用户将能够通过简单的查询来过滤他们的结果集。

部署者影响

这些更改不应影响 Sahara 服务的部署。

开发者影响

对开发人员没有影响。

Sahara-image-elements impact

对 sahara-image-elements 没有影响。

Sahara-dashboard / Horizon 影响

一旦 REST API 和客户端库的更改到位,Horizon UI 将被修改以允许对以下表格进行过滤:集群、集群模板、节点组模板、作业执行、作业。将来,我们也可以在不进行其他 API/客户端库更改的情况下过滤任何表格。

实现

负责人

主要负责人

croberts (Horizon UI)

其他贡献者

tmckay (REST API/sahara.db.api) croberts (客户端库)

工作项

这些可以并行进行,但必须按照以下给定的顺序发布。

  1. REST API 实现

  2. 客户端库实现

  3. Horizon UI 实现

依赖项

测试

应针对 REST 接口、客户端库和 Horizon UI 添加测试,以测试正在添加的过滤功能。

文档影响

需要更新 REST API 的文档以反映查询功能。

需要更新客户端库的文档以反映查询功能。

应更新仪表板用户指南,以说明将添加的表格过滤功能。

参考资料

Sahara 服务:https://blueprints.launchpad.net/sahara/+spec/enable-result-filtering

客户端库:https://blueprints.launchpad.net/python-saharaclient/+spec/enable-result-filtering

Horizon UI:https://blueprints.launchpad.net/horizon/+spec/data-processing-table-filtering