~hopem/nova/precise-updates-sru-lp1119248

« back to all changes in this revision

Viewing changes to nova/openstack/common/cfg.py

  • Committer: Package Import Robot
  • Author(s): Adam Gandelman
  • Date: 2012-08-27 14:50:40 UTC
  • mfrom: (79.1.3 precise-proposed)
  • Revision ID: package-import@ubuntu.com-20120827145040-vlkdab5i0smvnhei
Tags: 2012.1.3+stable-20120827-4d2a4afe-0ubuntu1
* New upstream snapshot, fixes FTBFS in -proposed. (LP: #1041120)
* Resynchronize with stable/essex (4d2a4afe):
  - [5d63601] Inappropriate exception handling on kvm live/block migration
    (LP: #917615)
  - [ae280ca] Deleted floating ips can cause instance delete to fail
    (LP: #1038266)

Show diffs side-by-side

added added

removed removed

Lines of Context:
221
221
 
222
222
import collections
223
223
import copy
 
224
import functools
224
225
import optparse
225
226
import os
226
227
import string
227
228
import sys
228
229
 
229
 
import iniparser
 
230
from nova.openstack.common import iniparser
230
231
 
231
232
 
232
233
class Error(Exception):
821
822
                                              usage=self.usage)
822
823
        self._cparser = None
823
824
 
 
825
        self.__cache = {}
 
826
 
824
827
        self.register_cli_opt(
825
828
            MultiStrOpt('config-file',
826
829
                        default=self.default_config_files,
830
833
                             'files taking precedence. The default files used '
831
834
                             'are: %s' % (self.default_config_files, )))
832
835
 
 
836
    def __clear_cache(f):
 
837
        @functools.wraps(f)
 
838
        def __inner(self, *args, **kwargs):
 
839
            if kwargs.pop('clear_cache', True):
 
840
                self.__cache.clear()
 
841
            return f(self, *args, **kwargs)
 
842
 
 
843
        return __inner
 
844
 
833
845
    def __call__(self, args=None):
834
846
        """Parse command line arguments and config files.
835
847
 
864
876
        :returns: the option value (after string subsititution) or a GroupAttr
865
877
        :raises: NoSuchOptError,ConfigFileValueError,TemplateSubstitutionError
866
878
        """
867
 
        return self._substitute(self._get(name))
 
879
        return self._get(name)
868
880
 
869
881
    def __getitem__(self, key):
870
882
        """Look up an option value and perform string substitution."""
883
895
        """Return the number of options and option groups."""
884
896
        return len(self._opts) + len(self._groups)
885
897
 
 
898
    @__clear_cache
886
899
    def reset(self):
887
900
        """Reset the state of the object to before it was called."""
888
901
        self._args = None
889
902
        self._cli_values = None
890
903
        self._cparser = None
891
904
 
 
905
    @__clear_cache
892
906
    def register_opt(self, opt, group=None):
893
907
        """Register an option schema.
894
908
 
911
925
 
912
926
        return True
913
927
 
 
928
    @__clear_cache
914
929
    def register_opts(self, opts, group=None):
915
930
        """Register multiple option schemas at once."""
916
931
        for opt in opts:
917
 
            self.register_opt(opt, group)
 
932
            self.register_opt(opt, group, clear_cache=False)
918
933
 
 
934
    @__clear_cache
919
935
    def register_cli_opt(self, opt, group=None):
920
936
        """Register a CLI option schema.
921
937
 
931
947
        if self._args is not None:
932
948
            raise ArgsAlreadyParsedError("cannot register CLI option")
933
949
 
934
 
        if not self.register_opt(opt, group):
 
950
        if not self.register_opt(opt, group, clear_cache=False):
935
951
            return False
936
952
 
937
953
        if group is not None:
941
957
 
942
958
        return True
943
959
 
 
960
    @__clear_cache
944
961
    def register_cli_opts(self, opts, group=None):
945
962
        """Register multiple CLI option schemas at once."""
946
963
        for opt in opts:
947
 
            self.register_cli_opt(opt, group)
 
964
            self.register_cli_opt(opt, group, clear_cache=False)
948
965
 
949
966
    def register_group(self, group):
950
967
        """Register an option group.
959
976
 
960
977
        self._groups[group.name] = copy.copy(group)
961
978
 
 
979
    @__clear_cache
962
980
    def set_override(self, name, override, group=None):
963
981
        """Override an opt value.
964
982
 
973
991
        opt_info = self._get_opt_info(name, group)
974
992
        opt_info['override'] = override
975
993
 
 
994
    @__clear_cache
976
995
    def set_default(self, name, default, group=None):
977
996
        """Override an opt's default value.
978
997
 
1056
1075
        self._oparser.print_help(file)
1057
1076
 
1058
1077
    def _get(self, name, group=None):
 
1078
        if isinstance(group, OptGroup):
 
1079
            key = (group.name, name)
 
1080
        else:
 
1081
            key = (group, name)
 
1082
        try:
 
1083
            return self.__cache[key]
 
1084
        except KeyError:
 
1085
            value = self._substitute(self._do_get(name, group))
 
1086
            self.__cache[key] = value
 
1087
            return value
 
1088
 
 
1089
    def _do_get(self, name, group=None):
1059
1090
        """Look up an option value.
1060
1091
 
1061
1092
        :param name: the opt name (or 'dest', more precisely)
1196
1227
 
1197
1228
        def __getattr__(self, name):
1198
1229
            """Look up an option value and perform template substitution."""
1199
 
            return self.conf._substitute(self.conf._get(name, self.group))
 
1230
            return self.conf._get(name, self.group)
1200
1231
 
1201
1232
        def __getitem__(self, key):
1202
1233
            """Look up an option value and perform string substitution."""