Adding pagination and sorting ability to Sahara¶
https://blueprints.launchpad.net/sahara/+spec/pagination
This specification describes an option for pagination ability which will admit to work with objects in Sahara with API, CLI and Dashboard. Also this specification describes sorting ability to Sahara API.
Problem description¶
We are working on adding the ability for pagination to work with objects. But having too many objects to be shown is not very user friendly. We want to implement pagination so the dashboard can split the list of pages making the UI better. User has ability to sort objects by columns in dashboard, but if we add pagination ability, we will need to add sorting ability in API, because ordering on UI side only will cause inconvenience since the service will continue returning pages ordered by the default column.
Proposed change¶
Will be added four optional parameters in API GET requests, which return a lists of objects.
Note
Now elements on lists sorted by date of creation.
marker
- index of the last element on the list, which won’t be in response.
limit
- maximum count of elements in response. This argument must be
positive integer number. If this parameter isn’t passed, in response will be
all the elements which follow the element with id in marker parameter.
Also if marker
parameter isn’t passed, response will contain first
objects of the list with count equal limit
. If both parameters aren’t
passed, API will work as usual.
sort_by
- name of the field of object which will be used by sorting.
If this parameter is passed, objects will be sorting by date of creation,
otherwise by this field.
The field can possess one of the next values for every object:
For Node Group Template:
name
, plugin
, version
, created_at
, updated_at
For Cluster Templates:
name
, plugin
, version
, created_at
, updated_at
For Clusters:
name
, plugin
, version
, status
, instance_count
For Job Binaries and Job Binaries Internal
name
, create
, update
For Data Sources:
name
, type
, create
, update
For Job Templates:
name
, type
, create
, update
For Jobs:
id
, job_template
, cluster
, status
, duration
By default Sahara api will return list in ascending order. Also if the user
wants a descending order list, he can use -
prefix for sort_by
argument.
Examples:
Get list of jobs in ascending order sorted by name.
request
GET http://sahara/v1.1/775181/jobs?sort_by=name
Get list of jobs in descending order sorted by name.
request
GET http://sahara/v1.1/775181/jobs?sort_by=-name
For convenience, collections contain atom “next” and “previous” markers. The first page on the list doesn’t contain a previous marker, the last page on the list doesn’t contain a next link. The following examples illustrate pages in a collection of cluster templates.
Example:
Get one cluster template after template with id=3
.
request
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"
}
}
Example: Let cluster template with id = 5 will be the last of collection. Response will contain only “previous” link.
request
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"
}
}
Alternatives¶
None
Data model impact¶
None
REST API impact¶
Add ability get marker
, limit
, sort_by
parameters
in next requests:
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
Other end user impact¶
None
Deployer impact¶
None
Developer impact¶
None
Sahara-image-elements impact¶
None
Sahara-dashboard / Horizon impact¶
Pagination will be added to Sahara-Dashboard via Horizon abilities. Now we
are using DataTable
class to represent lists of data objects.
This class supports pagination abilities.
Implementation¶
Assignee(s)¶
- Primary assignee:
mlelyakin (mlelyakin@mirantis.com)
Work Items¶
Adding ability of take arguments
marker
,limit
in Sahara APIAdding unit tests for new features.
Adding ability of take argument
sort_by
in Sahara APIAdding this abilities in Sahara CLI Client
Adding this abilities in Dashboard
Documented pagination and sorting features
Dependencies¶
None
Testing¶
Will be covered with unit tests.
Documentation Impact¶
Will be adding to documentation of Sahara API.
References¶
None