summaryrefslogtreecommitdiffstats
path: root/keystone/openstack
diff options
context:
space:
mode:
authorMark McLoughlin <markmc@redhat.com>2012-09-05 11:55:49 +0100
committerMark McLoughlin <markmc@redhat.com>2012-09-05 13:08:34 +0100
commit7d9b239990d25b04f7af57835577437eb5ca4602 (patch)
treea26ae299effb093e29b490d5c4a240bd54e313fd /keystone/openstack
parente09a12138494e78055f03afa68da661befaa16c4 (diff)
downloadkeystone-7d9b239990d25b04f7af57835577437eb5ca4602.tar.gz
keystone-7d9b239990d25b04f7af57835577437eb5ca4602.tar.xz
keystone-7d9b239990d25b04f7af57835577437eb5ca4602.zip
Sync some misc changes from openstack-common
Syncs the following changes from stable/folsom: 769ec65 Don't trap then re-raise ImportError. 202b8b7 Fix spelling typos 01b4f31 Support for marshalling datetime while preserving microseconds. c11a0d4 Remove unused imports 9e1bd9d Add missing convert_instances arg. 2d6f847 Track to_primitive() depth after iteritems(). 8c74b37 Improve exception from importutils.import_class(). 1fb2361 add import_object_ns function Change-Id: Id5885f4a00207cf70f15f195a154c45903111b8b
Diffstat (limited to 'keystone/openstack')
-rw-r--r--keystone/openstack/common/importutils.py19
-rw-r--r--keystone/openstack/common/jsonutils.py6
-rw-r--r--keystone/openstack/common/timeutils.py23
3 files changed, 41 insertions, 7 deletions
diff --git a/keystone/openstack/common/importutils.py b/keystone/openstack/common/importutils.py
index b507d22e..f45372b4 100644
--- a/keystone/openstack/common/importutils.py
+++ b/keystone/openstack/common/importutils.py
@@ -20,6 +20,7 @@ Import related utilities and helper functions.
"""
import sys
+import traceback
def import_class(import_str):
@@ -28,9 +29,10 @@ def import_class(import_str):
try:
__import__(mod_str)
return getattr(sys.modules[mod_str], class_str)
- except (ImportError, ValueError, AttributeError), exc:
+ except (ValueError, AttributeError), exc:
raise ImportError('Class %s cannot be found (%s)' %
- (class_str, str(exc)))
+ (class_str,
+ traceback.format_exception(*sys.exc_info())))
def import_object(import_str, *args, **kwargs):
@@ -38,6 +40,19 @@ def import_object(import_str, *args, **kwargs):
return import_class(import_str)(*args, **kwargs)
+def import_object_ns(name_space, import_str, *args, **kwargs):
+ """
+ Import a class and return an instance of it, first by trying
+ to find the class in a default namespace, then failing back to
+ a full path if not found in the default namespace.
+ """
+ import_value = "%s.%s" % (name_space, import_str)
+ try:
+ return import_class(import_value)(*args, **kwargs)
+ except ImportError:
+ return import_class(import_str)(*args, **kwargs)
+
+
def import_module(import_str):
"""Import a module."""
__import__(import_str)
diff --git a/keystone/openstack/common/jsonutils.py b/keystone/openstack/common/jsonutils.py
index ea409e49..0828a705 100644
--- a/keystone/openstack/common/jsonutils.py
+++ b/keystone/openstack/common/jsonutils.py
@@ -107,9 +107,11 @@ def to_primitive(value, convert_instances=False, level=0):
elif hasattr(value, 'iteritems'):
return to_primitive(dict(value.iteritems()),
convert_instances=convert_instances,
- level=level)
+ level=level + 1)
elif hasattr(value, '__iter__'):
- return to_primitive(list(value), level)
+ return to_primitive(list(value),
+ convert_instances=convert_instances,
+ level=level)
elif convert_instances and hasattr(value, '__dict__'):
# Likely an instance of something. Watch for cycles.
# Ignore class member vars.
diff --git a/keystone/openstack/common/timeutils.py b/keystone/openstack/common/timeutils.py
index 5eeaf70a..c4f6cf04 100644
--- a/keystone/openstack/common/timeutils.py
+++ b/keystone/openstack/common/timeutils.py
@@ -21,7 +21,6 @@ Time related utilities and helper functions.
import calendar
import datetime
-import time
import iso8601
@@ -94,16 +93,34 @@ def set_time_override(override_time=datetime.datetime.utcnow()):
def advance_time_delta(timedelta):
- """Advance overriden time using a datetime.timedelta."""
+ """Advance overridden time using a datetime.timedelta."""
assert(not utcnow.override_time is None)
utcnow.override_time += timedelta
def advance_time_seconds(seconds):
- """Advance overriden time by seconds."""
+ """Advance overridden time by seconds."""
advance_time_delta(datetime.timedelta(0, seconds))
def clear_time_override():
"""Remove the overridden time."""
utcnow.override_time = None
+
+
+def marshall_now(now=None):
+ """Make an rpc-safe datetime with microseconds.
+
+ Note: tzinfo is stripped, but not required for relative times."""
+ if not now:
+ now = utcnow()
+ return dict(day=now.day, month=now.month, year=now.year, hour=now.hour,
+ minute=now.minute, second=now.second,
+ microsecond=now.microsecond)
+
+
+def unmarshall_time(tyme):
+ """Unmarshall a datetime dict."""
+ return datetime.datetime(day=tyme['day'], month=tyme['month'],
+ year=tyme['year'], hour=tyme['hour'], minute=tyme['minute'],
+ second=tyme['second'], microsecond=tyme['microsecond'])