Spec: Add a v2 API endpoint to retrieve DataFrame objects
See specs/train/add_get_dataframes_api_endpoint.rst for details. Change-Id: I186e7cd1de206f2117a5fb5655e9794469634d79 Story: 2005890 Task: 36383
This commit is contained in:
parent
ccc71e4f5e
commit
7b8906fb16
236
specs/train/add_get_dataframes_api_endpoint.rst
Normal file
236
specs/train/add_get_dataframes_api_endpoint.rst
Normal file
@ -0,0 +1,236 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
===================================================
|
||||
Add a v2 API endpoint to retrieve DataFrame objects
|
||||
===================================================
|
||||
|
||||
https://storyboard.openstack.org/#!/story/2005890
|
||||
|
||||
CloudKitty needs an endpoint in its v2 API to retrieve DataFrame objects.
|
||||
This spec aims at defining what is to be done and why. Everything in
|
||||
this document is open to discussion, equally on the associated
|
||||
storyboard and gerrit.
|
||||
|
||||
Problem Description
|
||||
===================
|
||||
|
||||
Now that there is an endpoint available bound on ``POST /v2/dataframes`` that
|
||||
allows us to push DataFrames objects into the CloudKitty storage backend,
|
||||
we also need a v2 API endpoint to retrieve these objects from it.
|
||||
|
||||
Also this feature is available in the v1 API on ``GET /v1/storage/dataframes``.
|
||||
Therefore it is necessary to have it in the v2 API.
|
||||
|
||||
Proposed Change
|
||||
===============
|
||||
|
||||
The proposed endpoint will support pagination, a dict of filters,
|
||||
a ``begin`` and an ``end`` parameter as ISO 8601 strings that support
|
||||
timezone offsetting e.g. 2019-08-29T07:18:40+00:00.
|
||||
|
||||
It will be available on ``GET /v2/dataframes``.
|
||||
|
||||
Example:
|
||||
|
||||
* Getting all dataframes for ``image.size`` metric type for project X and user Y
|
||||
for a specific week:
|
||||
|
||||
This would result in the following HTTP request::
|
||||
|
||||
GET /v2/dataframes?filter=type:image.size&filter=project_id:X&filter=user_id:Y&begin=2019-05-01T00:00:00&end=2019-05-07T00:00:00
|
||||
|
||||
The feature will also be available to the CloudKitty client library and CLI.
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
None.
|
||||
|
||||
Data model impact
|
||||
-----------------
|
||||
|
||||
None.
|
||||
|
||||
REST API impact
|
||||
---------------
|
||||
|
||||
This will add an endpoint on ``/v2/dataframes`` with support for the ``GET``
|
||||
HTTP method.
|
||||
|
||||
The endpoint will support the following query parameters:
|
||||
|
||||
* ``offset``: (optional, defaults to 0) The offset of the first element that
|
||||
should be returned.
|
||||
|
||||
* ``limit``: (optional, defaults to 100) The maximal number of results to
|
||||
return.
|
||||
|
||||
* ``filter``: (optional) A dict of metadata filters to apply.
|
||||
|
||||
* ``begin``: (optional, defaults to the first day of the month at midnight)
|
||||
start of the period the request should apply to.
|
||||
|
||||
* ``end``: (optional, defaults to the first day of the next month at midnight)
|
||||
end of the period the request should apply to.
|
||||
|
||||
|
||||
A ``GET`` request on this endpoint will return a JSON object of the following
|
||||
format:
|
||||
|
||||
.. code-block:: javascript
|
||||
|
||||
{
|
||||
"total": 2,
|
||||
"dataframes": [
|
||||
{
|
||||
"usage": {
|
||||
"volume.size": [
|
||||
{
|
||||
"vol": {
|
||||
"unit": "GiB",
|
||||
"qty": 1.9
|
||||
},
|
||||
"rating": {
|
||||
"price": 3.8
|
||||
},
|
||||
"groupby": {
|
||||
"project_id": "8ace6f139a1742548e09f1e446bc9737",
|
||||
"user_id": "b28fd3f448c34c17bf70e32886900eed",
|
||||
"id": "be966c6d-78a0-42cf-bab9-e833ed996dee"
|
||||
},
|
||||
"metadata": {
|
||||
"volume_type": ""
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"period": {
|
||||
"begin": "2019-08-01T01:00:00+00:00",
|
||||
"end": "2019-08-01T02:00:00+00:00"
|
||||
}
|
||||
},
|
||||
{
|
||||
"usage": {
|
||||
"image.size": [
|
||||
{
|
||||
"vol": {
|
||||
"unit": "MiB",
|
||||
"qty": 3.55339050293
|
||||
},
|
||||
"rating": {
|
||||
"price": 1.77669525146
|
||||
},
|
||||
"groupby": {
|
||||
"project_id": "5994682e63af4aa8873d247aa28b876e",
|
||||
"user_id": "b28fd3f448c34c17bf70e32886900eed",
|
||||
"id": "f7541950-96d5-4e89-ac76-9d4eacf59b83"
|
||||
},
|
||||
"metadata": {
|
||||
"container_format": "foo",
|
||||
"disk_format": "bar"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"period": {
|
||||
"begin": "2019-08-01T02:00:00+00:00",
|
||||
"end": "2019-08-01T03:00:00+00:00"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
The expected HTTP success response code for a ``GET`` request on this endpoint
|
||||
is ``200 OK``.
|
||||
|
||||
Expected HTTP error response codes for a ``GET`` request on this endpoint are:
|
||||
|
||||
* ``400 Bad Request``: Malformed request.
|
||||
|
||||
* ``403 Forbidden``: The user does not have the necessary rights
|
||||
to retrieve dataframes.
|
||||
|
||||
* ``404 Not Found``: No dataframes were found for the provided parameters.
|
||||
|
||||
This endpoint will be authorized for admins and for the tenant/project owners
|
||||
of the requested dataframes (regarding the specified ``project_id`` filter).
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
|
||||
Any user with access to this endpoint will be able to retrieve information about
|
||||
data rated by CloudKitty. Thus, access to this endpoint should be granted
|
||||
to non-admin users with parsimony.
|
||||
|
||||
Notifications Impact
|
||||
--------------------
|
||||
|
||||
None.
|
||||
|
||||
Other end user impact
|
||||
---------------------
|
||||
|
||||
The client will also be updated in order to include a function and a CLI command
|
||||
allowing to retrieve DataFrame objects.
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
None.
|
||||
|
||||
Other deployer impact
|
||||
---------------------
|
||||
|
||||
Dataframes will be easier to retrieve for admins and deployers.
|
||||
|
||||
Developer impact
|
||||
----------------
|
||||
|
||||
None.
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
<jferrieu>
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
* Implement the API endpoint with unit tests
|
||||
|
||||
* Add tempest tests
|
||||
|
||||
* Support this endpoint in the client with unit and functional tests.
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
None.
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
Tempest tests for this endpoint will be added.
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
The endpoint will be added to the API reference.
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
* Spec: Add DataFrame/DataPoint objects:
|
||||
https://specs.openstack.org/openstack/cloudkitty-specs/specs/train/add_dataframe_datapoint_object.html
|
||||
|
||||
* Spec: Add a v2 API endpoint to push DataFrame objects:
|
||||
https://specs.openstack.org/openstack/cloudkitty-specs/specs/train/add_push_dataframes_api_endpoint.html
|
Loading…
Reference in New Issue
Block a user