Spec: Add a v2 API endpoint to push DataFrame objects
See specs/train/add_push_dataframes_api_endpoint.rst for details. Depends-On: https://review.opendev.org/#/c/668669/ Change-Id: Ieb48eb72fcb6165d32c08b95ea61be5ffc7d0e92 Story: 2005890 Task: 35954
This commit is contained in:
parent
782a9cda08
commit
ccc71e4f5e
209
specs/train/add_push_dataframes_api_endpoint.rst
Normal file
209
specs/train/add_push_dataframes_api_endpoint.rst
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
..
|
||||||
|
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 push DataFrame objects
|
||||||
|
===============================================
|
||||||
|
|
||||||
|
https://storyboard.openstack.org/#!/story/2005890
|
||||||
|
|
||||||
|
CloudKitty needs an endpoint in its v2 API to push 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
|
||||||
|
===================
|
||||||
|
|
||||||
|
With the current state of CloudKitty, the only way to import
|
||||||
|
DataFrames into the CloudKitty storage is to load a storage driver and to call
|
||||||
|
the ``push`` method but it is impossible through the CloudKitty API.
|
||||||
|
|
||||||
|
This inconvenience prevents CloudKitty from having external processors being able to
|
||||||
|
easily push data into its storage. e.g. CloudKitty cannot have DataFrame fixtures
|
||||||
|
provisioned so it can be functionally tested with OpenStack Tempest.
|
||||||
|
|
||||||
|
A new admin API endpoint is needed to allow this.
|
||||||
|
|
||||||
|
The Tempest tests would also enable a more efficient workflow for validating forthcoming
|
||||||
|
features and therefore improve the overall quality and stability of them in a long term
|
||||||
|
goal and, more generally speaking, having this feature implemented would also represent
|
||||||
|
an opportunity to anyone to extend their usage of CloudKitty in a more handy and flexible
|
||||||
|
way.
|
||||||
|
|
||||||
|
Proposed Change
|
||||||
|
===============
|
||||||
|
|
||||||
|
A new endpoint will be made available to admin users on ``POST /v2/dataframes``.
|
||||||
|
This will allow end users to push DataFrames in the form of JSON objects.
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
We could keep the old way, but external processors would need to be written in Python
|
||||||
|
to be able to load the storage driver modules plus they would need the storage backend
|
||||||
|
credentials exposed to them.
|
||||||
|
|
||||||
|
Otherwise CloudKitty could be provisioned by using more hackish ways
|
||||||
|
such as manipulating directly the storage backend and the database metadata but
|
||||||
|
this is a laborious and error-prone process that should definitely be avoided.
|
||||||
|
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This will add an endpoint on ``/v2/dataframes`` with support for the ``POST``
|
||||||
|
HTTP method.
|
||||||
|
|
||||||
|
The endpoint will support the following body parameters:
|
||||||
|
|
||||||
|
* ``dataframes``: (required)
|
||||||
|
A json array describing DataFrame objects (see below for details).
|
||||||
|
|
||||||
|
Inside the body of the request, a collection of DataFrame json objects
|
||||||
|
can be specified as follows:
|
||||||
|
|
||||||
|
.. code-block:: javascript
|
||||||
|
|
||||||
|
{
|
||||||
|
"dataframes": [
|
||||||
|
# first DataFrame
|
||||||
|
{
|
||||||
|
"period": {
|
||||||
|
"begin": "20190723T122810Z", # valid ISO 8601 datetime format
|
||||||
|
"end": "20190723T132810Z" # valid ISO 8601 datetime format
|
||||||
|
},
|
||||||
|
"usage": {
|
||||||
|
"metric_one": [ # list of DataPoint json objects
|
||||||
|
{
|
||||||
|
"vol": {
|
||||||
|
"unit": "GiB",
|
||||||
|
"qty": 1.2
|
||||||
|
},
|
||||||
|
"rating": {
|
||||||
|
"price": 0.04
|
||||||
|
},
|
||||||
|
"groupby": {
|
||||||
|
"group_one": "one",
|
||||||
|
"group_two": "two"
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"attr_one": "one",
|
||||||
|
"attr_two": "two"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# { second DataPoint for metric_one here }
|
||||||
|
],
|
||||||
|
"metric_two": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# { second DataFrame here }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
The expected HTTP success response code for a ``POST`` on this endpoint
|
||||||
|
is ``204 No Content``. This decision have been made in order to reduce
|
||||||
|
the network bandwidth consumption for this kind of operation.
|
||||||
|
The user will be able to consult DataFrames through a ``GET /v2/dataframes``
|
||||||
|
endpoint that will be available in the future.
|
||||||
|
|
||||||
|
Expected HTTP error response codes for a ``POST`` request on this endpoint are:
|
||||||
|
|
||||||
|
* ``400 Bad Request``: Malformed request.
|
||||||
|
|
||||||
|
* ``401 Unauthorized``: The user is not authenticated.
|
||||||
|
|
||||||
|
* ``403 Forbidden``: The user is not authorized to push DataFrame objects.
|
||||||
|
|
||||||
|
This endpoint will only be authorized for administrator end users.
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Any user with access to this endpoint will be able to alterate data on
|
||||||
|
the target platform which is an action carrying heavy side effects.
|
||||||
|
Thus, access to this endpoint should be granted to non admin users with
|
||||||
|
uttermost concern or not at all if possible.
|
||||||
|
|
||||||
|
Notifications Impact
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
The client will also be updated to include a function and a CLI command
|
||||||
|
allowing to push DataFrame objects.
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Importing DataFrame objects of any nature to CloudKitty will now be
|
||||||
|
an easy process. This will be handy to provision CloudKitty if felt
|
||||||
|
necessary.
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Importing DataFrame objects will allow to push fixtures into
|
||||||
|
the CloudKitty storage and therefore to add scenarios to the Tempest plugin.
|
||||||
|
This will be handy to write integration tests afterwards.
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
<jferrieu>
|
||||||
|
|
||||||
|
Other contributors:
|
||||||
|
<peschk_l>
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
* Implement the API endpoint with unit tests.
|
||||||
|
|
||||||
|
* Add tempest tests.
|
||||||
|
|
||||||
|
* Support this endpoint in the client.
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
This endpoint depends on the DataFrame and DataPoint objects specification:
|
||||||
|
|
||||||
|
* Spec: https://review.opendev.org/#/c/668669/
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
Unit tests and Tempest tests for this endpoint will be added.
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
The endpoint will be added to the API reference.
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
Spec: Add a v2 API endpoint to push dataframe objects:
|
||||||
|
|
||||||
|
https://review.opendev.org/#/c/668669/
|
Loading…
Reference in New Issue
Block a user