diff options
| author | Jenkins <jenkins@review.openstack.org> | 2013-08-02 00:34:02 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2013-08-02 00:34:02 +0000 |
| commit | 3448ffb5aa8c4794bdb7057280b72971606ad04e (patch) | |
| tree | 662ed4b43a457c0192e82453d6eee75d571d606e /keystone/common | |
| parent | 104f04e416d080052e5f8bede8727475898f2741 (diff) | |
| parent | 3c6cc9e838cacd1f7c0a3cfc89b0f66b23851803 (diff) | |
| download | keystone-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.py | 33 |
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() |
