为 Sahara 添加分页和排序功能

https://blueprints.launchpad.net/sahara/+spec/pagination

本文档描述了为 Sahara 的 API、CLI 和 Dashboard 添加分页功能的可选项。同时,本文档也描述了为 Sahara API 添加排序功能。

问题描述

我们正在努力添加对象的分页功能。但是,显示过多的对象对用户来说不太友好。我们希望实现分页功能,以便 Dashboard 可以分割页面列表,从而改善用户界面。用户可以在 Dashboard 中按列对对象进行排序,但如果我们添加分页功能,则需要在 API 中添加排序功能,因为仅在 UI 端进行排序会带来不便,因为服务将继续以默认列的顺序返回页面。

提议的变更

将在返回对象列表的 API GET 请求中添加四个可选参数。

注意

现在列表中的元素按创建日期排序。

marker - 列表中最后一个元素的索引,该元素不会包含在响应中。

limit - 响应中元素的最大数量。此参数必须是正整数。如果未传递此参数,响应将包含所有后续于 marker 参数中 id 对应的元素的列表。 此外,如果未传递 marker 参数,响应将包含列表中的前几个对象,数量等于 limit。 如果未传递这两个参数,API 将像往常一样工作。

sort_by - 用于排序的对象的字段名称。如果传递此参数,对象将按创建日期排序,否则将按此字段排序。

对于每个对象,该字段可以具有以下值之一

对于节点组模板:namepluginversioncreated_atupdated_at

对于集群模板:namepluginversioncreated_atupdated_at

对于集群:namepluginversionstatusinstance_count

对于作业二进制文件和作业二进制文件内部:namecreateupdate

对于数据源:nametypecreateupdate

对于作业模板:nametypecreateupdate

对于作业:idjob_templateclusterstatusduration

默认情况下,Sahara API 将以升序返回列表。 此外,如果用户需要降序列表,可以使用 - 前缀作为 sort_by 参数。

示例

按名称升序排列获取作业列表。

请求 GET http://sahara/v1.1/775181/jobs?sort_by=name

按名称降序排列获取作业列表。

请求 GET http://sahara/v1.1/775181/jobs?sort_by=-name

为了方便起见,集合包含原子“next”和“previous”标记。列表中的第一页不包含 previous 标记,列表中的最后一页不包含 next 链接。以下示例说明了集群模板集合中的页面。

示例

获取 id 为 3 的模板之后的集群模板。

请求

GET http://sahara/v1.0/775181/cluster-templates?limit=1&marker=3

response

{
    "cluster_templates": [
        {
            "name": "cluster-template",
"plugin_name": "vanilla",
            "id": "4",
            "node_groups": [
                {
                    "name": "master",
                },
                {
                    "name": "worker",
                }
            ],
        }
    ],
    "markers":
        {
            "next": "32",
            "previous": "22"
        }
}

示例:如果 id = 5 的集群模板是集合中的最后一个,响应将仅包含“previous”链接。

请求

GET http://sahara/v1.0/775181/cluster-templates?limit=1&marker=4

response

{
   "cluster_templates":[
      {
         "description":"",
         "node_groups":[
            {
               "name":"master",
            },
            {
               "name":"worker",
            }
         ],
         "name":"cluster-template-2",
         "id":"5",
      }
   ],
   "markers":
       {
           "previous": "3"
       }
}

替代方案

数据模型影响

REST API 影响

添加在以下请求中获取 markerlimitsort_by 参数的能力

Sahara API v1.0

GET /v1.0/{tenant_id}/images

GET /v1.0/{tenant_id}/node-group-templates

GET /v1.0/{tenant_id}/cluster-templates

GET /v1.0/{tenant_id}/clusters

Sahara API v1.1

GET /v1.1/{tenant_id}/data-sources

GET /v1.1/{tenant_id}/job-binary-internals

GET /v1.1/{tenant_id}/job-binaries

GET /v1.1/{tenant_id}/jobs

GET /v1.1/{tenant_id}/job-executions

Sahara API v2

GET /v2/cluster-templates

GET /v2/clusters

GET /v2/data_sources

GET /v2/images

GET /v2/job-binaries

GET /v2/jobs

GET /v2/job-templates

GET /v2/node-group-templates

其他最终用户影响

部署者影响

开发者影响

Sahara-image-elements impact

Sahara-dashboard / Horizon 影响

分页将通过 Horizon 的能力添加到 Sahara-Dashboard。现在我们使用 DataTable 类来表示数据对象列表。该类支持分页功能。

实现

负责人

主要负责人

mlelyakin (mlelyakin@mirantis.com)

工作项

  • 添加在 Sahara API 中获取 markerlimit 参数的能力

  • 添加新功能单元测试。

  • 添加在 Sahara API 中获取 sort_by 参数的能力

  • 在 Sahara CLI 客户端中添加这些功能

  • 在 Dashboard 中添加这些功能

  • 记录分页和排序功能

依赖项

测试

将用单元测试覆盖。

文档影响

将添加到 Sahara API 的文档中。

参考资料