summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-06-15 09:41:30 +0000
committerGerrit Code Review <review@openstack.org>2012-06-15 09:41:30 +0000
commitacca07248927ebaff3ef4cf75f5ed8991e89385f (patch)
tree543ebf0a7e245078cf1097bdabcd2bcf3a6370f6
parentc3376bb44e7d8cf8c7f57340c967354931428e91 (diff)
parent787015798b4372deaed6a7e4948b608727dcaed0 (diff)
downloadnova-acca07248927ebaff3ef4cf75f5ed8991e89385f.tar.gz
Merge "Add caching to openstack.common.cfg" into stable/essex
-rw-r--r--nova/openstack/common/cfg.py43
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."""