summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Smith <danms@us.ibm.com>2013-06-04 14:43:16 -0700
committerDan Smith <danms@us.ibm.com>2013-06-05 12:46:31 -0700
commit414e1457632b5eea82274ad8694d2b324d4e200e (patch)
tree962d1539a6ede565475f0beaafdb1e449069b852
parent5d9cb7dd354dc1a1eae9985521c0f4b2ea4d876e (diff)
downloadnova-414e1457632b5eea82274ad8694d2b324d4e200e.tar.gz
nova-414e1457632b5eea82274ad8694d2b324d4e200e.tar.xz
nova-414e1457632b5eea82274ad8694d2b324d4e200e.zip
Make the datetime utility function coerce to UTC
Getting datetime objects from existing sources (i.e. sqlalchemy) is problematic because they're "timezone naive". Make the utility function coerce these to UTC for easier conversion. Related to blueprint unified-object-model Change-Id: I61bc6b13f9bd9441d64cc6930e43e921af72a342
-rw-r--r--nova/objects/utils.py13
-rw-r--r--nova/tests/objects/test_objects.py7
2 files changed, 17 insertions, 3 deletions
diff --git a/nova/objects/utils.py b/nova/objects/utils.py
index dd654045c..21ef6faeb 100644
--- a/nova/objects/utils.py
+++ b/nova/objects/utils.py
@@ -15,6 +15,7 @@
"""Utility methods for objects"""
import datetime
+import iso8601
import netaddr
from nova.openstack.common import timeutils
@@ -22,8 +23,16 @@ from nova.openstack.common import timeutils
def datetime_or_none(dt):
"""Validate a datetime or None value."""
- if dt is None or isinstance(dt, datetime.datetime):
- return dt
+ if dt is None:
+ return None
+ elif isinstance(dt, datetime.datetime):
+ if dt.utcoffset() is None:
+ # NOTE(danms): Legacy objects from sqlalchemy are stored in UTC,
+ # but are returned without a timezone attached.
+ # As a transitional aid, assume a tz-naive object is in UTC.
+ return dt.replace(tzinfo=iso8601.iso8601.Utc())
+ else:
+ return dt
raise ValueError('A datetime.datetime is required here')
diff --git a/nova/tests/objects/test_objects.py b/nova/tests/objects/test_objects.py
index cbaf8cb17..e7508ba38 100644
--- a/nova/tests/objects/test_objects.py
+++ b/nova/tests/objects/test_objects.py
@@ -15,6 +15,7 @@
import contextlib
import datetime
import gettext
+import iso8601
import netaddr
gettext.install('nova')
@@ -118,8 +119,12 @@ class TestMetaclass(test.TestCase):
class TestUtils(test.TestCase):
def test_datetime_or_none(self):
- dt = datetime.datetime.now()
+ naive_dt = datetime.datetime.now()
+ dt = timeutils.parse_isotime(timeutils.isotime(naive_dt))
self.assertEqual(utils.datetime_or_none(dt), dt)
+ self.assertEqual(utils.datetime_or_none(dt),
+ naive_dt.replace(tzinfo=iso8601.iso8601.Utc(),
+ microsecond=0))
self.assertEqual(utils.datetime_or_none(None), None)
self.assertRaises(ValueError, utils.datetime_or_none, 'foo')