Spec: Making CloudKitty timezone-aware
See specs/train/timezone_aware.rst and the associated story for more details. Story: 2005319 Task: 30240 Change-Id: Iebf19852302ce2ae85418ccca07cec9632486b7d
This commit is contained in:
parent
c9fd2bbe8b
commit
1600eee0e2
170
specs/train/timezone_aware.rst
Normal file
170
specs/train/timezone_aware.rst
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
================================
|
||||||
|
Making CloudKitty timezone-aware
|
||||||
|
================================
|
||||||
|
|
||||||
|
Associated story: https://storyboard.openstack.org/#!/story/2005319
|
||||||
|
|
||||||
|
Currently, CloudKitty is not timezone-aware and every timestamp is considered
|
||||||
|
to be UTC. In order to improve user experience, avoid confusion and potential
|
||||||
|
bugs (when doing time object conversions), CloudKitty should be made
|
||||||
|
timezone-aware.
|
||||||
|
|
||||||
|
Problem Description
|
||||||
|
===================
|
||||||
|
|
||||||
|
Internally, CloudKitty manipulates timezone-unaware ``datetime`` objects and
|
||||||
|
timestamps. Every object representing some point in time is considered to be
|
||||||
|
UTC. This can be confusing for users (which expect the timestamps of their data
|
||||||
|
to be in their current timezone) as well as a source of bugs: A ``datetime``
|
||||||
|
object (converted to an iso8601 format timestamp) has no timezone information.
|
||||||
|
There is no guarantee about how this kind of string will be interpreted by
|
||||||
|
another API: as UTC, or in the API's local time ?
|
||||||
|
|
||||||
|
Proposed Change
|
||||||
|
===============
|
||||||
|
|
||||||
|
In order to secure CloudKitty's behaviour about timezones, the following points
|
||||||
|
should be applied:
|
||||||
|
|
||||||
|
* All ``datetime`` objects must be made timezone-aware.
|
||||||
|
|
||||||
|
* CloudKitty must only manipulate ``datetime`` objects. Functions or interfaces
|
||||||
|
accepting several types of objects for parameters containing time information
|
||||||
|
must be changed in order to only accept timezone-aware ``datetime`` objects.
|
||||||
|
|
||||||
|
* The conversion to/from iso8601 timestamps or unix timestamps must be done at
|
||||||
|
the interface level. This means that conversions to/from timezone-aware
|
||||||
|
``datetime`` objects must only be done by CloudKitty's HTTP API and the
|
||||||
|
different drivers (storage, fetcher, collector, messaging...), and only when
|
||||||
|
this type is not supported.
|
||||||
|
|
||||||
|
* Any timezone-unaware object retrieved by the API must be considered as UTC,
|
||||||
|
made timezone-aware and raise a warning.
|
||||||
|
|
||||||
|
* The handling of timezone-aware objects is not consistent between different
|
||||||
|
SQL databases. In consequence, the storage state will still be stored with
|
||||||
|
no timezone information and will be stored as UTC. The storage state driver
|
||||||
|
will be in charge of making objects aware/unaware and will only
|
||||||
|
provide/accept timezone-aware ``datetime`` objects. To avoid complex
|
||||||
|
migrations and inconsistencies, the same rule will apply to the timestamps of
|
||||||
|
dataframes: They will be stored as timezone-unaware timestamps and considered
|
||||||
|
to be UTC. The storage driver will be responsible for the conversions.
|
||||||
|
|
||||||
|
* Client functions querying the v2 API will send iso8601 timestamps with
|
||||||
|
timezone information. If no timezone information is provided in the CLI
|
||||||
|
arguments, they will be considered as local time and adequate timezone
|
||||||
|
information will be added.
|
||||||
|
|
||||||
|
For convenience, microseconds will not be supported for now, and will be set
|
||||||
|
to 0 in all ``datetime`` objects.
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
- Leaving the code as is and making clear in the documentation that everything
|
||||||
|
is UTC. This does not prevent unexpected behaviour when sending
|
||||||
|
timezone-unaware info to other APIs.
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
None, the storage state model is not modified.
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Notifications Impact
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
For v2 API endpoints, timestamps with no timezone information passed to the
|
||||||
|
client will be considered as localtime by the client, and timezone information
|
||||||
|
will be updated accordingly.
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
None. The upgrade will impact neither the state storage nor the dataframes
|
||||||
|
storage as no storage migration will be required. In consequence, the existing
|
||||||
|
data will not be impacted.
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Clear and stricter rules will reduce potential time-related bugs in new
|
||||||
|
features implementation.
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Gerrit topic:
|
||||||
|
timezone-aware
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
peschk_l
|
||||||
|
|
||||||
|
Other contributors:
|
||||||
|
None
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
Some of the following points are highly interdependent and may need to be
|
||||||
|
implemented in the same commit:
|
||||||
|
|
||||||
|
- Removing usage of Unix timestamps from the codebase in order to only
|
||||||
|
manipulate ``datetime`` objects internally.
|
||||||
|
|
||||||
|
- Adding timezone information to all ``datetime`` objects manipulated
|
||||||
|
internally.
|
||||||
|
|
||||||
|
- Make the functions of the client querying the v2 API timezone-aware.
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
- ``python-dateutil``: Library providing extensions to the standard library's
|
||||||
|
``datetime`` module.
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
Unit tests are sufficient until the v2 API has more endpoints. Tempest tests
|
||||||
|
testing v2 API endpoints should be ran with and without timezone information
|
||||||
|
in timestamps to ensure that the API has the expected behaviour.
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
The v2 API documentation and client documentation will include a description
|
||||||
|
of their behaviour with timezone-aware/unaware timestamps.
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
None.
|
Loading…
x
Reference in New Issue
Block a user