better error message if option that does not exists is in root optiondescription

This commit is contained in:
Emmanuel Garette 2019-10-16 07:31:52 +02:00
parent 42291aec51
commit 280d2ebd0a
7 changed files with 43 additions and 27 deletions

View File

@ -4,9 +4,8 @@ do_autopath()
from py.test import raises from py.test import raises
from tiramisu.setting import groups from tiramisu.setting import groups
from tiramisu import Config, MetaConfig from tiramisu import Config, MetaConfig, ChoiceOption, BoolOption, IntOption, \
from tiramisu import ChoiceOption, BoolOption, IntOption, \ StrOption, OptionDescription, groups
StrOption, OptionDescription
from .test_state import _diff_opts, _diff_conf from .test_state import _diff_opts, _diff_conf
from tiramisu.storage import list_sessions from tiramisu.storage import list_sessions
@ -37,15 +36,12 @@ def make_description():
leader = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) leader = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
interface1 = OptionDescription('interface1', '', [leader]) interface1 = OptionDescription('interface1', '', [leader])
interface1.impl_set_group_type(groups.family)
general = OptionDescription('general', '', [numero_etab, nom_machine, general = OptionDescription('general', '', [numero_etab, nom_machine,
nombre_interfaces, activer_proxy_client, nombre_interfaces, activer_proxy_client,
mode_conteneur_actif, mode_conteneur_actif2, mode_conteneur_actif, mode_conteneur_actif2,
adresse_serveur_ntp, time_zone, wantref_option]) adresse_serveur_ntp, time_zone, wantref_option])
general.impl_set_group_type(groups.family)
new = OptionDescription('new', '', [], properties=('hidden',)) new = OptionDescription('new', '', [], properties=('hidden',))
new.impl_set_group_type(groups.family)
creole = OptionDescription('creole', 'first tiramisu configuration', [general, interface1, new]) creole = OptionDescription('creole', 'first tiramisu configuration', [general, interface1, new])
descr = OptionDescription('baseconfig', 'baseconifgdescr', [creole]) descr = OptionDescription('baseconfig', 'baseconifgdescr', [creole])
return descr return descr

View File

@ -11,6 +11,9 @@ from tiramisu.error import LeadershipError, PropertiesOptionError, APIError, Con
from tiramisu.storage import list_sessions from tiramisu.storage import list_sessions
groups.family = groups.GroupType('family')
def teardown_function(function): def teardown_function(function):
assert list_sessions() == [], 'session list is not empty when leaving "{}"'.format(function.__name__) assert list_sessions() == [], 'session list is not empty when leaving "{}"'.format(function.__name__)

View File

@ -7,11 +7,13 @@ do_autopath()
from py.test import raises from py.test import raises
from tiramisu.error import APIError, ConfigError from tiramisu.error import APIError, ConfigError
from tiramisu import IntOption, SymLinkOption, OptionDescription, Config, Calculation from tiramisu import IntOption, SymLinkOption, OptionDescription, Config, Calculation, groups, list_sessions
from tiramisu.setting import groups
from tiramisu.storage import list_sessions
from tiramisu.i18n import _ from tiramisu.i18n import _
try:
groups.family
except:
groups.family = groups.GroupType('family')
def teardown_function(function): def teardown_function(function):
assert list_sessions() == [], 'session list is not empty when leaving "{}"'.format(function.__name__) assert list_sessions() == [], 'session list is not empty when leaving "{}"'.format(function.__name__)

View File

