support symlink with a slave
This commit is contained in:
parent
0b66c96f5e
commit
b8b0d7f6ed
4 changed files with 79 additions and 17 deletions
|
@ -200,6 +200,17 @@ def test_groups_with_master_in_config():
|
||||||
assert interface1.impl_get_group_type() == groups.master
|
assert interface1.impl_get_group_type() == groups.master
|
||||||
|
|
||||||
|
|
||||||
|
def test_groups_with_master_make_dict():
|
||||||
|
ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
|
||||||
|
netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
|
||||||
|
interface1 = MasterSlaves('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
||||||
|
od = OptionDescription('root', '', [interface1])
|
||||||
|
api = getapi(Config(od))
|
||||||
|
assert api.option.make_dict() == {'ip_admin_eth0.ip_admin_eth0': [], 'ip_admin_eth0.netmask_admin_eth0': []}
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip1', 'ip2'])
|
||||||
|
assert api.option.make_dict() == {'ip_admin_eth0.ip_admin_eth0': ['ip1', 'ip2'], 'ip_admin_eth0.netmask_admin_eth0': [None, None]}
|
||||||
|
|
||||||
|
|
||||||
def test_groups_with_master_hidden_in_config():
|
def test_groups_with_master_hidden_in_config():
|
||||||
ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True, properties=('hidden',))
|
ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True, properties=('hidden',))
|
||||||
netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True, properties=('hidden',))
|
netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True, properties=('hidden',))
|
||||||
|
|
|
@ -200,6 +200,43 @@ def test_symlink_slaves():
|
||||||
raises(ValueError, "MasterSlaves('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])")
|
raises(ValueError, "MasterSlaves('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])")
|
||||||
|
|
||||||
|
|
||||||
|
def test_symlink_with_master():
|
||||||
|
ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
|
||||||
|
netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
|
||||||
|
interface1 = MasterSlaves('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
||||||
|
master = SymLinkOption('master', ip_admin_eth0)
|
||||||
|
od = OptionDescription('root', '', [interface1, master])
|
||||||
|
api = getapi(Config(od))
|
||||||
|
assert api.option.make_dict() == {'ip_admin_eth0.ip_admin_eth0': [], 'ip_admin_eth0.netmask_admin_eth0': [], 'master': []}
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.set(['val1', 'val2'])
|
||||||
|
assert api.option.make_dict() == {'ip_admin_eth0.ip_admin_eth0': ['val1', 'val2'], 'ip_admin_eth0.netmask_admin_eth0': [None, None], 'master': ['val1', 'val2']}
|
||||||
|
|
||||||
|
|
||||||
|
def test_symlink_with_slave():
|
||||||
|
ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
|
||||||
|
netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
|
||||||
|
interface1 = MasterSlaves('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
||||||
|
slave = SymLinkOption('slave', netmask_admin_eth0)
|
||||||
|
od = OptionDescription('root', '', [interface1, slave])
|
||||||
|
api = getapi(Config(od))
|
||||||
|
assert api.option.make_dict() == {'ip_admin_eth0.ip_admin_eth0': [], 'ip_admin_eth0.netmask_admin_eth0': [], 'slave': []}
|
||||||
|
api.option('ip_admin_eth0.ip_admin_eth0').value.set(['val1', 'val2'])
|
||||||
|
assert api.option.make_dict() == {'ip_admin_eth0.ip_admin_eth0': ['val1', 'val2'], 'ip_admin_eth0.netmask_admin_eth0': [None, None], 'slave': [None, None]}
|
||||||
|
#
|
||||||
|
assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None
|
||||||
|
assert api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.get() == None
|
||||||
|
assert api.option('slave', 0).value.get() == None
|
||||||
|
assert api.option('slave', 1).value.get() == None
|
||||||
|
#
|
||||||
|
api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.set('val3')
|
||||||
|
assert api.option.make_dict() == {'ip_admin_eth0.ip_admin_eth0': ['val1', 'val2'], 'ip_admin_eth0.netmask_admin_eth0': [None, 'val3'], 'slave': [None, 'val3']}
|
||||||
|
#
|
||||||
|
assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None
|
||||||
|
assert api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.get() == 'val3'
|
||||||
|
assert api.option('slave', 0).value.get() == None
|
||||||
|
assert api.option('slave', 1).value.get() == 'val3'
|
||||||
|
|
||||||
|
|
||||||
#____________________________________________________________
|
#____________________________________________________________
|
||||||
def test_symlink_dependency():
|
def test_symlink_dependency():
|
||||||
boolopt = BoolOption("b", "", default=False)
|
boolopt = BoolOption("b", "", default=False)
|
||||||
|
@ -211,3 +248,13 @@ def test_symlink_dependency():
|
||||||
assert api.option('c').option.has_dependency() is True
|
assert api.option('c').option.has_dependency() is True
|
||||||
assert api.option('s1.b').option.has_dependency(False) is True
|
assert api.option('s1.b').option.has_dependency(False) is True
|
||||||
assert api.option('c').option.has_dependency(False) is False
|
assert api.option('c').option.has_dependency(False) is False
|
||||||
|
|
||||||
|
def test_symlink_makedict():
|
||||||
|
boolopt = BoolOption("b", "", default=False)
|
||||||
|
linkopt = SymLinkOption("c", boolopt)
|
||||||
|
descr = OptionDescription("opt", "",
|
||||||
|
[linkopt, OptionDescription("s1", "", [boolopt])])
|
||||||
|
api = getapi(Config(descr))
|
||||||
|
assert api.option.make_dict() == {'c': False, 's1.b': False}
|
||||||
|
api.option('s1.b').value.set(True)
|
||||||
|
assert api.option.make_dict() == {'c': True, 's1.b': True}
|
||||||
|
|
|
@ -168,10 +168,11 @@ class CommonTiramisu(TiramisuHelp):
|
||||||
if self.index is not None:
|
if self.index is not None:
|
||||||
if option.impl_is_optiondescription() or not option.impl_is_master_slaves('slave'):
|
if option.impl_is_optiondescription() or not option.impl_is_master_slaves('slave'):
|
||||||
raise APIError('index must be set only with a slave option')
|
raise APIError('index must be set only with a slave option')
|
||||||
if self.index >= self.subconfig.cfgimpl_get_length():
|
self._length = self.subconfig.cfgimpl_get_length_slave(option, self.config_bag)
|
||||||
|
if self.index >= self._length:
|
||||||
raise SlaveError(_('index "{}" is higher than the master length "{}" '
|
raise SlaveError(_('index "{}" is higher than the master length "{}" '
|
||||||
'for option "{}"').format(self.index,
|
'for option "{}"').format(self.index,
|
||||||
self.subconfig.cfgimpl_get_length(),
|
self._length,
|
||||||
option.impl_get_display_name()))
|
option.impl_get_display_name()))
|
||||||
if not self.allow_optiondescription and option.impl_is_optiondescription():
|
if not self.allow_optiondescription and option.impl_is_optiondescription():
|
||||||
raise APIError(_('option must not be an optiondescription'))
|
raise APIError(_('option must not be an optiondescription'))
|
||||||
|
@ -573,17 +574,11 @@ class TiramisuOptionValue(CommonTiramisuOption):
|
||||||
@count
|
@count
|
||||||
def _len(self):
|
def _len(self):
|
||||||
"""length of slave option (only for slave option)"""
|
"""length of slave option (only for slave option)"""
|
||||||
self._get_option()
|
option = self._get_option()
|
||||||
subconfig_path = self._path.rsplit('.', 1)[0]
|
# for example if index is None
|
||||||
if self.config_bag.setting_properties is not None:
|
if '_length' not in vars(self):
|
||||||
self.config_bag.config.cfgimpl_get_settings().validate_properties(self._path,
|
self._length = self.subconfig.cfgimpl_get_length_slave(option, self.config_bag)
|
||||||
self.index,
|
return self._length
|
||||||
self.config_bag)
|
|
||||||
config_bag = self.config_bag.copy('nooption')
|
|
||||||
subconfig = config_bag.config.getattr(subconfig_path,
|
|
||||||
None,
|
|
||||||
config_bag)
|
|
||||||
return subconfig.cfgimpl_get_length()
|
|
||||||
|
|
||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
if name == 'list' and isinstance(self._get_option(), ChoiceOption):
|
if name == 'list' and isinstance(self._get_option(), ChoiceOption):
|
||||||
|
|
|
@ -83,6 +83,16 @@ class SubConfig(object):
|
||||||
def cfgimpl_get_length(self):
|
def cfgimpl_get_length(self):
|
||||||
return self._impl_length
|
return self._impl_length
|
||||||
|
|
||||||
|
def cfgimpl_get_length_slave(self, option, config_bag):
|
||||||
|
if option.impl_is_symlinkoption():
|
||||||
|
context = self.cfgimpl_get_context()
|
||||||
|
sconfig_bag = config_bag.copy('nooption')
|
||||||
|
subconfig, _ = context.cfgimpl_get_home_by_path(option.impl_getopt().impl_getpath(context),
|
||||||
|
sconfig_bag)
|
||||||
|
return subconfig.cfgimpl_get_length()
|
||||||
|
else:
|
||||||
|
return self.cfgimpl_get_length()
|
||||||
|
|
||||||
def reset_one_option_cache(self,
|
def reset_one_option_cache(self,
|
||||||
desc,
|
desc,
|
||||||
values,
|
values,
|
||||||
|
@ -354,7 +364,7 @@ class SubConfig(object):
|
||||||
subpath)
|
subpath)
|
||||||
|
|
||||||
if option.impl_is_master_slaves('slave'):
|
if option.impl_is_master_slaves('slave'):
|
||||||
length = self.cfgimpl_get_length()
|
length = self.cfgimpl_get_length_slave(option, config_bag)
|
||||||
slave_len = self.cfgimpl_get_values()._p_.get_max_length(subpath)
|
slave_len = self.cfgimpl_get_values()._p_.get_max_length(subpath)
|
||||||
if slave_len > length:
|
if slave_len > length:
|
||||||
raise SlaveError(_('slave option "{}" has higher length "{}" than the master '
|
raise SlaveError(_('slave option "{}" has higher length "{}" than the master '
|
||||||
|
@ -364,7 +374,6 @@ class SubConfig(object):
|
||||||
subpath))
|
subpath))
|
||||||
if option.impl_is_master_slaves('slave') and index is None:
|
if option.impl_is_master_slaves('slave') and index is None:
|
||||||
value = []
|
value = []
|
||||||
length = self.cfgimpl_get_length()
|
|
||||||
for idx in range(length):
|
for idx in range(length):
|
||||||
config_bag.properties = None
|
config_bag.properties = None
|
||||||
value.append(self.getattr(name,
|
value.append(self.getattr(name,
|
||||||
|
@ -551,7 +560,7 @@ class SubConfig(object):
|
||||||
option = config_bag.option
|
option = config_bag.option
|
||||||
if not option.impl_is_optiondescription() and option.impl_is_master_slaves('slave'):
|
if not option.impl_is_optiondescription() and option.impl_is_master_slaves('slave'):
|
||||||
ret = []
|
ret = []
|
||||||
length = self.cfgimpl_get_length()
|
length = self.cfgimpl_get_length_slave(option, config_bag)
|
||||||
if length:
|
if length:
|
||||||
for idx in range(length):
|
for idx in range(length):
|
||||||
config_bag.properties = None
|
config_bag.properties = None
|
||||||
|
|
Loading…
Reference in a new issue