summaryrefslogtreecommitdiffstats
path: root/keystone/common
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-08-02 00:34:02 +0000
committerGerrit Code Review <review@openstack.org>2013-08-02 00:34:02 +0000
commit3448ffb5aa8c4794bdb7057280b72971606ad04e (patch)
tree662ed4b43a457c0192e82453d6eee75d571d606e /keystone/common
parent104f04e416d080052e5f8bede8727475898f2741 (diff)
parent3c6cc9e838cacd1f7c0a3cfc89b0f66b23851803 (diff)
downloadkeystone-3448ffb5aa8c4794bdb7057280b72971606ad04e.tar.gz
keystone-3448ffb5aa8c4794bdb7057280b72971606ad04e.tar.xz
keystone-3448ffb5aa8c4794bdb7057280b72971606ad04e.zip
Merge "Handle circular dependencies"
Diffstat (limited to 'keystone/common')
-rw-r--r--keystone/common/dependency.py33
1 files changed, 32 insertions, 1 deletions
diff --git a/keystone/common/dependency.py b/keystone/common/dependency.py
index 3ed261cc..a640031d 100644
--- a/keystone/common/dependency.py
+++ b/keystone/common/dependency.py
@@ -16,6 +16,8 @@
REGISTRY = {}
+_future_dependencies = {}
+
class UnresolvableDependencyException(Exception):
def __init__(self, name):
@@ -32,6 +34,8 @@ def provider(name):
init(self, *args, **kwargs)
REGISTRY[name] = self
+ resolve_future_dependencies(name)
+
return __wrapped_init__
cls.__init__ = wrapped(cls.__init__)
@@ -48,7 +52,13 @@ def requires(*dependencies):
for dependency in self._dependencies:
if dependency not in REGISTRY:
- raise UnresolvableDependencyException(dependency)
+ if dependency in _future_dependencies:
+ _future_dependencies[dependency] += [self]
+ else:
+ _future_dependencies[dependency] = [self]
+
+ continue
+
setattr(self, dependency, REGISTRY[dependency])
def wrapped(cls):
@@ -67,6 +77,26 @@ def requires(*dependencies):
return wrapped
+def resolve_future_dependencies(provider_name=None):
+ if provider_name:
+ targets = _future_dependencies.pop(provider_name, [])
+
+ for target in targets:
+ setattr(target, provider_name, REGISTRY[provider_name])
+
+ return
+
+ try:
+ for dependency, targets in _future_dependencies.iteritems():
+ if dependency not in REGISTRY:
+ raise UnresolvableDependencyException(dependency)
+
+ for target in targets:
+ setattr(target, dependency, REGISTRY[dependency])
+ finally:
+ _future_dependencies.clear()
+
+
def reset():
"""Reset the registry of providers.
@@ -75,3 +105,4 @@ def reset():
"""
REGISTRY.clear()
+ _future_dependencies.clear()