@ -20,7 +20,7 @@ from .option import *
from .error import APIError from .error import APIError
from .api import Config, MetaConfig, GroupConfig, MixConfig from .api import Config, MetaConfig, GroupConfig, MixConfig
from .option import __all__ as all_options from .option import __all__ as all_options
from .setting import owners, undefined from .setting import owners, groups, undefined
from .storage import default_storage, Storage, list_sessions, \ from .storage import default_storage, Storage, list_sessions, \
delete_session delete_session
@ -38,6 +38,8 @@ allfuncs = ['Calculation',
'Config', 'Config',
'APIError', 'APIError',
'undefined', 'undefined',
'owners',
'groups',
'default_storage', 'default_storage',
'Storage', 'Storage',
'list_sessions', 'list_sessions',

View File

@ -27,7 +27,7 @@ from .error import PropertiesOptionError, ConfigError, ConflictError, \
LeadershipError LeadershipError
from .option import SynDynOptionDescription, DynOptionDescription, Leadership from .option import SynDynOptionDescription, DynOptionDescription, Leadership
from .option.baseoption import BaseOption, valid_name from .option.baseoption import BaseOption, valid_name
from .setting import OptionBag, ConfigBag, Settings, undefined from .setting import OptionBag, ConfigBag, Settings, undefined, groups
from .storage import get_storages, gen_storage_id, get_default_values_storages, list_sessions, Cache from .storage import get_storages, gen_storage_id, get_default_values_storages, list_sessions, Cache
from .value import Values from .value import Values
from .i18n import _ from .i18n import _
@ -573,6 +573,7 @@ class _CommonConfig(SubConfig):
def _impl_build_all_caches(self): def _impl_build_all_caches(self):
descr = self.cfgimpl_get_description() descr = self.cfgimpl_get_description()
if not descr.impl_already_build_caches(): if not descr.impl_already_build_caches():
descr._group_type = groups.root
descr._build_cache(display_name=self._display_name) descr._build_cache(display_name=self._display_name)
config_bag = ConfigBag(context=self) config_bag = ConfigBag(context=self)
descr.impl_build_force_store_values(config_bag) descr.impl_build_force_store_values(config_bag)

View File

@ -222,9 +222,14 @@ class OptionDescriptionWalk(CacheOptionDescription):
if name == cname + suffix: if name == cname + suffix:
return child.to_dynoption(subpath, return child.to_dynoption(subpath,
suffix) suffix)
raise AttributeError(_('unknown option "{0}" ' if self.impl_get_group_type() == groups.root:
'in optiondescription "{1}"' raise AttributeError(_('unknown option "{0}" '
'').format(name, self.impl_getname())) 'in root optiondescription'
'').format(name))
else:
raise AttributeError(_('unknown option "{0}" '
'in optiondescription "{1}"'
'').format(name, self.impl_get_display_name()))
def get_children(self, def get_children(self,
config_bag: Union[ConfigBag, Undefined], config_bag: Union[ConfigBag, Undefined],
@ -329,15 +334,16 @@ class OptionDescription(OptionDescriptionWalk):
:param group_type: an instance of `GroupType` or `LeadershipGroupType` :param group_type: an instance of `GroupType` or `LeadershipGroupType`
that lives in `setting.groups` that lives in `setting.groups`
""" """
if self._group_type != groups.default: if __debug__:
raise ValueError(_('cannot change group_type if already set ' if self._group_type != groups.default:
'(old {0}, new {1})').format(self._group_type, raise ValueError(_('cannot change group_type if already set '
group_type)) '(old {0}, new {1})').format(self._group_type,
if not isinstance(group_type, groups.GroupType): group_type))
raise ValueError(_('group_type: {0}' if not isinstance(group_type, groups.GroupType):
' not allowed').format(group_type)) raise ValueError(_('group_type: {0}'
if isinstance(group_type, groups.LeadershipGroupType): ' not allowed').format(group_type))
raise ConfigError('please use Leadership object instead of OptionDescription') if isinstance(group_type, groups.LeadershipGroupType):
raise ConfigError('please use Leadership object instead of OptionDescription')
self._group_type = group_type self._group_type = group_type
def impl_get_group_type(self) -> groups.GroupType: def impl_get_group_type(self) -> groups.GroupType:

View File

@ -175,7 +175,8 @@ class OptionBag:
for key in self.__slots__: for key in self.__slots__:
if key == 'properties' and self.config_bag is undefined: if key == 'properties' and self.config_bag is undefined:
continue continue
setattr(option_bag, key, getattr(self, key)) if hasattr(self, key):
setattr(option_bag, key, getattr(self, key))
return option_bag return option_bag
@ -285,6 +286,11 @@ class GroupModule(_NameSpace):
""" """
pass pass
class RootGroupType(GroupType):
"""root means this is the root optiondescription of whole config
"""
pass
class OwnerModule(_NameSpace): class OwnerModule(_NameSpace):
"""emulates a module to manage unique owner names. """emulates a module to manage unique owner names.
@ -321,9 +327,9 @@ groups.default = groups.DefaultGroupType('default')
leader's option""" leader's option"""
groups.leadership = groups.LeadershipGroupType('leadership') groups.leadership = groups.LeadershipGroupType('leadership')
""" groups.family """ groups.root
example of group, no special behavior with this group's type""" this group is the root optiondescription of whole config"""
groups.family = groups.GroupType('family') groups.root = groups.RootGroupType('root')
# ____________________________________________________________ # ____________________________________________________________