diff options
author | Jenkins <jenkins@review.openstack.org> | 2012-06-15 09:41:30 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2012-06-15 09:41:30 +0000 |
commit | acca07248927ebaff3ef4cf75f5ed8991e89385f (patch) | |
tree | 543ebf0a7e245078cf1097bdabcd2bcf3a6370f6 | |
parent | c3376bb44e7d8cf8c7f57340c967354931428e91 (diff) | |
parent | 787015798b4372deaed6a7e4948b608727dcaed0 (diff) | |
download | nova-acca07248927ebaff3ef4cf75f5ed8991e89385f.tar.gz |
Merge "Add caching to openstack.common.cfg" into stable/essex
-rw-r--r-- | nova/openstack/common/cfg.py | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/nova/openstack/common/cfg.py b/nova/openstack/common/cfg.py index 7adf3b4722..fd1cb83e37 100644 --- a/nova/openstack/common/cfg.py +++ b/nova/openstack/common/cfg.py @@ -221,12 +221,13 @@ log files: import collections import copy +import functools import optparse import os import string import sys -import iniparser +from nova.openstack.common import iniparser class Error(Exception): @@ -821,6 +822,8 @@ class ConfigOpts(collections.Mapping): usage=self.usage) self._cparser = None + self.__cache = {} + self.register_cli_opt( MultiStrOpt('config-file', default=self.default_config_files, @@ -830,6 +833,15 @@ class ConfigOpts(collections.Mapping): 'files taking precedence. The default files used ' 'are: %s' % (self.default_config_files, ))) + def __clear_cache(f): + @functools.wraps(f) + def __inner(self, *args, **kwargs): + if kwargs.pop('clear_cache', True): + self.__cache.clear() + return f(self, *args, **kwargs) + + return __inner + def __call__(self, args=None): """Parse command line arguments and config files. @@ -864,7 +876,7 @@ class ConfigOpts(collections.Mapping): :returns: the option value (after string subsititution) or a GroupAttr :raises: NoSuchOptError,ConfigFileValueError,TemplateSubstitutionError """ - return self._substitute(self._get(name)) + return self._get(name) def __getitem__(self, key): """Look up an option value and perform string substitution.""" @@ -883,12 +895,14 @@ class ConfigOpts(collections.Mapping): """Return the number of options and option groups.""" return len(self._opts) + len(self._groups) + @__clear_cache def reset(self): """Reset the state of the object to before it was called.""" self._args = None self._cli_values = None self._cparser = None + @__clear_cache def register_opt(self, opt, group=None): """Register an option schema. @@ -911,11 +925,13 @@ class ConfigOpts(collections.Mapping): return True + @__clear_cache def register_opts(self, opts, group=None): """Register multiple option schemas at once.""" for opt in opts: - self.register_opt(opt, group) + self.register_opt(opt, group, clear_cache=False) + @__clear_cache def register_cli_opt(self, opt, group=None): """Register a CLI option schema. @@ -931,7 +947,7 @@ class ConfigOpts(collections.Mapping): if self._args is not None: raise ArgsAlreadyParsedError("cannot register CLI option") - if not self.register_opt(opt, group): + if not self.register_opt(opt, group, clear_cache=False): return False if group is not None: @@ -941,10 +957,11 @@ class ConfigOpts(collections.Mapping): return True + @__clear_cache def register_cli_opts(self, opts, group=None): """Register multiple CLI option schemas at once.""" for opt in opts: - self.register_cli_opt(opt, group) + self.register_cli_opt(opt, group, clear_cache=False) def register_group(self, group): """Register an option group. @@ -959,6 +976,7 @@ class ConfigOpts(collections.Mapping): self._groups[group.name] = copy.copy(group) + @__clear_cache def set_override(self, name, override, group=None): """Override an opt value. @@ -973,6 +991,7 @@ class ConfigOpts(collections.Mapping): opt_info = self._get_opt_info(name, group) opt_info['override'] = override + @__clear_cache def set_default(self, name, default, group=None): """Override an opt's default value. @@ -1056,6 +1075,18 @@ class ConfigOpts(collections.Mapping): self._oparser.print_help(file) def _get(self, name, group=None): + if isinstance(group, OptGroup): + key = (group.name, name) + else: + key = (group, name) + try: + return self.__cache[key] + except KeyError: + value = self._substitute(self._do_get(name, group)) + self.__cache[key] = value + return value + + def _do_get(self, name, group=None): """Look up an option value. :param name: the opt name (or 'dest', more precisely) @@ -1196,7 +1227,7 @@ class ConfigOpts(collections.Mapping): def __getattr__(self, name): """Look up an option value and perform template substitution.""" - return self.conf._substitute(self.conf._get(name, self.group)) + return self.conf._get(name, self.group) def __getitem__(self, key): """Look up an option value and perform string substitution.""" |