summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-06-05 22:40:38 +0000
committerGerrit Code Review <review@openstack.org>2013-06-05 22:40:38 +0000
commit7f082255d47090c6bb0f8f89dcf13c2c206a4de2 (patch)
tree3305256412e160bca50b317447bcac435c7ddbeb
parentc9695c1d734593a30c5b36626c73e4eb1cb277bc (diff)
parent414e1457632b5eea82274ad8694d2b324d4e200e (diff)
downloadnova-7f082255d47090c6bb0f8f89dcf13c2c206a4de2.tar.gz
nova-7f082255d47090c6bb0f8f89dcf13c2c206a4de2.tar.xz
nova-7f082255d47090c6bb0f8f89dcf13c2c206a4de2.zip
Merge "Make the datetime utility function coerce to UTC"
-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')