diff options
| -rw-r--r-- | nova/objects/utils.py | 13 | ||||
| -rw-r--r-- | nova/tests/objects/test_objects.py | 7 |
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') |
