diff --git a/locale/fr/LC_MESSAGES/tiramisu.po b/locale/fr/LC_MESSAGES/tiramisu.po index b1e7565..e690849 100644 --- a/locale/fr/LC_MESSAGES/tiramisu.po +++ b/locale/fr/LC_MESSAGES/tiramisu.po @@ -847,7 +847,7 @@ msgstr "" #: tiramisu/option/option.py:294 msgid "the value \"{}\" is not unique" -msgstr "la valeur de \"{}\" n'est pas unique" +msgstr "la valeur \"{}\" n'est pas unique" #: tiramisu/option/option.py:356 msgid "which must not be a list" diff --git a/locale/tiramisu.pot b/locale/tiramisu.pot index 76389de..b9b4dc1 100644 --- a/locale/tiramisu.pot +++ b/locale/tiramisu.pot @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2025-05-12 09:05+0200\n" +"POT-Creation-Date: 2025-06-28 10:15+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -15,95 +15,95 @@ msgstr "" "Generated-By: pygettext.py 1.5\n" -#: tiramisu/api.py:79 +#: tiramisu/api.py:86 msgid "Settings:" msgstr "" -#: tiramisu/api.py:83 +#: tiramisu/api.py:90 msgid "Access to option without verifying permissive properties" msgstr "" -#: tiramisu/api.py:88 +#: tiramisu/api.py:95 msgid "Access to option without property restriction" msgstr "" -#: tiramisu/api.py:93 +#: tiramisu/api.py:100 msgid "Do not warnings during validation" msgstr "" -#: tiramisu/api.py:97 +#: tiramisu/api.py:104 msgid "Commands:" msgstr "" -#: tiramisu/api.py:111 tiramisu/api.py:1857 +#: tiramisu/api.py:118 tiramisu/api.py:1920 msgid "please specify a valid sub function ({0}.{1})" msgstr "" -#: tiramisu/api.py:196 +#: tiramisu/api.py:206 msgid "please do not specify index ({0}.{1})" msgstr "" -#: tiramisu/api.py:201 tiramisu/api.py:856 +#: tiramisu/api.py:211 tiramisu/api.py:906 msgid "please specify index with a follower option ({0}.{1})" msgstr "" -#: tiramisu/api.py:222 +#: tiramisu/api.py:232 msgid "please specify a valid sub function ({0}.{1}): {2}" msgstr "" -#: tiramisu/api.py:446 +#: tiramisu/api.py:493 msgid "the option {0} is not a dynamic option, cannot get identifiers with only_self parameter to True" msgstr "" -#: tiramisu/api.py:532 +#: tiramisu/api.py:581 msgid "cannot get option from a follower symlink without index" msgstr "" -#: tiramisu/api.py:607 +#: tiramisu/api.py:657 msgid "cannot add this property: \"{0}\"" msgstr "" -#: tiramisu/api.py:634 +#: tiramisu/api.py:684 msgid "cannot remove option's property \"{0}\", use permissive instead in option \"{1}\"" msgstr "" -#: tiramisu/api.py:638 +#: tiramisu/api.py:688 msgid "cannot find \"{0}\" in option \"{1}\"" msgstr "" -#: tiramisu/api.py:643 +#: tiramisu/api.py:693 msgid "cannot remove option's property \"{0}\", use permissive instead in option \"{1}\" at index \"{2}\"" msgstr "" -#: tiramisu/api.py:647 +#: tiramisu/api.py:697 msgid "cannot find \"{0}\" in option \"{1}\" at index \"{2}\"" msgstr "" -#: tiramisu/api.py:691 +#: tiramisu/api.py:741 msgid "cannot find \"{0}\"" msgstr "" -#: tiramisu/api.py:873 +#: tiramisu/api.py:923 msgid "only multi value has defaultmulti" msgstr "" -#: tiramisu/api.py:1037 +#: tiramisu/api.py:1087 msgid "please specify a valid sub function ({0}.{1}) for {2}" msgstr "" -#: tiramisu/api.py:1424 +#: tiramisu/api.py:1485 msgid "properties must be a frozenset" msgstr "" -#: tiramisu/api.py:1428 tiramisu/api.py:1455 +#: tiramisu/api.py:1489 tiramisu/api.py:1516 msgid "unknown when {} (must be in append or remove)" msgstr "" -#: tiramisu/api.py:1441 tiramisu/api.py:1465 tiramisu/config.py:1676 +#: tiramisu/api.py:1502 tiramisu/api.py:1526 tiramisu/config.py:1722 msgid "unknown type {}" msgstr "" -#: tiramisu/api.py:1829 +#: tiramisu/api.py:1892 msgid "do not use unrestraint, nowarnings or forcepermissive together" msgstr "" @@ -207,79 +207,83 @@ msgstr "" msgid "unexpected error \"{1}\" in function \"{2}\" for option {0}" msgstr "" -#: tiramisu/config.py:574 +#: tiramisu/config.py:609 msgid "there is no option description for this config (may be GroupConfig)" msgstr "" -#: tiramisu/config.py:663 +#: tiramisu/config.py:698 msgid "no option found in config with these criteria" msgstr "" -#: tiramisu/config.py:978 tiramisu/option/optiondescription.py:74 +#: tiramisu/config.py:1024 tiramisu/option/optiondescription.py:74 msgid "option description seems to be part of an other config" msgstr "" -#: tiramisu/config.py:1140 +#: tiramisu/config.py:1186 msgid "parent of {0} not already exists" msgstr "" -#: tiramisu/config.py:1187 +#: tiramisu/config.py:1233 msgid "cannot set leadership object has root optiondescription" msgstr "" -#: tiramisu/config.py:1190 +#: tiramisu/config.py:1236 msgid "cannot set dynoptiondescription object has root optiondescription" msgstr "" -#: tiramisu/config.py:1242 +#: tiramisu/config.py:1282 +msgid "child must be a Config, GroupConfig, MixConfig or MetaConfig" +msgstr "" + +#: tiramisu/config.py:1290 msgid "config name must be uniq in groupconfig for \"{0}\"" msgstr "" -#: tiramisu/config.py:1453 +#: tiramisu/config.py:1499 msgid "unknown config \"{}\"" msgstr "" -#: tiramisu/config.py:1478 +#: tiramisu/config.py:1524 msgid "child must be a Config, MixConfig or MetaConfig" msgstr "" -#: tiramisu/config.py:1513 +#: tiramisu/config.py:1559 msgid "force_default, force_default_if_same or force_dont_change_value cannot be set with only_config" msgstr "" -#: tiramisu/config.py:1523 +#: tiramisu/config.py:1569 msgid "force_default and force_dont_change_value cannot be set together" msgstr "" -#: tiramisu/config.py:1672 +#: tiramisu/config.py:1718 msgid "config name must be uniq in groupconfig for {0}" msgstr "" -#: tiramisu/config.py:1717 +#: tiramisu/config.py:1763 msgid "config added has no name, the name is mandatory" msgstr "" -#: tiramisu/config.py:1722 +#: tiramisu/config.py:1768 msgid "config name \"{0}\" is not uniq in groupconfig \"{1}\"" msgstr "" -#: tiramisu/config.py:1740 tiramisu/config.py:1746 +#: tiramisu/config.py:1786 tiramisu/config.py:1792 msgid "cannot find the config {0}" msgstr "" -#: tiramisu/config.py:1772 +#: tiramisu/config.py:1818 msgid "MetaConfig with optiondescription must have string has child, not {}" msgstr "" -#: tiramisu/config.py:1784 +#: tiramisu/config.py:1830 msgid "child must be a Config or MetaConfig" msgstr "" -#: tiramisu/config.py:1789 +#: tiramisu/config.py:1835 msgid "all config in metaconfig must have the same optiondescription" msgstr "" -#: tiramisu/config.py:1806 +#: tiramisu/config.py:1852 msgid "metaconfig must have the same optiondescription" msgstr "" @@ -391,23 +395,23 @@ msgstr "" msgid "the \"{0}\" function must not return a list (\"{1}\") for the follower option {2}" msgstr "" -#: tiramisu/error.py:331 +#: tiramisu/error.py:333 msgid "invalid value" msgstr "" -#: tiramisu/error.py:341 +#: tiramisu/error.py:343 msgid "attention, \"{0}\" could be an invalid {1} for {2}" msgstr "" -#: tiramisu/error.py:345 +#: tiramisu/error.py:347 msgid "attention, \"{0}\" could be an invalid {1} for {2} at index \"{3}\"" msgstr "" -#: tiramisu/error.py:366 tiramisu/error.py:377 +#: tiramisu/error.py:368 tiramisu/error.py:379 msgid "\"{0}\" is an invalid {1} for {2}" msgstr "" -#: tiramisu/error.py:368 +#: tiramisu/error.py:370 msgid "\"{0}\" is an invalid {1} for {2} at index \"{3}\"" msgstr "" @@ -499,19 +503,19 @@ msgstr "" msgid "invalid string" msgstr "" -#: tiramisu/option/choiceoption.py:47 +#: tiramisu/option/choiceoption.py:52 msgid "values must be a tuple or a calculation for {0}" msgstr "" -#: tiramisu/option/choiceoption.py:70 +#: tiramisu/option/choiceoption.py:75 msgid "the calculated values \"{0}\" for \"{1}\" is not a list" msgstr "" -#: tiramisu/option/choiceoption.py:101 +#: tiramisu/option/choiceoption.py:106 msgid "only \"{0}\" is allowed" msgstr "" -#: tiramisu/option/choiceoption.py:103 +#: tiramisu/option/choiceoption.py:108 msgid "only {0} are allowed" msgstr "" @@ -728,19 +732,19 @@ msgstr "" msgid "invalid default_multi value \"{0}\" for option {1}, must be a list for a submulti" msgstr "" -#: tiramisu/option/option.py:294 +#: tiramisu/option/option.py:291 msgid "the value \"{}\" is not unique" msgstr "" -#: tiramisu/option/option.py:356 +#: tiramisu/option/option.py:353 msgid "which must not be a list" msgstr "" -#: tiramisu/option/option.py:408 tiramisu/option/option.py:434 +#: tiramisu/option/option.py:408 tiramisu/option/option.py:446 msgid "which must be a list" msgstr "" -#: tiramisu/option/option.py:428 +#: tiramisu/option/option.py:436 msgid "which \"{}\" must be a list of list" msgstr "" @@ -805,27 +809,27 @@ msgstr "" msgid "too weak" msgstr "" -#: tiramisu/option/portoption.py:80 +#: tiramisu/option/portoption.py:77 msgid "inconsistency in allowed range" msgstr "" -#: tiramisu/option/portoption.py:85 +#: tiramisu/option/portoption.py:82 msgid "max value is empty" msgstr "" -#: tiramisu/option/portoption.py:98 +#: tiramisu/option/portoption.py:95 msgid "range must have two values only" msgstr "" -#: tiramisu/option/portoption.py:101 +#: tiramisu/option/portoption.py:98 msgid "first port in range must be smaller than the second one" msgstr "" -#: tiramisu/option/portoption.py:127 +#: tiramisu/option/portoption.py:124 msgid "should be between {0} and {1}" msgstr "" -#: tiramisu/option/portoption.py:129 +#: tiramisu/option/portoption.py:126 msgid "must be between {0} and {1}" msgstr "" @@ -905,19 +909,15 @@ msgstr "" msgid "unknown action {}" msgstr "" -#: tiramisu/value.py:570 tiramisu/value.py:872 +#: tiramisu/value.py:557 tiramisu/value.py:859 msgid "set owner \"{0}\" is forbidden" msgstr "" -#: tiramisu/value.py:577 +#: tiramisu/value.py:564 msgid "\"{0}\" is a default value, so we cannot change owner to \"{1}\"" msgstr "" -#: tiramisu/value.py:751 -msgid "index {index} is greater than the length {length} for option {subconfig.option.impl_get_display_name(with_quote=True)}" -msgstr "" - -#: tiramisu/value.py:858 +#: tiramisu/value.py:845 msgid "information's item not found \"{}\"" msgstr "" diff --git a/tests/config.py b/tests/config.py index 721adf8..7dc49c2 100644 --- a/tests/config.py +++ b/tests/config.py @@ -1,5 +1,4 @@ # from json import dumps, loads -import asyncio from os import environ try: from tiramisu_api import Config @@ -63,3 +62,14 @@ def parse_od_get(dico): else: ret[k.path()] = v return ret + + +def get_dependencies(option): + ret = [] + for a in option.dependencies(): + if a.isoptiondescription(): + ret.append((a.path(), None)) + else: + ret.append((a.path(), a.index())) + ret.sort() + return ret diff --git a/tests/test_choice_option.py b/tests/test_choice_option.py index 1e46fec..260f75a 100644 --- a/tests/test_choice_option.py +++ b/tests/test_choice_option.py @@ -191,7 +191,6 @@ def test_choiceoption_calc_opt_function_propertyerror(): # assert not list_sessions() -#def test_choiceoption_calc_opt_multi_function(config_type): def test_choiceoption_calc_opt_multi_function(): # FIXME config_type = 'tiramisu' diff --git a/tests/test_config_api.py b/tests/test_config_api.py index 7498ef8..8537171 100644 --- a/tests/test_config_api.py +++ b/tests/test_config_api.py @@ -13,12 +13,6 @@ from tiramisu.error import PropertiesOptionError, ValueWarning, ConfigError import warnings -#def teardown_function(function): -# # test_od_not_list emit a warnings because of doesn't create a Config -# with warnings.catch_warnings(record=True) as w: -# assert list_sessions() == [], 'session list is not empty when leaving "{}"'.format(function.__name__) - - def make_description(): gcoption = ChoiceOption('name', 'GC name', ('ref', 'framework'), 'ref') gcdummy = BoolOption('dummy', 'dummy', default=False) diff --git a/tests/test_duplicate_config.py b/tests/test_duplicate_config.py index 44d05b6..c6124f3 100644 --- a/tests/test_duplicate_config.py +++ b/tests/test_duplicate_config.py @@ -80,15 +80,15 @@ def test_copy_force_store_value(): assert conf.value.exportation() == {'creole.general.wantref': {None: [True, 'user']}} assert conf2.value.exportation() == {'creole.general.wantref': {None: [False, 'forced']}} # assert not list_sessions() -# -# -#def test_copy_force_store_value_metaconfig(): -# od1 = make_description() -# meta = MetaConfig([], optiondescription=od1) -# conf = meta.config.new() -# assert meta.property.get() == conf.property.get() -# assert meta.permissive.get() == conf.permissive.get() -# conf.property.read_write() -# assert conf.value.exportation() == {'creole.general.wantref': {None: [False, 'forced']}} -# assert meta.value.exportation() == {} -## assert not list_sessions() + + +def test_copy_force_store_value_metaconfig(): + od1 = make_description() + meta = MetaConfig([], optiondescription=od1) + conf = meta.config.new() + assert meta.property.get() == conf.property.get() + assert meta.permissive.get() == conf.permissive.get() + conf.property.read_write() + assert conf.value.exportation() == {'creole.general.wantref': {None: [False, 'forced']}} + assert meta.value.exportation() == {} +# assert not list_sessions() diff --git a/tests/test_dyn_optiondescription.py b/tests/test_dyn_optiondescription.py index bb83070..bbb645e 100644 --- a/tests/test_dyn_optiondescription.py +++ b/tests/test_dyn_optiondescription.py @@ -1,7 +1,7 @@ # coding: utf-8 from .autopath import do_autopath do_autopath() -from .config import parse_od_get +from .config import parse_od_get, get_dependencies import pytest from tiramisu.setting import groups, owners @@ -336,6 +336,7 @@ def test_prop_dyndescription_force_store_value_calculation_prefix(): od2 = OptionDescription('od', '', [od]) cfg = Config(od2) cfg.property.read_write() + assert get_dependencies(cfg.option('od.lst')) == [('od.dodval1', None), ('od.dodval2', None)] assert cfg.option('od.dodval1.st').owner.isdefault() == False assert cfg.option('od.dodval2.st').owner.isdefault() == False assert parse_od_get(cfg.value.get()) == {'od.lst': ['val1', 'val2'], 'od.dodval1.st': 'val1', 'od.dodval2.st': 'val2'} @@ -394,6 +395,8 @@ def test_callback_dyndescription_outside1(): od = OptionDescription('od', '', [dod, out]) od2 = OptionDescription('od', '', [od, lst]) cfg = Config(od2) + # + assert get_dependencies(cfg.option('od.dodval1.st')) == [('od.out', None)] assert parse_od_get(cfg.value.get()) == {'od.dodval1.st': 'val', 'od.dodval2.st': 'val', 'od.out': 'val', 'lst': ['val1', 'val2']} cfg.option('od.dodval1.st').value.set('val1') cfg.option('od.dodval2.st').value.set('val2') @@ -417,6 +420,8 @@ def test_callback_dyndescription_outside2(): assert parse_od_get(cfg.value.get()) == {'od.dodval1.st': None, 'od.dodval2.st': None, 'od.out': None, 'lst': ['val1', 'val2']} cfg.option('od.out').value.set('val1') assert parse_od_get(cfg.value.get()) == {'od.dodval1.st': 'val1', 'od.dodval2.st': 'val1', 'od.out': 'val1', 'lst': ['val1', 'val2']} + # + assert get_dependencies(cfg.option('od.out')) == [('od.dodval1.st', None), ('od.dodval2.st', None)] # assert not list_sessions() @@ -1191,6 +1196,8 @@ def test_leadership_dyndescription(): cfg = Config(od1) owner = cfg.owner.get() # + assert get_dependencies(cfg.option('od.stval1.st1.st2')) == [('od.stval1.st1', None)] + assert get_dependencies(cfg.option('od.stval2.st1.st2')) == [('od.stval2.st1', None)] assert parse_od_get(cfg.value.get()) == {'od.stval2.st1.st1': [], 'od.stval1.st1.st1': []} assert cfg.option('od.stval1.st1.st1').value.get() == [] assert cfg.option('od.stval2.st1.st1').value.get() == [] @@ -1250,6 +1257,9 @@ def test_leadership_dyndescription_force_store_value_leader(): od1 = OptionDescription('od', '', [od]) cfg = Config(od1) cfg.property.read_write() + # + assert get_dependencies(cfg.option('od.stval1.st1.st2')) == [('od.stval1.st1', None)] + assert get_dependencies(cfg.option('od.stval2.st1.st2')) == [('od.stval2.st1', None)] assert cfg.option('od.stval1.st1.st1').owner.isdefault() == False assert cfg.option('od.stval2.st1.st1').owner.isdefault() == False assert cfg.option('od.stval1.st1.st2', 0).owner.isdefault() == True diff --git a/tests/test_leadership.py b/tests/test_leadership.py index 229d0fd..7eb9c1e 100644 --- a/tests/test_leadership.py +++ b/tests/test_leadership.py @@ -1055,7 +1055,7 @@ def test_follower_force_store_value_reset(): # assert not list_sessions() -#def test_follower_properties(): +def test_follower_properties(): 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, properties=('aproperty',)) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) diff --git a/tests/test_mandatory.py b/tests/test_mandatory.py index 8c49ccd..207aa7c 100644 --- a/tests/test_mandatory.py +++ b/tests/test_mandatory.py @@ -13,8 +13,6 @@ from tiramisu.error import PropertiesOptionError, ConfigError from tiramisu.setting import groups -#def teardown_function(function): -# assert list_sessions() == [], 'session list is not empty when leaving "{}"'.format(function.__name__) def is_mandatory(variable): return True @@ -688,25 +686,25 @@ def return_list(val=None, identifier=None): return ['val1', 'val2'] -#def test_mandatory_dyndescription(): -# st = StrOption('st', '', properties=('mandatory',)) -# dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list)) -# od = OptionDescription('od', '', [dod]) -# od2 = OptionDescription('od', '', [od]) -# cfg = Config(od2) -# cfg.property.read_only() -# compare(cfg.value.mandatory(), ['od.dodval1.st', 'od.dodval2.st']) -# -# -#def test_mandatory_dyndescription_context(): -# val1 = StrOption('val1', '', ['val1', 'val2'], multi=True) -# st = StrOption('st', '', properties=('mandatory',)) -# dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list, Params(ParamOption(val1)))) -# od = OptionDescription('od', '', [dod, val1]) -# od2 = OptionDescription('od', '', [od]) -# cfg = Config(od2) -# cfg.property.read_only() -# compare(cfg.value.mandatory(), ['od.dodval1.st', 'od.dodval2.st']) +def test_mandatory_dyndescription(): + st = StrOption('st', '', properties=('mandatory',)) + dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list)) + od = OptionDescription('od', '', [dod]) + od2 = OptionDescription('od', '', [od]) + cfg = Config(od2) + cfg.property.read_only() + compare(cfg.value.mandatory(), ['od.dodval1.st', 'od.dodval2.st']) + + +def test_mandatory_dyndescription_context(): + val1 = StrOption('val1', '', ['val1', 'val2'], multi=True) + st = StrOption('st', '', properties=('mandatory',)) + dod = DynOptionDescription('dod', '', [st], identifiers=Calculation(return_list, Params(ParamOption(val1)))) + od = OptionDescription('od', '', [dod, val1]) + od2 = OptionDescription('od', '', [od]) + cfg = Config(od2) + cfg.property.read_only() + compare(cfg.value.mandatory(), ['od.dodval1.st', 'od.dodval2.st']) def test_mandatory_callback_leader_and_followers_leader(): diff --git a/tests/test_metaconfig.py b/tests/test_metaconfig.py index 582aa3a..9ce25df 100644 --- a/tests/test_metaconfig.py +++ b/tests/test_metaconfig.py @@ -8,7 +8,7 @@ from tiramisu import IntOption, StrOption, NetworkOption, NetmaskOption, BoolOpt Calculation, Params, ParamOption, ParamValue, calc_value, ParamSelfOption, \ valid_network_netmask, valid_not_equal from tiramisu.error import ConfigError, ConflictError, PropertiesOptionError, LeadershipError -from .config import config_type, get_config +from .config import config_type, get_config, parse_od_get owners.addowner('config') @@ -59,1289 +59,1239 @@ def make_metaconfig(double=False): return meta -#def test_unknown_config(): -# meta = make_metaconfig() -# with pytest.raises(ConfigError): -# meta.config('unknown') -# -# -#def test_error_metaconfig(): -# od2 = make_description() -# conf1 = Config(od2, name='conf1') -# with pytest.raises(TypeError): -# MetaConfig([GroupConfig([conf1])], name='meta') -# -# -#def test_path(): -# meta = make_metaconfig() -# assert meta.config.path() == 'meta' -# ret = meta.config('conf1') -# assert ret.config.path() == 'meta.conf1' -# ret = meta.config('conf2') -# assert ret.config.path() == 'meta.conf2' -# -# -#def test_none(): -# meta = make_metaconfig() -# conf1 = meta.config('conf1') -# conf2 = meta.config('conf2') -# assert meta.option('od1.i3').value.get() is conf1.option('od1.i3').value.get() is conf2.option('od1.i3').value.get() is None -# assert meta.option('od1.i3').owner.get() is conf1.option('od1.i3').owner.get() is conf2.option('od1.i3').owner.get() is owners.default -# # -# assert meta.option('od1.i3').value.set(3) == [] -# assert meta.option('od1.i3').value.get() == conf1.option('od1.i3').value.get() == conf2.option('od1.i3').value.get() == 3 -# assert meta.option('od1.i3').owner.get() is conf1.option('od1.i3').owner.get() is conf2.option('od1.i3').owner.get() is owners.meta1 -# # -# conf1.option('od1.i3').value.set(2) -# assert meta.option('od1.i3').value.get() == conf2.option('od1.i3').value.get() == 3 -# assert conf1.option('od1.i3').value.get() == 2 -# assert meta.option('od1.i3').owner.get() is conf2.option('od1.i3').owner.get() is owners.meta1 -# assert conf1.option('od1.i3').owner.get() is owners.user -# # -# meta.option('od1.i3').value.set(4) -# assert meta.option('od1.i3').value.get() == conf2.option('od1.i3').value.get() == 4 -# assert conf1.option('od1.i3').value.get() == 2 -# assert meta.option('od1.i3').owner.get() is conf2.option('od1.i3').owner.get() is owners.meta1 -# assert conf1.option('od1.i3').owner.get() is owners.user -# # -# meta.option('od1.i3').value.reset() -# assert meta.option('od1.i3').value.get() is conf2.option('od1.i3').value.get() is None -# assert conf1.option('od1.i3').value.get() == 2 -# assert meta.option('od1.i3').owner.get() is conf2.option('od1.i3').owner.get() is owners.default -# assert conf1.option('od1.i3').owner.get() is owners.user -# # -# conf1.option('od1.i3').value.reset() -# assert meta.option('od1.i3').value.get() is conf1.option('od1.i3').value.get() is conf2.option('od1.i3').value.get() is None -# assert meta.option('od1.i3').owner.get() is conf1.option('od1.i3').owner.get() is conf2.option('od1.i3').owner.get() is owners.default -# -# -#def test_metaconfig_reset(config_type): -# meta = make_metaconfig() -# meta_api = get_config(meta, config_type) -# assert meta_api.option('od1.i2').value.get() == 1 -# meta_api.option('od1.i2').value.set(2) -# if config_type == 'tiramisu-api': -# meta_api.send() -# conf1 = meta.config('conf1') -# conf2 = meta.config('conf2') -# conf1.option('od1.i2').value.set(3) -# assert meta.option('od1.i2').value.get() == 2 -# assert conf1.option('od1.i2').value.get() == 3 -# assert conf2.option('od1.i2').value.get() == 2 -# meta.config.reset() -# assert meta.option('od1.i2').value.get() == 1 -# assert conf1.option('od1.i2').value.get() == 3 -# assert conf2.option('od1.i2').value.get() == 1 -# -# -#def test_default(): -# meta = make_metaconfig() -# conf1 = meta.config('conf1') -# conf2 = meta.config('conf2') -# assert meta.option('od1.i2').value.get() == conf1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 1 -# assert meta.option('od1.i2').owner.get() is conf1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.default -# # -# meta.option('od1.i2').value.set(3) -# assert meta.option('od1.i2').value.get() == conf1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 3 -# assert meta.option('od1.i2').owner.get() is conf1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.meta1 -# # -# conf1.option('od1.i2').value.set(2) -# assert meta.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 3 -# assert conf1.option('od1.i2').value.get() == 2 -# assert meta.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.meta1 -# assert conf1.option('od1.i2').owner.get() is owners.user -# # -# meta.option('od1.i2').value.set(4) -# assert meta.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 4 -# assert conf1.option('od1.i2').value.get() == 2 -# assert meta.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.meta1 -# assert conf1.option('od1.i2').owner.get() is owners.user -# # -# meta.option('od1.i2').value.reset() -# assert meta.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 1 -# assert conf1.option('od1.i2').value.get() == 2 -# assert meta.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.default -# assert conf1.option('od1.i2').owner.get() is owners.user -# # -# conf1.option('od1.i2').value.reset() -# assert meta.option('od1.i2').value.get() == conf1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 1 -# assert meta.option('od1.i2').owner.get() is conf1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.default -# -# -#def test_contexts(): -# meta = make_metaconfig() -# errors = meta.value.set('od1.i2', 6, only_config=True) -# assert len(errors) == 0 -# conf1 = meta.config('conf1') -# assert meta.option('od1.i2').value.get() == 1 -# assert meta.option('od1.i2').owner.get() == owners.default -# assert conf1.option('od1.i2').value.get() == conf1.option('od1.i2').value.get() == 6 -# assert conf1.option('od1.i2').owner.get() == conf1.option('od1.i2').owner.get() is owners.user -# -# -#def test_find(): -# meta = make_metaconfig() -# ret = list(meta.option.find('i2')) -# assert len(ret) == 1 -# assert 1 == ret[0].value.get() -# ret = meta.option.find('i2', first=True) -# assert 1 == ret.value.get() -# assert meta.value.dict() == {'od1.i4': 2, 'od1.i1': None, 'od1.i3': None, -# 'od1.i2': 1, 'od1.i5': [2]} -# -# -#def test_meta_meta(): -# meta = make_metaconfig(double=True) -# meta1 = meta.config('meta') -# conf1 = meta.config('meta.conf1') -# conf2 = meta.config('meta.conf2') -# assert meta.option('od1.i2').value.get() == meta1.option('od1.i2').value.get() == conf1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 1 -# assert meta.option('od1.i2').owner.get() is meta1.option('od1.i2').owner.get() is conf1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.default -# # -# meta.option('od1.i2').value.set(3) -# assert meta.option('od1.i2').value.get() == meta1.option('od1.i2').value.get() == conf1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 3 -# assert meta.option('od1.i2').owner.get() is meta1.option('od1.i2').owner.get() is conf1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.meta1 -# # -# conf1.option('od1.i2').value.set(2) -# assert meta.option('od1.i2').value.get() == meta1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 3 -# assert conf1.option('od1.i2').value.get() == 2 -# assert meta.option('od1.i2').owner.get() is meta1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.meta1 -# assert conf1.option('od1.i2').owner.get() is owners.user -# # -# meta1.option('od1.i2').value.set(4) -# assert meta.option('od1.i2').value.get() == 3 -# assert meta1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 4 -# assert conf1.option('od1.i2').value.get() == 2 -# assert meta.option('od1.i2').owner.get() is owners.meta1 -# assert meta1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.meta2 -# assert conf1.option('od1.i2').owner.get() is owners.user -# # -# meta1.option('od1.i2').value.reset() -# assert meta.option('od1.i2').value.get() == meta1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 3 -# assert conf1.option('od1.i2').value.get() == 2 -# assert meta.option('od1.i2').owner.get() is meta1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.meta1 -# assert conf1.option('od1.i2').owner.get() is owners.user -# # -# meta.option('od1.i2').value.reset() -# assert meta.option('od1.i2').value.get() == meta1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 1 -# assert conf1.option('od1.i2').value.get() == 2 -# assert meta.option('od1.i2').owner.get() is meta1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.default -# assert conf1.option('od1.i2').owner.get() is owners.user -# # -# conf1.option('od1.i2').value.reset() -# assert meta.option('od1.i2').value.get() == meta1.option('od1.i2').value.get() == conf1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 1 -# assert meta.option('od1.i2').owner.get() is meta1.option('od1.i2').owner.get() is conf1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.default -# -# -#def test_meta_new_config(): -# od = make_description() -# meta = MetaConfig(['name1', 'name2'], optiondescription=od) -# assert len(list(meta.config.list())) == 2 -# meta.config.new('newconf1') -# assert len(list(meta.config.list())) == 3 -# -# -#def test_meta_new_config_owner(): -# od = make_description() -# meta = MetaConfig(['name1', 'name2'], optiondescription=od) -# meta.owner.set('meta') -# meta.config.new('newconf1') -# assert meta.owner.get() == 'meta' -# -# -#def test_meta_new_metaconfig(): -# od = make_description() -# meta = MetaConfig(['name1', 'name2'], optiondescription=od) -# meta.config.new('newconf1', type='metaconfig') -# newconf1 = meta.config('newconf1') -# newconf1.config.new('newconf2', type='metaconfig') -# newconf2 = newconf1.config('newconf2') -# newconf2.config.new('newconf3') -# newconf3 = newconf2.config('newconf3') -# assert newconf3.config.name() == 'newconf3' -# -# -#def test_meta_pop_config(): -# od = make_description() -# meta = MetaConfig(['name1', 'name2'], optiondescription=od) -# meta.option('od1.i1').value.set(2) -# # -# assert len(list(meta.config.list())) == 2 -# meta.config.new('newconf1') -# newconf1 = meta.config('newconf1') -# assert newconf1.value.dict() == {'od1.i1': 2, 'od1.i2': 1, 'od1.i3': None, 'od1.i4': 2, 'od1.i5': [2], 'od1.i6': None} -# # -# assert len(list(meta.config.list())) == 3 -# newconf1 = meta.config.remove('newconf1') -# try: -# meta.config('newconf1') -# except ConfigError: -# pass -# else: -# raise Exception('must raise') -# assert newconf1.value.dict() == {'od1.i1': None, 'od1.i2': 1, 'od1.i3': None, 'od1.i4': 2, 'od1.i5': [2], 'od1.i6': None} -# # -# assert len(list(meta.config.list())) == 2 -# with pytest.raises(ConfigError): -# meta.config.remove('newconf1') -# -# -#def test_meta_add_config(): -# od = make_description() -# od2 = make_description() -# meta = MetaConfig(['name1', 'name2'], optiondescription=od) -# meta.option('od1.i1').value.set(2) -# # -# assert len(list(meta.config.list())) == 2 -# config = Config(od, name='new') -# assert config.value.dict() == {'od1.i1': None, 'od1.i2': 1, 'od1.i3': None, 'od1.i4': 2, 'od1.i5': [2], 'od1.i6': None} -# meta.config.add(config) -# # -# assert len(list(meta.config.list())) == 3 -# assert config.value.dict() == {'od1.i1': 2, 'od1.i2': 1, 'od1.i3': None, 'od1.i4': 2, 'od1.i5': [2], 'od1.i6': None} -# # -# with pytest.raises(ConflictError): -# meta.config.add(config) -# newconfig = Config(od2) -# with pytest.raises(ValueError): -# meta.config.add(newconfig) -# -# -#def test_meta_add_config_not_name(): -# od = make_description() -# od2 = make_description() -# meta = MetaConfig(['name1', 'name2'], optiondescription=od) -# meta.option('od1.i1').value.set(2) -# # -# assert len(list(meta.config.list())) == 2 -# config = Config(od) -# with pytest.raises(ConfigError): -# meta.config.add(config) -# -# -#def test_meta_add_config_readd(): -# od = make_description() -# meta = MetaConfig([], optiondescription=od) -# meta2 = MetaConfig([], optiondescription=od) -# config = Config(od, name='new') -# # -# meta.config.add(config) -# meta2.config.add(config) -# assert len(list(config.config.parents())) == 2 -# -# -#def test_meta_new_config_wrong_name(): -# od = make_description() -# meta = MetaConfig(['name1', 'name2'], optiondescription=od) -# assert len(list(meta.config.list())) == 2 -# with pytest.raises(ConflictError): -# meta.config.new('name1') -# assert len(list(meta.config.list())) == 2 -# -# -#def test_meta_load_config(): -# od = make_description() -# meta = MetaConfig(['name1', 'name2'], optiondescription=od) -# assert len(list(meta.config.list())) == 2 -# meta.config('name1') -# -# -#def test_meta_load_config_wrong_name(): -# od = make_description() -# meta = MetaConfig(['name1', 'name2'], optiondescription=od) -# assert len(list(meta.config.list())) == 2 -# with pytest.raises(ConfigError): -# meta.config('name3') -# -# -#def test_meta_meta_set(): -# meta = make_metaconfig(double=True) -# errors1 = meta.value.set('od1.i1', 7, only_config=True) -# errors2 = meta.value.set('od1.i6', 7, only_config=True) -# assert len(errors1) == 0 -# assert len(errors2) == 2 -# conf1 = meta.config('meta.conf1') -# conf2 = meta.config('meta.conf2') -# assert conf1.option('od1.i1').value.get() == conf2.option('od1.i1').value.get() == 7 -# # -# dconfigs = [] -# ret = meta.config.find('i1', value=7) -# for conf in ret.config.list(): -# dconfigs.append(conf._config_bag.context) -# assert [conf1._config_bag.context, conf2._config_bag.context] == dconfigs -# conf1.option('od1.i1').value.set(8) -# # -# dconfigs = [] -# ret = meta.config.find('i1') -# for conf in ret.config.list(): -# dconfigs.append(conf._config_bag.context) -# assert [conf1._config_bag.context, conf2._config_bag.context] == dconfigs -# ret = meta.config.find('i1', value=7) -# assert len(ret.config.list()) == 1 -# assert conf2._config_bag.context == list(ret.config.list())[0]._config_bag.context -# -# ret = meta.config.find('i1', value=8) -# assert len(ret.config.list()) == 1 -# assert conf1._config_bag.context == list(ret.config.list())[0]._config_bag.context -# # -# dconfigs = [] -# ret = meta.config.find('i5', value=2) -# for conf in ret.config.list(): -# dconfigs.append(conf._config_bag.context) -# assert [conf1._config_bag.context, conf2._config_bag.context] == dconfigs -# # -# with pytest.raises(AttributeError): -# meta.config.find('i1', value=10) -# with pytest.raises(AttributeError): -# meta.config.find('not', value=10) -# with pytest.raises(AttributeError): -# meta.config.find('i6') -# with pytest.raises(ValueError): -# meta.value.set('od1.i6', 7, only_config=True, force_default=True) -# with pytest.raises(ValueError): -# meta.value.set('od1.i6', 7, only_config=True, force_default_if_same=True) -# with pytest.raises(ValueError): -# meta.value.set('od1.i6', 7, only_config=True, force_dont_change_value=True) -# -# -#def test_not_meta(): -# i1 = IntOption('i1', '') -# od1 = OptionDescription('od1', '', [i1]) -# od2 = OptionDescription('od2', '', [od1]) -# conf1 = Config(od2, name='conf1') -# conf2 = Config(od2, name='conf2') -# conf3 = Config(od2) -# conf4 = Config(od2, name='conf4') -# with pytest.raises(TypeError): -# GroupConfig(conf1) -# with pytest.raises(ConflictError): -# GroupConfig([conf2, conf2], name='conf8') -# grp = GroupConfig([conf1, conf2]) -# assert grp.config.type() == 'groupconfig' -# with pytest.raises(ConfigError): -# grp.option('od1.i1').value.get() -# conf1, conf2 = grp.config.list() -# errors = grp.value.set('od1.i1', 7) -# assert len(errors) == 0 -# conf1 = grp.config('conf1') -# conf2 = grp.config('conf2') -# assert conf1.option('od1.i1').value.get() == conf2.option('od1.i1').value.get() == 7 -# assert conf1.option('od1.i1').owner.get() is conf2.option('od1.i1').owner.get() is owners.user -# grp.option('od1.i1').value.reset() -# assert conf1.option('od1.i1').owner.get() is conf2.option('od1.i1').owner.get() is owners.default -# -# -#def test_group_find_firsts(): -# i1 = IntOption('i1', '') -# od1 = OptionDescription('od1', '', [i1]) -# od2 = OptionDescription('od2', '', [od1]) -# conf1 = Config(od2, name='conf1') -# conf2 = Config(od2, name='conf2') -# grp = GroupConfig([conf1, conf2]) -# ret = grp.config.find('i1') -# newconf1, newconf2 = grp.config.list() -# conf1._config_bag.context == newconf1._config_bag.context -# conf2._config_bag.context == newconf2._config_bag.context -# -# -#def test_group_group(): -# i1 = IntOption('i1', '') -# od1 = OptionDescription('od1', '', [i1]) -# od2 = OptionDescription('od2', '', [od1]) -# conf1 = Config(od2, name='conf9') -# conf2 = Config(od2, name='conf10') -# grp = GroupConfig([conf1, conf2], 'grp') -# grp2 = GroupConfig([grp]) -# errors = grp2.value.set('od1.i1', 2) -# assert len(errors) == 0 -# conf9 = grp2.config('grp.conf9') -# assert conf9.option('od1.i1').value.get() == 2 -# assert conf9.option('od1.i1').owner.get() is owners.user -# -# -#def test_group_group_path(): -# i1 = IntOption('i1', '') -# od1 = OptionDescription('od1', '', [i1]) -# od2 = OptionDescription('od2', '', [od1]) -# conf1 = Config(od2, name='conf9') -# conf2 = Config(od2, name='conf10') -# grp = GroupConfig([conf1, conf2], 'grp') -# grp2 = GroupConfig([grp], 'grp2') -# assert grp2.config.path() == 'grp2' -# newgrp = grp2.config('grp') -# assert newgrp.config.path() == 'grp' -# newgrp = grp2.config('grp.conf9') -# assert newgrp.config.path() == 'conf9' -# newgrp = grp2.config('grp.conf10') -# assert newgrp.config.path() == 'conf10' -# -# -#def test_meta_unconsistent(): -# i1 = IntOption('i1', '') -# i2 = IntOption('i2', '', default=1) -# i3 = IntOption('i3', '') -# i4 = IntOption('i4', '', default=2) -# od1 = OptionDescription('od1', '', [i1, i2, i3, i4]) -# od2 = OptionDescription('od2', '', [od1]) -# i5 = IntOption('i5', '') -# od3 = OptionDescription('od3', '', [i5]) -# conf1 = Config(od2, name='conf1') -# conf2 = Config(od2, name='conf2') -# conf3 = Config(od2, name='conf3') -# conf4 = Config(od3, name='conf4') -# meta = MetaConfig([conf1, conf2]) -# meta.owner.set(owners.meta1) -# with pytest.raises(TypeError): -# MetaConfig("string") -# #same descr but conf1 already in meta -# assert len(list(conf1.config.parents())) == 1 -# assert len(list(conf3.config.parents())) == 0 -# new_meta = MetaConfig([conf1, conf3]) -# assert len(list(conf1.config.parents())) == 2 -# assert len(list(conf3.config.parents())) == 1 -# #not same descr -# with pytest.raises(ValueError): -# MetaConfig([conf3, conf4]) -# -# -#def test_meta_leadership(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# meta = MetaConfig([conf1, conf2]) -# meta.property.read_only() -# ret = meta.config.find('ip_admin_eth0') -# configs = ret.config.list() -# assert len(configs) == 2 -# assert conf1._config_bag.context == configs[0]._config_bag.context -# assert conf2._config_bag.context == configs[1]._config_bag.context -# ret = meta.config.find('netmask_admin_eth0') -# configs = ret.config.list() -# assert len(configs) == 2 -# assert conf1._config_bag.context == configs[0]._config_bag.context -# assert conf2._config_bag.context == configs[1]._config_bag.context -# meta.property.read_write() -# with pytest.raises(AttributeError): -# meta.config.find('netmask_admin_eth0') -# ret = meta.unrestraint.config.find('netmask_admin_eth0') -# configs = ret.config.list() -# assert conf1._config_bag.context == configs[0]._config_bag.context -# assert conf2._config_bag.context == configs[1]._config_bag.context -# meta.property.read_only() -# ret = meta.config.find('netmask_admin_eth0') -# configs = ret.config.list() -# assert conf1._config_bag.context == configs[0]._config_bag.context -# assert conf2._config_bag.context == configs[1]._config_bag.context -# -# -#def test_meta_leadership_value(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# meta = MetaConfig([conf1, conf2], name="meta") -# conf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.8']) -# assert conf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None -# with pytest.raises(ConfigError): -# conf1.option('ip_admin_eth0.ip_admin_eth0', 0).value.get() -# # -# conf1.option('ip_admin_eth0.ip_admin_eth0').value.reset() -# # -# meta.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) -# assert conf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None -# meta.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') -# assert conf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.0' -# meta.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.0.0') -# assert conf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' -# # -# conf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) -# assert conf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' -# # -# meta.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.2.1', '192.168.3.1']) -# meta.option('ip_admin_eth0.netmask_admin_eth0', 1).value.set('255.255.255.0') -# # -# assert conf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# assert conf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' -# -# -#def test_meta_leadership_value_default(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# meta = MetaConfig([conf1, conf2]) -# newconf1 = meta.config('conf1') -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None -# # -# meta.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None -# # -# meta.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.0' -# # -# meta.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.0.0') -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' -# -# -#def test_meta_leadership_owners(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# meta = MetaConfig([conf1, conf2]) -# meta.owner.set(owners.meta1) -# newconf1 = meta.config('conf1') -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() -# with pytest.raises(LeadershipError): -# newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.user -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.reset() -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() -# # -# meta.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.meta1 -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() -# # -# meta.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.meta1 -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == owners.meta1 -# # -# meta.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.0.0') -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.meta1 -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == owners.meta1 -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.user -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == owners.meta1 -# -# -#def test_meta_force_default(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# meta = MetaConfig([conf1, conf2]) -# meta.property.read_write() -# meta.owner.set('meta1') -# newconf1 = meta.config('conf1') -# newconf2 = meta.config('conf2') -# assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# # -# errors = meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.1']) -# assert len(errors) == 0 -# assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.2']) -# assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.2'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# # -# errors = meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.3']) -# assert len(errors) == 0 -# assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.2'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] -# # -# errors = meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_default=True) -# assert len(errors) == 0 -# assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# -# -#def test_meta_force_dont_change_value(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# meta = MetaConfig([conf1, conf2]) -# meta.property.read_write() -# meta.owner.set('meta1') -# assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# newconf1 = meta.config('conf1') -# newconf2 = meta.config('conf2') -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.4']) -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() -# errors = meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_dont_change_value=True) -# assert len(errors) == 0 -# assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# -# -#def test_meta_force_default_if_same(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# meta = MetaConfig([conf1, conf2]) -# meta.property.read_write() -# meta.owner.set('meta1') -# # -# newconf1 = meta.config('conf1') -# newconf2 = meta.config('conf2') -# assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.4']) -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() -# errors = meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_default_if_same=True) -# assert len(errors) == 0 -# assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.meta1 -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.meta1 -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.3']) -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.meta1 -# errors = meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.5'], force_default_if_same=True) -# assert len(errors) == 0 -# assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.5'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.5'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.meta1 -# -# -#def test_meta_force_default_if_same_and_dont_change(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# meta = MetaConfig([conf1, conf2]) -# meta.property.read_write() -# meta.owner.set('meta1') -# # -# newconf1 = meta.config('conf1') -# newconf2 = meta.config('conf2') -# assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.4']) -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() -# errors = meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_default_if_same=True, force_dont_change_value=True) -# assert len(errors) == 0 -# assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.meta1 -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.3']) -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# errors = meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.5'], force_default_if_same=True, force_dont_change_value=True) -# assert len(errors) == 0 -# assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.5'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# -# -#def test_meta_force_default_and_dont_change(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='rconf1') -# conf2 = Config(od, name='rconf2') -# meta = MetaConfig([conf1, conf2]) -# meta.property.read_write() -# meta.owner.set('meta1') -# with pytest.raises(ValueError): -# meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_default=True, force_dont_change_value=True) -# -# -#def test_meta_properties_meta(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, validators=[Calculation(valid_network_netmask, Params((ParamOption(ip_admin_eth0), ParamSelfOption())))]) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0], properties=('disabled',)) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# conf1.property.read_write() -# conf2.property.read_write() -# meta = MetaConfig([conf1, conf2]) -# meta.property.read_write() -# ret = meta.config('conf1') -# assert ret.value.dict() == {} -# -# -#def test_meta_exception_meta(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", Calculation(raise_exception), multi=True, validators=[Calculation(valid_network_netmask, Params((ParamOption(ip_admin_eth0), ParamSelfOption())))]) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# meta = MetaConfig([conf1, conf2]) -# meta.property.read_write() -# with pytest.raises(Exception): -# conf1.make_dict() -# -# -#def test_meta_properties_requires1(): -# opt1 = BoolOption('opt1', 'opt1', False) -# opt2 = BoolOption('opt2', "") -# disabled_property = Calculation(calc_value, -# Params(ParamValue('disabled'), -# kwargs={'condition': ParamOption(opt1), -# 'expected': ParamValue(False)})) -# od2 = OptionDescription('od2', "", [opt2], properties=(disabled_property,)) -# opt3 = BoolOption('opt3', '', validators=[Calculation(valid_not_equal, Params((ParamSelfOption(), ParamOption(opt2))))]) -# od = OptionDescription('root', '', [opt1, od2, opt3]) -# conf1 = Config(od, name='conf1') -# conf1.property.read_write() -# meta = MetaConfig([conf1], 'meta') -# meta.property.read_write() -# meta.option('opt1').value.set(True) -# # -# conf1.option('od2.opt2').value.set(False) -# -# -#def test_meta_properties_requires_mandatory(): -# probes = BoolOption('probes', 'probes available', False) -# eth0_method = ChoiceOption('eth0_method', '', ('static', 'dhcp'), 'static') -# ip_address = IPOption('ip_address', '') -# mandatory_property = Calculation(calc_value, -# Params(ParamValue('mandatory'), -# kwargs={'condition': ParamOption(probes), -# 'expected': ParamValue('yes'), -# 'default': ParamValue(None)})) -# ip_eth0 = IPOption('ip_eth0', "ip", Calculation(return_condition, Params(kwargs={'val': ParamOption(ip_address), 'condition': ParamOption(eth0_method), 'expected': ParamValue('dhcp')})), properties=(mandatory_property,)) -# ip_gw = IPOption('ip_gw', 'gw', validators=[Calculation(valid_not_equal, Params((ParamSelfOption(), ParamOption(ip_eth0))))]) -# od = OptionDescription('root', '', [ip_gw, probes, eth0_method, ip_address, ip_eth0]) -# conf1 = Config(od, name='conf1') -# conf1.property.read_write() -# meta = MetaConfig([conf1], 'meta') -# # -# meta.option('probes').value.set(True) -# meta.option('ip_address').value.set('1.1.1.1') -# meta.option('ip_gw').value.set('1.1.1.2') -# conf1.option('eth0_method').value.set('dhcp') -# conf1.property.read_only() -# assert conf1.value.dict() == {'ip_gw': '1.1.1.2', 'probes': True, 'eth0_method': 'dhcp', 'ip_address': '1.1.1.1', 'ip_eth0': '1.1.1.1'} -# -# -#def test_meta_callback(): -# val1 = StrOption('val1', "", 'val') -# val2 = StrOption('val2', "", Calculation(return_value, Params(ParamOption(val1)))) -# val3 = StrOption('val3', "", Calculation(return_value, Params(ParamValue('yes')))) -# val4 = StrOption('val4', "", Calculation(return_value, Params(kwargs={'value': ParamOption(val1)}))) -# val5 = StrOption('val5', "", Calculation(return_value, Params(kwargs={'value': ParamValue('yes')}))) -# maconfig = OptionDescription('rootconfig', '', [val1, val2, val3, val4, val5]) -# cfg = Config(maconfig, name='cfg') -# meta = MetaConfig([cfg]) -# meta.property.read_write() -# newcfg = meta.config('cfg') -# assert newcfg.value.dict() == {'val3': 'yes', 'val2': 'val', 'val1': 'val', 'val5': 'yes', 'val4': 'val'} -# newcfg.option('val1').value.set('new') -# assert newcfg.value.dict() == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new'} -# newcfg.option('val1').value.reset() -# meta.option('val1').value.set('new') -# assert newcfg.value.dict() == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new'} -# newcfg.option('val4').value.set('new1') -# assert newcfg.value.dict() == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new1'} -# newcfg.option('val4').value.reset() -# meta.option('val4').value.set('new1') -# assert newcfg.value.dict() == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new1'} -# meta.option('val4').value.reset() -# -# -#def test_meta_callback_follower(): -# val = StrOption('val', "", default='val') -# val1 = StrOption('val1', "", [Calculation(return_value, Params(ParamOption(val)))], multi=True) -# val3 = StrOption('val2', "", Calculation(return_value, Params(ParamOption(val1))), multi=True) -# val4 = StrOption('val3', "", Calculation(return_value, Params(ParamOption(val1))), multi=True) -# interface1 = Leadership('val1', '', [val1, val3, val4]) -# od = OptionDescription('root', '', [interface1]) -# maconfig = OptionDescription('rootconfig', '', [val, interface1]) -# conf1 = Config(maconfig, name='conf1') -# meta = MetaConfig([conf1]) -# meta.property.read_write() -# assert conf1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val', 'val1.val3': 'val'}]} -# # -# conf1.option('val').value.set('val1') -# assert conf1.value.dict() == {'val': 'val1', 'val1.val1': [{'val1.val1': 'val1', 'val1.val2': 'val1', 'val1.val3': 'val1'}]} -# # -# conf1.option('val').value.reset() -# meta.option('val').value.set('val1') -# assert conf1.value.dict() == {'val': 'val1', 'val1.val1': [{'val1.val1': 'val1', 'val1.val2': 'val1', 'val1.val3': 'val1'}]} -# # -# meta.option('val').value.reset() -# conf1.option('val1.val2', 0).value.set('val2') -# assert conf1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val2', 'val1.val3': 'val'}]} -# # -# conf1.option('val1.val2', 0).value.reset() -# assert conf1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val', 'val1.val3': 'val'}]} -# # -# meta.option('val1.val2', 0).value.set('val2') -# assert conf1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val2', 'val1.val3': 'val'}]} -# # -# meta.option('val1.val1').value.set(['val']) -# assert conf1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val2', 'val1.val3': 'val'}]} -# # -# conf1.option('val1.val3', 0).value.set('val6') -# assert conf1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val2', 'val1.val3': 'val6'}]} -# # -# meta.option('val1.val2', 0).value.reset() -# conf1.option('val1.val3', 0).value.reset() -# conf1.option('val1.val1').value.set(['val3']) -# assert conf1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val3', 'val1.val2': 'val3', 'val1.val3': 'val3'}]} -# # -# conf1.option('val1.val1').value.reset() -# assert conf1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val', 'val1.val3': 'val'}]} -# # -# meta.option('val1.val1').value.set(['val3']) -# assert conf1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val3', 'val1.val2': 'val3', 'val1.val3': 'val3'}]} -# # -# conf1.option('val1.val2', 0).value.set('val2') -# assert conf1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val3', 'val1.val2': 'val2', 'val1.val3': 'val3'}]} -# # -# meta.option('val1.val1').value.set(['val3', 'rah']) -# assert conf1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val3', 'val1.val2': 'val2', 'val1.val3': 'val3'}, {'val1.val1': 'rah', 'val1.val2': 'rah', 'val1.val3': 'rah'}]} -# # -# meta.option('val1.val1').value.pop(1) -# meta.option('val1.val1').value.set(['val4']) -# assert conf1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val4', 'val1.val2': 'val2', 'val1.val3': 'val4'}]} -# -# -#def test_meta_reset(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# meta = MetaConfig([conf1, conf2]) -# meta.property.read_write() -# meta.owner.set('meta1') -# newconf1 = meta.config('conf1') -# newconf2 = meta.config('conf2') -# assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# errors = meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.1']) -# assert len(errors) == 0 -# assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.2']) -# assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.2'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# meta.value.reset('ip_admin_eth0.ip_admin_eth0') -# assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# -# -#def test_meta_properties_meta_copy(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, properties=('disabled',)) -# interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# conf1 = Config(interface1, name='conf1') -# conf2 = Config(interface1, name='conf2') -# conf1.property.read_write() -# conf2.property.read_write() -# meta = MetaConfig([conf1, conf2], name='meta1') -# meta.property.read_write() -# -# newconf1 = meta.config('conf1') -# newconf2 = meta.config('conf2') -# conf3 = newconf1.config.copy(name='conf3') -# meta2 = list(conf3.config.parents()) -# assert len(meta2) == 1 -# assert meta.config.name() == meta2[0].config.name() -# -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# assert newconf2.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# newconf3 = meta.config('conf3') -# assert newconf3.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# meta.option('ip_admin_eth0').value.set(['192.168.1.2']) -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.2']} -# assert newconf2.value.dict() == {'ip_admin_eth0': ['192.168.1.2']} -# assert newconf3.value.dict() == {'ip_admin_eth0': ['192.168.1.2']} -# ret = meta.value.set('ip_admin_eth0', ['192.168.1.3'], force_default_if_same=True) -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.3']} -# assert newconf2.value.dict() == {'ip_admin_eth0': ['192.168.1.3']} -# assert newconf3.value.dict() == {'ip_admin_eth0': ['192.168.1.3']} -# -# -#def test_meta_properties_meta_deepcopy(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, -# properties=('disabled',)) -# interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# conf1 = Config(interface1, name='conf1') -# conf2 = Config(interface1, name='conf2') -# conf1.property.read_write() -# conf2.property.read_write() -# meta = MetaConfig([conf1, conf2]) -# meta.permissive.add('hidden') -# meta.property.read_write() -# -# newconf1 = meta.config('conf1') -# newconf2 = meta.config('conf2') -# meta2 = newconf1.config.deepcopy(name='conf3') -# newconf3 = meta2.config('conf3') -# assert meta != meta2 -# assert meta.permissive.get() == meta2.permissive.get() -# -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# assert newconf2.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# assert newconf3.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# meta.option('ip_admin_eth0').value.set(['192.168.1.2']) -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.2']} -# assert newconf2.value.dict() == {'ip_admin_eth0': ['192.168.1.2']} -# assert newconf3.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# meta.value.set('ip_admin_eth0', ['192.168.1.3'], force_default_if_same=True) -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.3']} -# assert newconf2.value.dict() == {'ip_admin_eth0': ['192.168.1.3']} -# assert newconf3.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# -# -#def test_meta_properties_meta_deepcopy_multi_parent(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip") -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask") -# interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# conf1 = Config(interface1, name='conf1') -# conf2 = Config(interface1, name='conf2') -# conf1.property.read_write() -# conf2.property.read_write() -# meta1 = MetaConfig([conf1, conf2], name='meta1') -# meta1.permissive.add('hidden') -# meta1.property.read_write() -# -# meta2 = MetaConfig(['name1', 'name2'], optiondescription=interface1, name='meta2') -# meta2.config.add(conf1) -# -# meta1.option('ip_admin_eth0').value.set('192.168.1.1') -# meta2.option('netmask_admin_eth0').value.set('255.255.255.0') -# -# assert meta1.value.dict() == {'ip_admin_eth0': '192.168.1.1', 'netmask_admin_eth0': None} -# assert meta2.value.dict() == {'ip_admin_eth0': None, 'netmask_admin_eth0': '255.255.255.0'} -# assert conf1.value.dict() == {'ip_admin_eth0': '192.168.1.1', 'netmask_admin_eth0': '255.255.255.0'} -# assert conf2.value.dict() == {'ip_admin_eth0': '192.168.1.1', 'netmask_admin_eth0': None} -# -# copy_meta2 = conf1.config.deepcopy(name='copy_conf1', metaconfig_prefix='copy_') -# assert copy_meta2.config.path() == 'copy_meta2' -# copy_meta1 = copy_meta2.config('copy_meta1') -# copy_conf1 = copy_meta1.config('copy_conf1') -# assert copy_meta2.value.dict() == {'ip_admin_eth0': None, 'netmask_admin_eth0': '255.255.255.0'} -# assert copy_conf1.value.dict() == {'ip_admin_eth0': '192.168.1.1', 'netmask_admin_eth0': '255.255.255.0'} -# -# -#def test_meta_properties_submeta_deepcopy(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, -# properties=('disabled',)) -# interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# conf1 = Config(interface1, name='conf1') -# conf1.property.read_write() -# meta1 = MetaConfig([conf1], name='meta1') -# meta2 = MetaConfig([meta1], name='meta2') -# meta_copy = conf1.config.deepcopy(name='conf2', -# metaconfig_prefix='copy_') -# assert meta_copy.config.name() == 'copy_meta2' -# newcopy = meta_copy.config('copy_meta1') -# assert newcopy.config.name() == 'copy_meta1' -# newcopy = newcopy.config('conf2') -# assert newcopy.config.name() == 'conf2' -# -# -#def test_meta_properties_copy_meta(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, -# properties=('disabled',)) -# interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# conf1 = Config(interface1, name='conf1') -# conf1.property.read_write() -# meta1 = MetaConfig([conf1], name='meta1') -# meta2 = MetaConfig([meta1], name='meta2') -# meta_copy = meta1.config.copy(name='meta3') -# assert meta_copy.config.name() == 'meta3' -# assert list(meta_copy.config.list()) == [] -# -# -#def test_meta_properties_deepcopy_meta(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, -# properties=('disabled',)) -# interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# conf1 = Config(interface1, name='conf1') -# conf1.property.read_write() -# meta1 = MetaConfig([conf1], name='meta1') -# meta2 = MetaConfig([meta1], name='meta2') -# meta_copy = meta1.config.deepcopy(name='meta3', -# metaconfig_prefix='copy_') -# assert meta_copy.config.name() == 'copy_meta2' -# newcopy = meta_copy.config('meta3') -# assert newcopy.config.name() == 'meta3' -# assert list(newcopy.config.list()) == [] -# -# -#def test_meta_properties_submeta_deepcopy_owner(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip") -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask") -# interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# conf1 = Config(interface1, name='conf1') -# conf1.owner.set('conf1_user') -# conf1.property.read_write() -# meta1 = MetaConfig([conf1], name='meta1') -# meta1.owner.set('meta1_user') -# meta2 = MetaConfig([meta1], name='meta2') -# meta2.owner.set('meta2_user') -# # -# conf1.option('ip_admin_eth0').value.set('192.168.0.1') -# assert conf1.option('ip_admin_eth0').owner.get() == 'conf1_user' -# meta1.option('ip_admin_eth0').value.set('192.168.0.2') -# assert meta1.option('ip_admin_eth0').owner.get() == 'meta1_user' -# meta2.option('ip_admin_eth0').value.set('192.168.0.3') -# assert meta2.option('ip_admin_eth0').owner.get() == 'meta2_user' -# # -# meta2_copy = conf1.config.deepcopy(name='conf2', -# metaconfig_prefix='copy_') -# meta2_copy.option('netmask_admin_eth0').value.set('255.255.255.255') -# assert meta2_copy.option('ip_admin_eth0').value.get() == '192.168.0.3' -# assert meta2_copy.option('ip_admin_eth0').owner.get() == 'meta2_user' -# assert meta2_copy.option('netmask_admin_eth0').owner.get() == 'meta2_user' -# # -# meta1_copy = meta2_copy.config('copy_meta1') -# meta1_copy.option('netmask_admin_eth0').value.set('255.255.255.255') -# assert meta1_copy.option('ip_admin_eth0').value.get() == '192.168.0.2' -# assert meta1_copy.option('ip_admin_eth0').owner.get() == 'meta1_user' -# assert meta1_copy.option('netmask_admin_eth0').owner.get() == 'meta1_user' -# # -# conf2 = meta1_copy.config('conf2') -# conf2.owner.set('conf2_user') -# conf2.option('netmask_admin_eth0').value.set('255.255.255.255') -# assert conf2.option('netmask_admin_eth0').owner.get() == 'conf2_user' -# assert conf2.option('ip_admin_eth0').value.get() == '192.168.0.1' -# assert conf2.option('ip_admin_eth0').owner.get() == 'conf1_user' -# -# -#def test_meta_properties_meta_set_value(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, properties=('disabled',)) -# interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# conf1 = Config(interface1, name='conf1') -# conf2 = Config(interface1, name='conf2') -# conf1.property.read_write() -# conf2.property.read_write() -# meta = MetaConfig([conf1, conf2]) -# meta.property.read_write() -# ret = meta.config('conf1') -# assert ret.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# ret = meta.value.set('netmask_admin_eth0', ['255.255.255.255'], only_config=True) -# assert len(ret) == 2 -# assert isinstance(ret[0], PropertiesOptionError) -# assert isinstance(ret[1], PropertiesOptionError) -# del ret[1] -# del ret[0] -# del ret -# ret = meta.value.set('netmask_admin_eth0', ['255.255.255.255'], force_default=True) -# assert len(ret) == 1 -# assert isinstance(ret[0], PropertiesOptionError) -# del ret[0] -# del ret -# ret = meta.value.set('netmask_admin_eth0', ['255.255.255.255'], force_dont_change_value=True) -# assert len(ret) == 3 -# assert isinstance(ret[0], PropertiesOptionError) -# assert isinstance(ret[1], PropertiesOptionError) -# assert isinstance(ret[2], PropertiesOptionError) -# del ret[2] -# del ret[1] -# del ret[0] -# del ret -# ret = meta.value.set('netmask_admin_eth0', ['255.255.255.255'], force_default_if_same=True) -# assert len(ret) == 1 -# assert isinstance(ret[0], PropertiesOptionError) -# del ret[0] -# del ret -# ret = meta.value.set('ip_admin_eth0', '255.255.255.255', only_config=True) -# assert len(ret) == 2 -# assert isinstance(ret[0], ValueError) -# assert isinstance(ret[1], ValueError) -# del ret[1] -# del ret[0] -# del ret -# ret = meta.value.set('ip_admin_eth0', '255.255.255.255', force_default=True) -# assert len(ret) == 1 -# assert isinstance(ret[0], ValueError) -# del ret[0] -# del ret -# ret = meta.value.set('ip_admin_eth0', '255.255.255.255', force_dont_change_value=True) -# assert len(ret) == 1 -# assert isinstance(ret[0], ValueError) -# del ret[0] -# del ret -# ret = meta.value.set('ip_admin_eth0', '255.255.255.255', force_default_if_same=True) -# assert len(ret) == 1 -# assert isinstance(ret[0], ValueError) -# del ret[0] -# del ret -# -# -#def test_metaconfig_force_metaconfig_on_freeze(): -# dummy1 = StrOption('dummy1', 'doc dummy', default='default', properties=('force_metaconfig_on_freeze',)) -# group = OptionDescription('group', '', [dummy1]) -# cfg = Config(group, name='cfg') -# cfg.owner.set(owners.config) -# meta1 = MetaConfig([cfg], name='meta1') -# meta1.owner.set(owners.meta1) -# meta2 = MetaConfig([meta1], name='meta2') -# meta2.owner.set(owners.meta2) -# cfg.property.read_write() -# -# cfg.option('dummy1').property.add('frozen') -# # -# assert cfg.option('dummy1').value.get() == 'default' -# assert cfg.option('dummy1').owner.get() == 'default' -# # -# meta2.option('dummy1').value.set('meta2') -# # -# assert cfg.option('dummy1').value.get() == 'meta2' -# assert cfg.option('dummy1').owner.get() == 'meta2' -# # -# cfg.option('dummy1').property.remove('frozen') -# cfg.option('dummy1').value.set('cfg') -# cfg.option('dummy1').property.add('frozen') -# # -# assert cfg.option('dummy1').value.get() == 'meta2' -# assert cfg.option('dummy1').owner.get() == 'meta2' -# # -# meta1.option('dummy1').value.set('meta1') -# # -# assert cfg.option('dummy1').value.get() == 'meta1' -# assert cfg.option('dummy1').owner.get() == 'meta1' -# # -# cfg.option('dummy1').property.remove('frozen') -# assert cfg.option('dummy1').value.get() == 'cfg' -# assert cfg.option('dummy1').owner.get() == 'config' -# -# -#def test_metaconfig_force_metaconfig_on_freeze_option(): -# dummy1 = StrOption('dummy1', 'doc dummy', default='default') -# dummy2 = StrOption('dummy2', 'doc dummy', default='default', properties=('force_default_on_freeze',)) -# group = OptionDescription('group', '', [dummy1, dummy2]) -# cfg = Config(group, name='cfg') -# cfg.owner.set(owners.config) -# meta1 = MetaConfig([cfg], name='meta1') -# meta1.owner.set(owners.meta1) -# meta2 = MetaConfig([meta1], name='meta2') -# meta2.owner.set(owners.meta2) -# cfg.property.read_write() -# -# cfg.option('dummy1').property.add('frozen') -# cfg.option('dummy1').property.add('force_metaconfig_on_freeze') -# cfg.option('dummy2').property.add('frozen') -# # -# assert cfg.option('dummy1').value.get() == 'default' -# assert cfg.option('dummy1').owner.get() == 'default' -# assert cfg.option('dummy2').value.get() == 'default' -# assert cfg.option('dummy2').owner.get() == 'default' -# # -# meta2.option('dummy1').value.set('meta2') -# meta2.option('dummy2').value.set('meta2') -# # -# assert cfg.option('dummy1').value.get() == 'meta2' -# assert cfg.option('dummy1').owner.get() == 'meta2' -# assert cfg.option('dummy2').value.get() == 'default' -# assert cfg.option('dummy2').owner.get() == 'default' -# # -# cfg.option('dummy1').property.remove('frozen') -# cfg.option('dummy2').property.remove('frozen') -# cfg.option('dummy1').value.set('cfg') -# cfg.option('dummy2').value.set('cfg') -# cfg.option('dummy1').property.add('frozen') -# cfg.option('dummy2').property.add('frozen') -# # -# assert cfg.option('dummy1').value.get() == 'meta2' -# assert cfg.option('dummy1').owner.get() == 'meta2' -# assert cfg.option('dummy2').value.get() == 'default' -# assert cfg.option('dummy2').owner.get() == 'default' -# # -# meta1.option('dummy1').value.set('meta1') -# meta1.option('dummy2').value.set('meta1') -# # -# assert cfg.option('dummy1').value.get() == 'meta1' -# assert cfg.option('dummy1').owner.get() == 'meta1' -# assert cfg.option('dummy2').value.get() == 'default' -# assert cfg.option('dummy2').owner.get() == 'default' -# # -# meta1.option('dummy1').property.add('force_metaconfig_on_freeze') -# assert cfg.option('dummy1').value.get() == 'meta2' -# assert cfg.option('dummy1').owner.get() == 'meta2' -# # -# meta2.option('dummy1').property.add('force_metaconfig_on_freeze') -# assert cfg.option('dummy1').value.get() == 'default' -# assert cfg.option('dummy1').owner.get() == 'default' -# # -# meta1.option('dummy1').property.remove('force_metaconfig_on_freeze') -# assert cfg.option('dummy1').value.get() == 'meta1' -# assert cfg.option('dummy1').owner.get() == 'meta1' -# # -# cfg.option('dummy1').property.remove('frozen') -# assert cfg.option('dummy1').value.get() == 'cfg' -# assert cfg.option('dummy1').owner.get() == 'config' -# -# -#def test_meta_get_config(): -# od = make_description() -# meta = MetaConfig(['name1', 'name2'], optiondescription=od) -# meta.config.new('meta1', type='metaconfig') -# assert isinstance(meta.config('meta1'), MetaConfig) -# assert isinstance(meta.config('name1'), Config) -# with pytest.raises(ConfigError): -# meta.config('unknown') +def test_unknown_config(): + meta = make_metaconfig() + with pytest.raises(ConfigError): + meta.config('unknown') + + +def test_error_metaconfig(): + od2 = make_description() + conf1 = Config(od2, name='conf1') + with pytest.raises(TypeError): + MetaConfig([GroupConfig([conf1])], name='meta') + + +def test_path(): + meta = make_metaconfig() + assert meta.config.path() == 'meta' + ret = meta.config('conf1') + assert ret.config.path() == 'meta.conf1' + ret = meta.config('conf2') + assert ret.config.path() == 'meta.conf2' + + +def test_none(): + meta = make_metaconfig() + conf1 = meta.config('conf1') + conf2 = meta.config('conf2') + assert meta.option('od1.i3').value.get() is conf1.option('od1.i3').value.get() is conf2.option('od1.i3').value.get() is None + assert meta.option('od1.i3').owner.get() is conf1.option('od1.i3').owner.get() is conf2.option('od1.i3').owner.get() is owners.default + # + #assert meta.option('od1.i3').value.set(3) == [] + meta.option('od1.i3').value.set(3) + assert meta.option('od1.i3').value.get() == conf1.option('od1.i3').value.get() == conf2.option('od1.i3').value.get() == 3 + assert meta.option('od1.i3').owner.get() is conf1.option('od1.i3').owner.get() is conf2.option('od1.i3').owner.get() is owners.meta1 + # + conf1.option('od1.i3').value.set(2) + assert meta.option('od1.i3').value.get() == conf2.option('od1.i3').value.get() == 3 + assert conf1.option('od1.i3').value.get() == 2 + assert meta.option('od1.i3').owner.get() is conf2.option('od1.i3').owner.get() is owners.meta1 + assert conf1.option('od1.i3').owner.get() is owners.user + # + meta.option('od1.i3').value.set(4) + assert meta.option('od1.i3').value.get() == conf2.option('od1.i3').value.get() == 4 + assert conf1.option('od1.i3').value.get() == 2 + assert meta.option('od1.i3').owner.get() is conf2.option('od1.i3').owner.get() is owners.meta1 + assert conf1.option('od1.i3').owner.get() is owners.user + # + meta.option('od1.i3').value.reset() + assert meta.option('od1.i3').value.get() is conf2.option('od1.i3').value.get() is None + assert conf1.option('od1.i3').value.get() == 2 + assert meta.option('od1.i3').owner.get() is conf2.option('od1.i3').owner.get() is owners.default + assert conf1.option('od1.i3').owner.get() is owners.user + # + conf1.option('od1.i3').value.reset() + assert meta.option('od1.i3').value.get() is conf1.option('od1.i3').value.get() is conf2.option('od1.i3').value.get() is None + assert meta.option('od1.i3').owner.get() is conf1.option('od1.i3').owner.get() is conf2.option('od1.i3').owner.get() is owners.default + + +def test_metaconfig_reset(config_type): + meta = make_metaconfig() + meta_api = get_config(meta, config_type) + assert meta_api.option('od1.i2').value.get() == 1 + meta_api.option('od1.i2').value.set(2) + if config_type == 'tiramisu-api': + meta_api.send() + conf1 = meta.config('conf1') + conf2 = meta.config('conf2') + conf1.option('od1.i2').value.set(3) + assert meta.option('od1.i2').value.get() == 2 + assert conf1.option('od1.i2').value.get() == 3 + assert conf2.option('od1.i2').value.get() == 2 + meta.config.reset() + assert meta.option('od1.i2').value.get() == 1 + assert conf1.option('od1.i2').value.get() == 3 + assert conf2.option('od1.i2').value.get() == 1 + + +def test_default(): + meta = make_metaconfig() + conf1 = meta.config('conf1') + conf2 = meta.config('conf2') + assert meta.option('od1.i2').value.get() == conf1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 1 + assert meta.option('od1.i2').owner.get() is conf1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.default + # + meta.option('od1.i2').value.set(3) + assert meta.option('od1.i2').value.get() == conf1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 3 + assert meta.option('od1.i2').owner.get() is conf1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.meta1 + # + conf1.option('od1.i2').value.set(2) + assert meta.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 3 + assert conf1.option('od1.i2').value.get() == 2 + assert meta.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.meta1 + assert conf1.option('od1.i2').owner.get() is owners.user + # + meta.option('od1.i2').value.set(4) + assert meta.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 4 + assert conf1.option('od1.i2').value.get() == 2 + assert meta.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.meta1 + assert conf1.option('od1.i2').owner.get() is owners.user + # + meta.option('od1.i2').value.reset() + assert meta.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 1 + assert conf1.option('od1.i2').value.get() == 2 + assert meta.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.default + assert conf1.option('od1.i2').owner.get() is owners.user + # + conf1.option('od1.i2').value.reset() + assert meta.option('od1.i2').value.get() == conf1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 1 + assert meta.option('od1.i2').owner.get() is conf1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.default + + +def test_contexts(): + meta = make_metaconfig() + errors = meta.value.set('od1.i2', 6, only_config=True) + assert len(errors) == 0 + conf1 = meta.config('conf1') + assert meta.option('od1.i2').value.get() == 1 + assert meta.option('od1.i2').owner.get() == owners.default + assert conf1.option('od1.i2').value.get() == conf1.option('od1.i2').value.get() == 6 + assert conf1.option('od1.i2').owner.get() == conf1.option('od1.i2').owner.get() is owners.user + + +def test_meta_meta(): + meta = make_metaconfig(double=True) + meta1 = meta.config('meta') + conf1 = meta.config('meta.conf1') + conf2 = meta.config('meta.conf2') + assert meta.option('od1.i2').value.get() == meta1.option('od1.i2').value.get() == conf1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 1 + assert meta.option('od1.i2').owner.get() is meta1.option('od1.i2').owner.get() is conf1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.default + # + meta.option('od1.i2').value.set(3) + assert meta.option('od1.i2').value.get() == meta1.option('od1.i2').value.get() == conf1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 3 + assert meta.option('od1.i2').owner.get() is meta1.option('od1.i2').owner.get() is conf1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.meta1 + # + conf1.option('od1.i2').value.set(2) + assert meta.option('od1.i2').value.get() == meta1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 3 + assert conf1.option('od1.i2').value.get() == 2 + assert meta.option('od1.i2').owner.get() is meta1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.meta1 + assert conf1.option('od1.i2').owner.get() is owners.user + # + meta1.option('od1.i2').value.set(4) + assert meta.option('od1.i2').value.get() == 3 + assert meta1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 4 + assert conf1.option('od1.i2').value.get() == 2 + assert meta.option('od1.i2').owner.get() is owners.meta1 + assert meta1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.meta2 + assert conf1.option('od1.i2').owner.get() is owners.user + # + meta1.option('od1.i2').value.reset() + assert meta.option('od1.i2').value.get() == meta1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 3 + assert conf1.option('od1.i2').value.get() == 2 + assert meta.option('od1.i2').owner.get() is meta1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.meta1 + assert conf1.option('od1.i2').owner.get() is owners.user + # + meta.option('od1.i2').value.reset() + assert meta.option('od1.i2').value.get() == meta1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 1 + assert conf1.option('od1.i2').value.get() == 2 + assert meta.option('od1.i2').owner.get() is meta1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.default + assert conf1.option('od1.i2').owner.get() is owners.user + # + conf1.option('od1.i2').value.reset() + assert meta.option('od1.i2').value.get() == meta1.option('od1.i2').value.get() == conf1.option('od1.i2').value.get() == conf2.option('od1.i2').value.get() == 1 + assert meta.option('od1.i2').owner.get() is meta1.option('od1.i2').owner.get() is conf1.option('od1.i2').owner.get() is conf2.option('od1.i2').owner.get() is owners.default + + +def test_meta_new_config(): + od = make_description() + meta = MetaConfig(['name1', 'name2'], optiondescription=od) + assert len(list(meta.config.list())) == 2 + meta.config.new('newconf1') + assert len(list(meta.config.list())) == 3 + + +def test_meta_new_config_owner(): + od = make_description() + meta = MetaConfig(['name1', 'name2'], optiondescription=od) + meta.owner.set('meta') + meta.config.new('newconf1') + assert meta.owner.get() == 'meta' + + +def test_meta_new_metaconfig(): + od = make_description() + meta = MetaConfig(['name1', 'name2'], optiondescription=od) + meta.config.new('newconf1', type='metaconfig') + newconf1 = meta.config('newconf1') + newconf1.config.new('newconf2', type='metaconfig') + newconf2 = newconf1.config('newconf2') + newconf2.config.new('newconf3') + newconf3 = newconf2.config('newconf3') + assert newconf3.config.name() == 'newconf3' + + +def test_meta_pop_config(): + od = make_description() + meta = MetaConfig(['name1', 'name2'], optiondescription=od) + meta.option('od1.i1').value.set(2) + # + assert len(list(meta.config.list())) == 2 + meta.config.new('newconf1') + newconf1 = meta.config('newconf1') + assert parse_od_get(newconf1.value.get()) == {'od1.i1': 2, 'od1.i2': 1, 'od1.i3': None, 'od1.i4': 2, 'od1.i5': [2], 'od1.i6': None} + # + assert len(list(meta.config.list())) == 3 + newconf1 = meta.config.remove('newconf1') + try: + meta.config('newconf1') + except ConfigError: + pass + else: + raise Exception('must raise') + assert parse_od_get(newconf1.value.get()) == {'od1.i1': None, 'od1.i2': 1, 'od1.i3': None, 'od1.i4': 2, 'od1.i5': [2], 'od1.i6': None} + # + assert len(list(meta.config.list())) == 2 + with pytest.raises(ConfigError): + meta.config.remove('newconf1') + + +def test_meta_add_config(): + od = make_description() + od2 = make_description() + meta = MetaConfig(['name1', 'name2'], optiondescription=od) + meta.option('od1.i1').value.set(2) + # + assert len(list(meta.config.list())) == 2 + config = Config(od, name='new') + assert parse_od_get(config.value.get()) == {'od1.i1': None, 'od1.i2': 1, 'od1.i3': None, 'od1.i4': 2, 'od1.i5': [2], 'od1.i6': None} + meta.config.add(config) + # + assert len(list(meta.config.list())) == 3 + assert parse_od_get(config.value.get()) == {'od1.i1': 2, 'od1.i2': 1, 'od1.i3': None, 'od1.i4': 2, 'od1.i5': [2], 'od1.i6': None} + # + with pytest.raises(ConflictError): + meta.config.add(config) + newconfig = Config(od2) + with pytest.raises(ValueError): + meta.config.add(newconfig) + + +def test_meta_add_config_not_name(): + od = make_description() + od2 = make_description() + meta = MetaConfig(['name1', 'name2'], optiondescription=od) + meta.option('od1.i1').value.set(2) + # + assert len(list(meta.config.list())) == 2 + config = Config(od) + with pytest.raises(ConfigError): + meta.config.add(config) + + +def test_meta_add_config_readd(): + od = make_description() + meta = MetaConfig([], optiondescription=od) + meta2 = MetaConfig([], optiondescription=od) + config = Config(od, name='new') + # + meta.config.add(config) + meta2.config.add(config) + assert len(list(config.config.parents())) == 2 + + +def test_meta_new_config_wrong_name(): + od = make_description() + meta = MetaConfig(['name1', 'name2'], optiondescription=od) + assert len(list(meta.config.list())) == 2 + with pytest.raises(ConflictError): + meta.config.new('name1') + assert len(list(meta.config.list())) == 2 + + +def test_meta_load_config(): + od = make_description() + meta = MetaConfig(['name1', 'name2'], optiondescription=od) + assert len(list(meta.config.list())) == 2 + meta.config('name1') + + +def test_meta_load_config_wrong_name(): + od = make_description() + meta = MetaConfig(['name1', 'name2'], optiondescription=od) + assert len(list(meta.config.list())) == 2 + with pytest.raises(ConfigError): + meta.config('name3') + + +def test_meta_meta_set(): + meta = make_metaconfig(double=True) + errors1 = meta.value.set('od1.i1', 7, only_config=True) + errors2 = meta.value.set('od1.i6', 7, only_config=True) + assert len(errors1) == 0 + assert len(errors2) == 2 + conf1 = meta.config('meta.conf1') + conf2 = meta.config('meta.conf2') + assert conf1.option('od1.i1').value.get() == conf2.option('od1.i1').value.get() == 7 + # + conf1.option('od1.i1').value.set(8) + assert conf1.option('od1.i1').value.get() == 8 + assert conf2.option('od1.i1').value.get() == 7 + with pytest.raises(ValueError): + meta.value.set('od1.i6', 7, only_config=True, force_default=True) + with pytest.raises(ValueError): + meta.value.set('od1.i6', 7, only_config=True, force_default_if_same=True) + with pytest.raises(ValueError): + meta.value.set('od1.i6', 7, only_config=True, force_dont_change_value=True) + + +def test_not_meta(): + i1 = IntOption('i1', '') + od1 = OptionDescription('od1', '', [i1]) + od2 = OptionDescription('od2', '', [od1]) + conf1 = Config(od2, name='conf1') + conf2 = Config(od2, name='conf2') + conf3 = Config(od2) + conf4 = Config(od2, name='conf4') + with pytest.raises(TypeError): + GroupConfig(conf1) + with pytest.raises(ConflictError): + GroupConfig([conf2, conf2], name='conf8') + grp = GroupConfig([conf1, conf2]) + assert grp.config.type() == 'groupconfig' + with pytest.raises(ConfigError): + grp.option('od1.i1').value.get() + conf1, conf2 = grp.config.list() + errors = grp.value.set('od1.i1', 7) + assert len(errors) == 0 + conf1 = grp.config('conf1') + conf2 = grp.config('conf2') + assert conf1.option('od1.i1').value.get() == conf2.option('od1.i1').value.get() == 7 + assert conf1.option('od1.i1').owner.get() is conf2.option('od1.i1').owner.get() is owners.user + grp.value.reset('od1.i1') + assert conf1.option('od1.i1').owner.get() is conf2.option('od1.i1').owner.get() is owners.default + + +def test_group_find_firsts(): + i1 = IntOption('i1', '') + od1 = OptionDescription('od1', '', [i1]) + od2 = OptionDescription('od2', '', [od1]) + conf1 = Config(od2, name='conf1') + conf2 = Config(od2, name='conf2') + grp = GroupConfig([conf1, conf2]) + newconf1, newconf2 = grp.config.list() + conf1._config_bag.context == newconf1._config_bag.context + conf2._config_bag.context == newconf2._config_bag.context + + +def test_group_group(): + i1 = IntOption('i1', '') + od1 = OptionDescription('od1', '', [i1]) + od2 = OptionDescription('od2', '', [od1]) + conf1 = Config(od2, name='conf9') + conf2 = Config(od2, name='conf10') + grp = GroupConfig([conf1, conf2], 'grp') + grp2 = GroupConfig([grp]) + errors = grp2.value.set('od1.i1', 2) + assert len(errors) == 0 + conf9 = grp2.config('grp.conf9') + assert conf9.option('od1.i1').value.get() == 2 + assert conf9.option('od1.i1').owner.get() is owners.user + + +def test_group_group_path(): + i1 = IntOption('i1', '') + od1 = OptionDescription('od1', '', [i1]) + od2 = OptionDescription('od2', '', [od1]) + conf1 = Config(od2, name='conf9') + conf2 = Config(od2, name='conf10') + grp = GroupConfig([conf1, conf2], 'grp') + grp2 = GroupConfig([grp], 'grp2') + assert grp2.config.path() == 'grp2' + newgrp = grp2.config('grp') + assert newgrp.config.path() == 'grp' + newgrp = grp2.config('grp.conf9') + assert newgrp.config.path() == 'conf9' + newgrp = grp2.config('grp.conf10') + assert newgrp.config.path() == 'conf10' + + +def test_meta_unconsistent(): + i1 = IntOption('i1', '') + i2 = IntOption('i2', '', default=1) + i3 = IntOption('i3', '') + i4 = IntOption('i4', '', default=2) + od1 = OptionDescription('od1', '', [i1, i2, i3, i4]) + od2 = OptionDescription('od2', '', [od1]) + i5 = IntOption('i5', '') + od3 = OptionDescription('od3', '', [i5]) + conf1 = Config(od2, name='conf1') + conf2 = Config(od2, name='conf2') + conf3 = Config(od2, name='conf3') + conf4 = Config(od3, name='conf4') + meta = MetaConfig([conf1, conf2]) + meta.owner.set(owners.meta1) + with pytest.raises(TypeError): + MetaConfig("string") + #same descr but conf1 already in meta + assert len(list(conf1.config.parents())) == 1 + assert len(list(conf3.config.parents())) == 0 + new_meta = MetaConfig([conf1, conf3]) + assert len(list(conf1.config.parents())) == 2 + assert len(list(conf3.config.parents())) == 1 + #not same descr + with pytest.raises(ValueError): + MetaConfig([conf3, conf4]) + + +def test_meta_leadership(): + leader = StrOption('leader', "", multi=True) + follower = StrOption('follower', "", multi=True) + interface1 = Leadership('leadership', '', [leader, follower]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + meta = MetaConfig([conf1, conf2]) + meta.property.read_write() + # + assert conf1.option('leadership.leader').value.get() == conf2.option('leadership.leader').value.get() == [] + # + meta.option('leadership.leader').value.set(["val1"]) + assert conf1.option('leadership.leader').value.get() == conf2.option('leadership.leader').value.get() == ['val1'] + assert conf1.option('leadership.follower', 0).value.get() == conf2.option('leadership.follower', 0).value.get() == None + # + meta.option('leadership.leader').value.set(["val1", "val2"]) + meta.option('leadership.follower', 0).value.set("val3") + assert conf1.option('leadership.leader').value.get() == conf2.option('leadership.leader').value.get() == ['val1', 'val2'] + assert conf1.option('leadership.follower', 0).value.get() == conf2.option('leadership.follower', 0).value.get() == "val3" + assert conf1.option('leadership.follower', 1).value.get() == conf2.option('leadership.follower', 1).value.get() == None + + +def test_meta_leadership_value(): + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + meta = MetaConfig([conf1, conf2], name="meta") + conf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.8']) + assert conf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None + with pytest.raises(ConfigError): + conf1.option('ip_admin_eth0.ip_admin_eth0', 0).value.get() + # + conf1.option('ip_admin_eth0.ip_admin_eth0').value.reset() + # + meta.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + assert conf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None + meta.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') + assert conf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.0' + meta.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.0.0') + assert conf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' + # + conf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + assert conf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' + # + meta.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.2.1', '192.168.3.1']) + meta.option('ip_admin_eth0.netmask_admin_eth0', 1).value.set('255.255.255.0') + # + assert conf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + assert conf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' + + +def test_meta_leadership_value_default(): + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + meta = MetaConfig([conf1, conf2]) + newconf1 = meta.config('conf1') + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None + # + meta.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None + # + meta.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.0' + # + meta.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.0.0') + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' + + +def test_meta_leadership_owners(): + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + meta = MetaConfig([conf1, conf2]) + meta.owner.set(owners.meta1) + newconf1 = meta.config('conf1') + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + with pytest.raises(LeadershipError): + newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.user + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.reset() + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + # + meta.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.meta1 + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() + # + meta.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.meta1 + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == owners.meta1 + # + meta.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.0.0') + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.meta1 + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == owners.meta1 + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.user + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == owners.meta1 + + +def test_meta_force_default(): + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + meta = MetaConfig([conf1, conf2]) + meta.property.read_write() + meta.owner.set('meta1') + newconf1 = meta.config('conf1') + newconf2 = meta.config('conf2') + assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + # + errors = meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.1']) + assert len(errors) == 0 + assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.2']) + assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.2'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + # + errors = meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.3']) + assert len(errors) == 0 + assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.2'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] + # + errors = meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_default=True) + assert len(errors) == 0 + assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + + +def test_meta_force_dont_change_value(): + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + meta = MetaConfig([conf1, conf2]) + meta.property.read_write() + meta.owner.set('meta1') + assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + newconf1 = meta.config('conf1') + newconf2 = meta.config('conf2') + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.4']) + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + errors = meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_dont_change_value=True) + assert len(errors) == 0 + assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + + +def test_meta_force_default_if_same(): + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + meta = MetaConfig([conf1, conf2]) + meta.property.read_write() + meta.owner.set('meta1') + # + newconf1 = meta.config('conf1') + newconf2 = meta.config('conf2') + assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.4']) + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + errors = meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_default_if_same=True) + assert len(errors) == 0 + assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.meta1 + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.meta1 + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.3']) + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.meta1 + errors = meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.5'], force_default_if_same=True) + assert len(errors) == 0 + assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.5'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.5'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.meta1 + + +def test_meta_force_default_if_same_and_dont_change(): + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + meta = MetaConfig([conf1, conf2]) + meta.property.read_write() + meta.owner.set('meta1') + # + newconf1 = meta.config('conf1') + newconf2 = meta.config('conf2') + assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.4']) + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + errors = meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_default_if_same=True, force_dont_change_value=True) + assert len(errors) == 0 + assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.meta1 + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.3']) + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + errors = meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.5'], force_default_if_same=True, force_dont_change_value=True) + assert len(errors) == 0 + assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.5'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + + +def test_meta_force_default_and_dont_change(): + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='rconf1') + conf2 = Config(od, name='rconf2') + meta = MetaConfig([conf1, conf2]) + meta.property.read_write() + meta.owner.set('meta1') + with pytest.raises(ValueError): + meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_default=True, force_dont_change_value=True) + + +def test_meta_properties_meta(): + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, validators=[Calculation(valid_network_netmask, Params((ParamOption(ip_admin_eth0), ParamSelfOption())))]) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0], properties=('disabled',)) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + conf1.property.read_write() + conf2.property.read_write() + meta = MetaConfig([conf1, conf2]) + meta.property.read_write() + ret = meta.config('conf1') + assert parse_od_get(ret.value.get()) == {} + + +def test_meta_exception_meta(): + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", Calculation(raise_exception), multi=True, validators=[Calculation(valid_network_netmask, Params((ParamOption(ip_admin_eth0), ParamSelfOption())))]) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + meta = MetaConfig([conf1, conf2]) + meta.property.read_write() + with pytest.raises(Exception): + conf1.make_dict() + + +def test_meta_properties_requires1(): + opt1 = BoolOption('opt1', 'opt1', False) + opt2 = BoolOption('opt2', "") + disabled_property = Calculation(calc_value, + Params(ParamValue('disabled'), + kwargs={'condition': ParamOption(opt1), + 'expected': ParamValue(False)})) + od2 = OptionDescription('od2', "", [opt2], properties=(disabled_property,)) + opt3 = BoolOption('opt3', '', validators=[Calculation(valid_not_equal, Params((ParamSelfOption(), ParamOption(opt2))))]) + od = OptionDescription('root', '', [opt1, od2, opt3]) + conf1 = Config(od, name='conf1') + conf1.property.read_write() + meta = MetaConfig([conf1], 'meta') + meta.property.read_write() + meta.option('opt1').value.set(True) + # + conf1.option('od2.opt2').value.set(False) + + +def test_meta_properties_requires_mandatory(): + probes = BoolOption('probes', 'probes available', False) + eth0_method = ChoiceOption('eth0_method', '', ('static', 'dhcp'), 'static') + ip_address = IPOption('ip_address', '') + mandatory_property = Calculation(calc_value, + Params(ParamValue('mandatory'), + kwargs={'condition': ParamOption(probes), + 'expected': ParamValue('yes'), + 'default': ParamValue(None)})) + ip_eth0 = IPOption('ip_eth0', "ip", Calculation(return_condition, Params(kwargs={'val': ParamOption(ip_address), 'condition': ParamOption(eth0_method), 'expected': ParamValue('dhcp')})), properties=(mandatory_property,)) + ip_gw = IPOption('ip_gw', 'gw', validators=[Calculation(valid_not_equal, Params((ParamSelfOption(), ParamOption(ip_eth0))))]) + od = OptionDescription('root', '', [ip_gw, probes, eth0_method, ip_address, ip_eth0]) + conf1 = Config(od, name='conf1') + conf1.property.read_write() + meta = MetaConfig([conf1], 'meta') + # + meta.option('probes').value.set(True) + meta.option('ip_address').value.set('1.1.1.1') + meta.option('ip_gw').value.set('1.1.1.2') + conf1.option('eth0_method').value.set('dhcp') + conf1.property.read_only() + assert parse_od_get(conf1.value.get()) == {'ip_gw': '1.1.1.2', 'probes': True, 'eth0_method': 'dhcp', 'ip_address': '1.1.1.1', 'ip_eth0': '1.1.1.1'} + + +def test_meta_callback(): + val1 = StrOption('val1', "", 'val') + val2 = StrOption('val2', "", Calculation(return_value, Params(ParamOption(val1)))) + val3 = StrOption('val3', "", Calculation(return_value, Params(ParamValue('yes')))) + val4 = StrOption('val4', "", Calculation(return_value, Params(kwargs={'value': ParamOption(val1)}))) + val5 = StrOption('val5', "", Calculation(return_value, Params(kwargs={'value': ParamValue('yes')}))) + maconfig = OptionDescription('rootconfig', '', [val1, val2, val3, val4, val5]) + cfg = Config(maconfig, name='cfg') + meta = MetaConfig([cfg]) + meta.property.read_write() + newcfg = meta.config('cfg') + assert parse_od_get(newcfg.value.get()) == {'val3': 'yes', 'val2': 'val', 'val1': 'val', 'val5': 'yes', 'val4': 'val'} + newcfg.option('val1').value.set('new') + assert parse_od_get(newcfg.value.get()) == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new'} + newcfg.option('val1').value.reset() + meta.option('val1').value.set('new') + assert parse_od_get(newcfg.value.get()) == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new'} + newcfg.option('val4').value.set('new1') + assert parse_od_get(newcfg.value.get()) == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new1'} + newcfg.option('val4').value.reset() + meta.option('val4').value.set('new1') + assert parse_od_get(newcfg.value.get()) == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new1'} + meta.option('val4').value.reset() + + +def test_meta_callback_follower(): + val = StrOption('val', "", default='val') + val1 = StrOption('val1', "", [Calculation(return_value, Params(ParamOption(val)))], multi=True) + val3 = StrOption('val2', "", Calculation(return_value, Params(ParamOption(val1))), multi=True) + val4 = StrOption('val3', "", Calculation(return_value, Params(ParamOption(val1))), multi=True) + interface1 = Leadership('val1', '', [val1, val3, val4]) + od = OptionDescription('root', '', [interface1]) + maconfig = OptionDescription('rootconfig', '', [val, interface1]) + conf1 = Config(maconfig, name='conf1') + meta = MetaConfig([conf1]) + meta.property.read_write() + assert parse_od_get(conf1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val', 'val1.val3': 'val'}]} + # + conf1.option('val').value.set('val1') + assert parse_od_get(conf1.value.get()) == {'val': 'val1', 'val1.val1': [{'val1.val1': 'val1', 'val1.val2': 'val1', 'val1.val3': 'val1'}]} + # + conf1.option('val').value.reset() + meta.option('val').value.set('val1') + assert parse_od_get(conf1.value.get()) == {'val': 'val1', 'val1.val1': [{'val1.val1': 'val1', 'val1.val2': 'val1', 'val1.val3': 'val1'}]} + # + meta.option('val').value.reset() + conf1.option('val1.val2', 0).value.set('val2') + assert parse_od_get(conf1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val2', 'val1.val3': 'val'}]} + # + conf1.option('val1.val2', 0).value.reset() + assert parse_od_get(conf1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val', 'val1.val3': 'val'}]} + # + meta.option('val1.val2', 0).value.set('val2') + assert parse_od_get(conf1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val2', 'val1.val3': 'val'}]} + # + meta.option('val1.val1').value.set(['val']) + assert parse_od_get(conf1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val2', 'val1.val3': 'val'}]} + # + conf1.option('val1.val3', 0).value.set('val6') + assert parse_od_get(conf1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val2', 'val1.val3': 'val6'}]} + # + meta.option('val1.val2', 0).value.reset() + conf1.option('val1.val3', 0).value.reset() + conf1.option('val1.val1').value.set(['val3']) + assert parse_od_get(conf1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val3', 'val1.val2': 'val3', 'val1.val3': 'val3'}]} + # + conf1.option('val1.val1').value.reset() + assert parse_od_get(conf1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val', 'val1.val3': 'val'}]} + # + meta.option('val1.val1').value.set(['val3']) + assert parse_od_get(conf1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val3', 'val1.val2': 'val3', 'val1.val3': 'val3'}]} + # + conf1.option('val1.val2', 0).value.set('val2') + assert parse_od_get(conf1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val3', 'val1.val2': 'val2', 'val1.val3': 'val3'}]} + # + meta.option('val1.val1').value.set(['val3', 'rah']) + assert parse_od_get(conf1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val3', 'val1.val2': 'val2', 'val1.val3': 'val3'}, {'val1.val1': 'rah', 'val1.val2': 'rah', 'val1.val3': 'rah'}]} + # + meta.option('val1.val1').value.pop(1) + meta.option('val1.val1').value.set(['val4']) + assert parse_od_get(conf1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val4', 'val1.val2': 'val2', 'val1.val3': 'val4'}]} + + +def test_meta_reset(): + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + meta = MetaConfig([conf1, conf2]) + meta.property.read_write() + meta.owner.set('meta1') + newconf1 = meta.config('conf1') + newconf2 = meta.config('conf2') + assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + errors = meta.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.1']) + assert len(errors) == 0 + assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.2']) + assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.2'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + meta.value.reset('ip_admin_eth0.ip_admin_eth0') + assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + + +def test_meta_properties_meta_copy(): + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, properties=('disabled',)) + interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + conf1 = Config(interface1, name='conf1') + conf2 = Config(interface1, name='conf2') + conf1.property.read_write() + conf2.property.read_write() + meta = MetaConfig([conf1, conf2], name='meta1') + meta.property.read_write() + + newconf1 = meta.config('conf1') + newconf2 = meta.config('conf2') + conf3 = newconf1.config.copy(name='conf3') + meta2 = list(conf3.config.parents()) + assert len(meta2) == 1 + assert meta.config.name() == meta2[0].config.name() + + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + newconf3 = meta.config('conf3') + assert parse_od_get(newconf3.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + meta.option('ip_admin_eth0').value.set(['192.168.1.2']) + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.2']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth0': ['192.168.1.2']} + assert parse_od_get(newconf3.value.get()) == {'ip_admin_eth0': ['192.168.1.2']} + ret = meta.value.set('ip_admin_eth0', ['192.168.1.3'], force_default_if_same=True) + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.3']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth0': ['192.168.1.3']} + assert parse_od_get(newconf3.value.get()) == {'ip_admin_eth0': ['192.168.1.3']} + + +def test_meta_properties_meta_deepcopy(): + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, + properties=('disabled',)) + interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + conf1 = Config(interface1, name='conf1') + conf2 = Config(interface1, name='conf2') + conf1.property.read_write() + conf2.property.read_write() + meta = MetaConfig([conf1, conf2]) + meta.permissive.add('hidden') + meta.property.read_write() + + newconf1 = meta.config('conf1') + newconf2 = meta.config('conf2') + meta2 = newconf1.config.deepcopy(name='conf3') + newconf3 = meta2.config('conf3') + assert meta != meta2 + assert meta.permissive.get() == meta2.permissive.get() + + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + assert parse_od_get(newconf3.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + meta.option('ip_admin_eth0').value.set(['192.168.1.2']) + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.2']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth0': ['192.168.1.2']} + assert parse_od_get(newconf3.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + meta.value.set('ip_admin_eth0', ['192.168.1.3'], force_default_if_same=True) + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.3']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth0': ['192.168.1.3']} + assert parse_od_get(newconf3.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + + +def test_meta_properties_meta_deepcopy_multi_parent(): + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip") + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask") + interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + conf1 = Config(interface1, name='conf1') + conf2 = Config(interface1, name='conf2') + conf1.property.read_write() + conf2.property.read_write() + meta1 = MetaConfig([conf1, conf2], name='meta1') + meta1.permissive.add('hidden') + meta1.property.read_write() + + meta2 = MetaConfig(['name1', 'name2'], optiondescription=interface1, name='meta2') + meta2.config.add(conf1) + + meta1.option('ip_admin_eth0').value.set('192.168.1.1') + meta2.option('netmask_admin_eth0').value.set('255.255.255.0') + + assert parse_od_get(meta1.value.get()) == {'ip_admin_eth0': '192.168.1.1', 'netmask_admin_eth0': None} + assert parse_od_get(meta2.value.get()) == {'ip_admin_eth0': None, 'netmask_admin_eth0': '255.255.255.0'} + assert parse_od_get(conf1.value.get()) == {'ip_admin_eth0': '192.168.1.1', 'netmask_admin_eth0': '255.255.255.0'} + assert parse_od_get(conf2.value.get()) == {'ip_admin_eth0': '192.168.1.1', 'netmask_admin_eth0': None} + + copy_meta2 = conf1.config.deepcopy(name='copy_conf1', metaconfig_prefix='copy_') + assert copy_meta2.config.path() == 'copy_meta2' + copy_meta1 = copy_meta2.config('copy_meta1') + copy_conf1 = copy_meta1.config('copy_conf1') + assert parse_od_get(copy_meta2.value.get()) == {'ip_admin_eth0': None, 'netmask_admin_eth0': '255.255.255.0'} + assert parse_od_get(copy_conf1.value.get()) == {'ip_admin_eth0': '192.168.1.1', 'netmask_admin_eth0': '255.255.255.0'} + + +def test_meta_properties_submeta_deepcopy(): + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, + properties=('disabled',)) + interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + conf1 = Config(interface1, name='conf1') + conf1.property.read_write() + meta1 = MetaConfig([conf1], name='meta1') + meta2 = MetaConfig([meta1], name='meta2') + meta_copy = conf1.config.deepcopy(name='conf2', + metaconfig_prefix='copy_') + assert meta_copy.config.name() == 'copy_meta2' + newcopy = meta_copy.config('copy_meta1') + assert newcopy.config.name() == 'copy_meta1' + newcopy = newcopy.config('conf2') + assert newcopy.config.name() == 'conf2' + + +def test_meta_properties_copy_meta(): + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, + properties=('disabled',)) + interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + conf1 = Config(interface1, name='conf1') + conf1.property.read_write() + meta1 = MetaConfig([conf1], name='meta1') + meta2 = MetaConfig([meta1], name='meta2') + meta_copy = meta1.config.copy(name='meta3') + assert meta_copy.config.name() == 'meta3' + assert list(meta_copy.config.list()) == [] + + +def test_meta_properties_deepcopy_meta(): + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, + properties=('disabled',)) + interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + conf1 = Config(interface1, name='conf1') + conf1.property.read_write() + meta1 = MetaConfig([conf1], name='meta1') + meta2 = MetaConfig([meta1], name='meta2') + meta_copy = meta1.config.deepcopy(name='meta3', + metaconfig_prefix='copy_') + assert meta_copy.config.name() == 'copy_meta2' + newcopy = meta_copy.config('meta3') + assert newcopy.config.name() == 'meta3' + assert list(newcopy.config.list()) == [] + + +def test_meta_properties_submeta_deepcopy_owner(): + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip") + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask") + interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + conf1 = Config(interface1, name='conf1') + conf1.owner.set('conf1_user') + conf1.property.read_write() + meta1 = MetaConfig([conf1], name='meta1') + meta1.owner.set('meta1_user') + meta2 = MetaConfig([meta1], name='meta2') + meta2.owner.set('meta2_user') + # + conf1.option('ip_admin_eth0').value.set('192.168.0.1') + assert conf1.option('ip_admin_eth0').owner.get() == 'conf1_user' + meta1.option('ip_admin_eth0').value.set('192.168.0.2') + assert meta1.option('ip_admin_eth0').owner.get() == 'meta1_user' + meta2.option('ip_admin_eth0').value.set('192.168.0.3') + assert meta2.option('ip_admin_eth0').owner.get() == 'meta2_user' + # + meta2_copy = conf1.config.deepcopy(name='conf2', + metaconfig_prefix='copy_') + meta2_copy.option('netmask_admin_eth0').value.set('255.255.255.255') + assert meta2_copy.option('ip_admin_eth0').value.get() == '192.168.0.3' + assert meta2_copy.option('ip_admin_eth0').owner.get() == 'meta2_user' + assert meta2_copy.option('netmask_admin_eth0').owner.get() == 'meta2_user' + # + meta1_copy = meta2_copy.config('copy_meta1') + meta1_copy.option('netmask_admin_eth0').value.set('255.255.255.255') + assert meta1_copy.option('ip_admin_eth0').value.get() == '192.168.0.2' + assert meta1_copy.option('ip_admin_eth0').owner.get() == 'meta1_user' + assert meta1_copy.option('netmask_admin_eth0').owner.get() == 'meta1_user' + # + conf2 = meta1_copy.config('conf2') + conf2.owner.set('conf2_user') + conf2.option('netmask_admin_eth0').value.set('255.255.255.255') + assert conf2.option('netmask_admin_eth0').owner.get() == 'conf2_user' + assert conf2.option('ip_admin_eth0').value.get() == '192.168.0.1' + assert conf2.option('ip_admin_eth0').owner.get() == 'conf1_user' + + +def test_meta_properties_meta_set_value(): + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, properties=('disabled',)) + interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + conf1 = Config(interface1, name='conf1') + conf2 = Config(interface1, name='conf2') + conf1.property.read_write() + conf2.property.read_write() + meta = MetaConfig([conf1, conf2]) + meta.property.read_write() + ret = meta.config('conf1') + assert parse_od_get(ret.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + ret = meta.value.set('netmask_admin_eth0', ['255.255.255.255'], only_config=True) + assert len(ret) == 2 + assert isinstance(ret[0], PropertiesOptionError) + assert isinstance(ret[1], PropertiesOptionError) + del ret[1] + del ret[0] + del ret + ret = meta.value.set('netmask_admin_eth0', ['255.255.255.255'], force_default=True) + assert len(ret) == 1 + assert isinstance(ret[0], PropertiesOptionError) + del ret[0] + del ret + ret = meta.value.set('netmask_admin_eth0', ['255.255.255.255'], force_dont_change_value=True) + assert len(ret) == 3 + assert isinstance(ret[0], PropertiesOptionError) + assert isinstance(ret[1], PropertiesOptionError) + assert isinstance(ret[2], PropertiesOptionError) + del ret[2] + del ret[1] + del ret[0] + del ret + ret = meta.value.set('netmask_admin_eth0', ['255.255.255.255'], force_default_if_same=True) + assert len(ret) == 1 + assert isinstance(ret[0], PropertiesOptionError) + del ret[0] + del ret + ret = meta.value.set('ip_admin_eth0', '255.255.255.255', only_config=True) + assert len(ret) == 2 + assert isinstance(ret[0], ValueError) + assert isinstance(ret[1], ValueError) + del ret[1] + del ret[0] + del ret + ret = meta.value.set('ip_admin_eth0', '255.255.255.255', force_default=True) + assert len(ret) == 1 + assert isinstance(ret[0], ValueError) + del ret[0] + del ret + ret = meta.value.set('ip_admin_eth0', '255.255.255.255', force_dont_change_value=True) + assert len(ret) == 1 + assert isinstance(ret[0], ValueError) + del ret[0] + del ret + ret = meta.value.set('ip_admin_eth0', '255.255.255.255', force_default_if_same=True) + assert len(ret) == 1 + assert isinstance(ret[0], ValueError) + del ret[0] + del ret + + +def test_metaconfig_force_metaconfig_on_freeze(): + dummy1 = StrOption('dummy1', 'doc dummy', default='default', properties=('force_metaconfig_on_freeze',)) + group = OptionDescription('group', '', [dummy1]) + cfg = Config(group, name='cfg') + cfg.owner.set(owners.config) + meta1 = MetaConfig([cfg], name='meta1') + meta1.owner.set(owners.meta1) + meta2 = MetaConfig([meta1], name='meta2') + meta2.owner.set(owners.meta2) + cfg.property.read_write() + + cfg.option('dummy1').property.add('frozen') + # + assert cfg.option('dummy1').value.get() == 'default' + assert cfg.option('dummy1').owner.get() == 'default' + # + meta2.option('dummy1').value.set('meta2') + # + assert cfg.option('dummy1').value.get() == 'meta2' + assert cfg.option('dummy1').owner.get() == 'meta2' + # + cfg.option('dummy1').property.remove('frozen') + cfg.option('dummy1').value.set('cfg') + cfg.option('dummy1').property.add('frozen') + # + assert cfg.option('dummy1').value.get() == 'meta2' + assert cfg.option('dummy1').owner.get() == 'meta2' + # + meta1.option('dummy1').value.set('meta1') + # + assert cfg.option('dummy1').value.get() == 'meta1' + assert cfg.option('dummy1').owner.get() == 'meta1' + # + cfg.option('dummy1').property.remove('frozen') + assert cfg.option('dummy1').value.get() == 'cfg' + assert cfg.option('dummy1').owner.get() == 'config' + + +def test_metaconfig_force_metaconfig_on_freeze_option(): + dummy1 = StrOption('dummy1', 'doc dummy', default='default') + dummy2 = StrOption('dummy2', 'doc dummy', default='default', properties=('force_default_on_freeze',)) + group = OptionDescription('group', '', [dummy1, dummy2]) + cfg = Config(group, name='cfg') + cfg.owner.set(owners.config) + meta1 = MetaConfig([cfg], name='meta1') + meta1.owner.set(owners.meta1) + meta2 = MetaConfig([meta1], name='meta2') + meta2.owner.set(owners.meta2) + cfg.property.read_write() + + cfg.option('dummy1').property.add('frozen') + cfg.option('dummy1').property.add('force_metaconfig_on_freeze') + cfg.option('dummy2').property.add('frozen') + # + assert cfg.option('dummy1').value.get() == 'default' + assert cfg.option('dummy1').owner.get() == 'default' + assert cfg.option('dummy2').value.get() == 'default' + assert cfg.option('dummy2').owner.get() == 'default' + # + meta2.option('dummy1').value.set('meta2') + meta2.option('dummy2').value.set('meta2') + # + assert cfg.option('dummy1').value.get() == 'meta2' + assert cfg.option('dummy1').owner.get() == 'meta2' + assert cfg.option('dummy2').value.get() == 'default' + assert cfg.option('dummy2').owner.get() == 'default' + # + cfg.option('dummy1').property.remove('frozen') + cfg.option('dummy2').property.remove('frozen') + cfg.option('dummy1').value.set('cfg') + cfg.option('dummy2').value.set('cfg') + cfg.option('dummy1').property.add('frozen') + cfg.option('dummy2').property.add('frozen') + # + assert cfg.option('dummy1').value.get() == 'meta2' + assert cfg.option('dummy1').owner.get() == 'meta2' + assert cfg.option('dummy2').value.get() == 'default' + assert cfg.option('dummy2').owner.get() == 'default' + # + meta1.option('dummy1').value.set('meta1') + meta1.option('dummy2').value.set('meta1') + # + assert cfg.option('dummy1').value.get() == 'meta1' + assert cfg.option('dummy1').owner.get() == 'meta1' + assert cfg.option('dummy2').value.get() == 'default' + assert cfg.option('dummy2').owner.get() == 'default' + # + meta1.option('dummy1').property.add('force_metaconfig_on_freeze') + assert cfg.option('dummy1').value.get() == 'meta2' + assert cfg.option('dummy1').owner.get() == 'meta2' + # + meta2.option('dummy1').property.add('force_metaconfig_on_freeze') + assert cfg.option('dummy1').value.get() == 'default' + assert cfg.option('dummy1').owner.get() == 'default' + # + meta1.option('dummy1').property.remove('force_metaconfig_on_freeze') + assert cfg.option('dummy1').value.get() == 'meta1' + assert cfg.option('dummy1').owner.get() == 'meta1' + # + cfg.option('dummy1').property.remove('frozen') + assert cfg.option('dummy1').value.get() == 'cfg' + assert cfg.option('dummy1').owner.get() == 'config' + + +def test_meta_get_config(): + od = make_description() + meta = MetaConfig(['name1', 'name2'], optiondescription=od) + meta.config.new('meta1', type='metaconfig') + assert isinstance(meta.config('meta1'), MetaConfig) + assert isinstance(meta.config('name1'), Config) + with pytest.raises(ConfigError): + meta.config('unknown') diff --git a/tests/test_mixconfig.py b/tests/test_mixconfig.py index e44f6f7..e2e1184 100644 --- a/tests/test_mixconfig.py +++ b/tests/test_mixconfig.py @@ -9,6 +9,7 @@ from tiramisu import IntOption, StrOption, NetworkOption, NetmaskOption, \ MetaConfig, Params, ParamOption, ParamValue, ParamSelfOption, Calculation, \ valid_network_netmask from tiramisu.error import ConfigError, ConflictError, PropertiesOptionError, LeadershipError +from .config import parse_od_get owners.addowner('mix1') owners.addowner('mix2') @@ -89,129 +90,129 @@ def make_mixconfig(double=False): return mix -#def test_mix_name(): -# mix = make_mixconfig(True) -# assert mix.config.path() == 'doublemix' -# ret = mix.config('mix') -# assert ret.config.path() == 'doublemix.mix' -# ret = mix.config('mix.conf1') -# assert ret.config.path() == 'doublemix.mix.conf1' -# ret = mix.config('mix.conf2') -# assert ret.config.path() == 'doublemix.mix.conf2' -# -# -#def test_mix_not_group(): -# i1 = IntOption('i1', '') -# od1 = OptionDescription('od1', '', [i1]) -# od2 = OptionDescription('od2', '', [od1]) -# cfg = Config(od2, name='conf1') -# grp = GroupConfig([cfg]) -# with pytest.raises(TypeError): -# MixConfig(od2, [grp], name='error') -## assert not list_sessions() -# -# -#def test_unknown_config(): -# mix = make_mixconfig() -# with pytest.raises(ConfigError): -# mix.config('unknown') -# -# -#def test_none(): -# mix = make_mixconfig() -# newconf1 = mix.config('conf1') -# newconf2 = mix.config('conf2') -# assert mix.option('od1.i3').value.get() is newconf1.option('od1.i3').value.get() is newconf2.option('od1.i3').value.get() is None -# assert mix.option('od1.i3').owner.get() is newconf1.option('od1.i3').owner.get() is newconf2.option('od1.i3').owner.get() is owners.default -# # -# mix.option('od1.i3').value.set(3) -# assert mix.option('od1.i3').value.get() == newconf1.option('od1.i3').value.get() == newconf2.option('od1.i3').value.get() == 3 -# assert mix.option('od1.i3').owner.get() is newconf1.option('od1.i3').owner.get() is newconf2.option('od1.i3').owner.get() is owners.mix1 -# # -# newconf1.option('od1.i3').value.set(2) -# assert mix.option('od1.i3').value.get() == newconf2.option('od1.i3').value.get() == 3 -# assert newconf1.option('od1.i3').value.get() == 2 -# assert mix.option('od1.i3').owner.get() is newconf2.option('od1.i3').owner.get() is owners.mix1 -# assert newconf1.option('od1.i3').owner.get() is owners.user -# # -# mix.option('od1.i3').value.set(4) -# assert mix.option('od1.i3').value.get() == newconf2.option('od1.i3').value.get() == 4 -# assert newconf1.option('od1.i3').value.get() == 2 -# assert mix.option('od1.i3').owner.get() is newconf2.option('od1.i3').owner.get() is owners.mix1 -# assert newconf1.option('od1.i3').owner.get() is owners.user -# # -# mix.option('od1.i3').value.reset() -# assert mix.option('od1.i3').value.get() is newconf2.option('od1.i3').value.get() is None -# assert newconf1.option('od1.i3').value.get() == 2 -# assert mix.option('od1.i3').owner.get() is newconf2.option('od1.i3').owner.get() is owners.default -# assert newconf1.option('od1.i3').owner.get() is owners.user -# # -# newconf1.option('od1.i3').value.reset() -# assert mix.option('od1.i3').value.get() is newconf1.option('od1.i3').value.get() is newconf2.option('od1.i3').value.get() is None -# assert mix.option('od1.i3').owner.get() is newconf1.option('od1.i3').owner.get() is newconf2.option('od1.i3').owner.get() is owners.default -# # -# assert mix.config.name() == mix.config.name() -# -# -#def test_reset(): -# mix = make_mixconfig() -# assert mix.option('od1.i2').value.get() == 1 -# mix.option('od1.i2').value.set(2) -# newconf1 = mix.config('conf1') -# newconf2 = mix.config('conf2') -# newconf1.option('od1.i2').value.set(3) -# assert mix.option('od1.i2').value.get() == 2 -# assert newconf1.option('od1.i2').value.get() == 3 -# assert newconf2.option('od1.i2').value.get() == 2 -# mix.config.reset() -# assert mix.option('od1.i2').value.get() == 1 -# assert newconf1.option('od1.i2').value.get() == 3 -# assert newconf2.option('od1.i2').value.get() == 1 -# -# -#def test_default(): -# mix = make_mixconfig() -# newconf1 = mix.config('conf1') -# newconf2 = mix.config('conf2') -# assert mix.option('od1.i2').value.get() == newconf1.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 1 -# assert mix.option('od1.i2').owner.get() is newconf1.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.default -# # -# mix.option('od1.i2').value.set(3) -# assert mix.option('od1.i2').value.get() == newconf1.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 3 -# assert mix.option('od1.i2').owner.get() is newconf1.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.mix1 -# # -# newconf1.option('od1.i2').value.set(2) -# assert mix.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 3 -# assert newconf1.option('od1.i2').value.get() == 2 -# assert mix.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.mix1 -# assert newconf1.option('od1.i2').owner.get() is owners.user -# # -# mix.option('od1.i2').value.set(4) -# assert mix.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 4 -# assert newconf1.option('od1.i2').value.get() == 2 -# assert mix.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.mix1 -# assert newconf1.option('od1.i2').owner.get() is owners.user -# # -# mix.option('od1.i2').value.reset() -# assert mix.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 1 -# assert newconf1.option('od1.i2').value.get() == 2 -# assert mix.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.default -# assert newconf1.option('od1.i2').owner.get() is owners.user -# # -# newconf1.option('od1.i2').value.reset() -# assert mix.option('od1.i2').value.get() == newconf1.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 1 -# assert mix.option('od1.i2').owner.get() is newconf1.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.default -# -# -#def test_contexts(): -# mix = make_mixconfig() -# errors = mix.value.set('od1.i2', 6, only_config=True) -# newconf1 = mix.config('conf1') -# assert mix.option('od1.i2').value.get() == 1 -# assert mix.option('od1.i2').owner.get() == owners.default -# assert newconf1.option('od1.i2').value.get() == newconf1.option('od1.i2').value.get() == 6 -# assert newconf1.option('od1.i2').owner.get() == newconf1.option('od1.i2').owner.get() is owners.user -# assert len(errors) == 0 +def test_mix_name(): + mix = make_mixconfig(True) + assert mix.config.path() == 'doublemix' + ret = mix.config('mix') + assert ret.config.path() == 'doublemix.mix' + ret = mix.config('mix.conf1') + assert ret.config.path() == 'doublemix.mix.conf1' + ret = mix.config('mix.conf2') + assert ret.config.path() == 'doublemix.mix.conf2' + + +def test_mix_not_group(): + i1 = IntOption('i1', '') + od1 = OptionDescription('od1', '', [i1]) + od2 = OptionDescription('od2', '', [od1]) + cfg = Config(od2, name='conf1') + grp = GroupConfig([cfg]) + with pytest.raises(TypeError): + MixConfig(od2, [grp], name='error') +# assert not list_sessions() + + +def test_unknown_config(): + mix = make_mixconfig() + with pytest.raises(ConfigError): + mix.config('unknown') + + +def test_none(): + mix = make_mixconfig() + newconf1 = mix.config('conf1') + newconf2 = mix.config('conf2') + assert mix.option('od1.i3').value.get() is newconf1.option('od1.i3').value.get() is newconf2.option('od1.i3').value.get() is None + assert mix.option('od1.i3').owner.get() is newconf1.option('od1.i3').owner.get() is newconf2.option('od1.i3').owner.get() is owners.default + # + mix.option('od1.i3').value.set(3) + assert mix.option('od1.i3').value.get() == newconf1.option('od1.i3').value.get() == newconf2.option('od1.i3').value.get() == 3 + assert mix.option('od1.i3').owner.get() is newconf1.option('od1.i3').owner.get() is newconf2.option('od1.i3').owner.get() is owners.mix1 + # + newconf1.option('od1.i3').value.set(2) + assert mix.option('od1.i3').value.get() == newconf2.option('od1.i3').value.get() == 3 + assert newconf1.option('od1.i3').value.get() == 2 + assert mix.option('od1.i3').owner.get() is newconf2.option('od1.i3').owner.get() is owners.mix1 + assert newconf1.option('od1.i3').owner.get() is owners.user + # + mix.option('od1.i3').value.set(4) + assert mix.option('od1.i3').value.get() == newconf2.option('od1.i3').value.get() == 4 + assert newconf1.option('od1.i3').value.get() == 2 + assert mix.option('od1.i3').owner.get() is newconf2.option('od1.i3').owner.get() is owners.mix1 + assert newconf1.option('od1.i3').owner.get() is owners.user + # + mix.option('od1.i3').value.reset() + assert mix.option('od1.i3').value.get() is newconf2.option('od1.i3').value.get() is None + assert newconf1.option('od1.i3').value.get() == 2 + assert mix.option('od1.i3').owner.get() is newconf2.option('od1.i3').owner.get() is owners.default + assert newconf1.option('od1.i3').owner.get() is owners.user + # + newconf1.option('od1.i3').value.reset() + assert mix.option('od1.i3').value.get() is newconf1.option('od1.i3').value.get() is newconf2.option('od1.i3').value.get() is None + assert mix.option('od1.i3').owner.get() is newconf1.option('od1.i3').owner.get() is newconf2.option('od1.i3').owner.get() is owners.default + # + assert mix.config.name() == mix.config.name() + + +def test_reset(): + mix = make_mixconfig() + assert mix.option('od1.i2').value.get() == 1 + mix.option('od1.i2').value.set(2) + newconf1 = mix.config('conf1') + newconf2 = mix.config('conf2') + newconf1.option('od1.i2').value.set(3) + assert mix.option('od1.i2').value.get() == 2 + assert newconf1.option('od1.i2').value.get() == 3 + assert newconf2.option('od1.i2').value.get() == 2 + mix.config.reset() + assert mix.option('od1.i2').value.get() == 1 + assert newconf1.option('od1.i2').value.get() == 3 + assert newconf2.option('od1.i2').value.get() == 1 + + +def test_default(): + mix = make_mixconfig() + newconf1 = mix.config('conf1') + newconf2 = mix.config('conf2') + assert mix.option('od1.i2').value.get() == newconf1.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 1 + assert mix.option('od1.i2').owner.get() is newconf1.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.default + # + mix.option('od1.i2').value.set(3) + assert mix.option('od1.i2').value.get() == newconf1.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 3 + assert mix.option('od1.i2').owner.get() is newconf1.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.mix1 + # + newconf1.option('od1.i2').value.set(2) + assert mix.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 3 + assert newconf1.option('od1.i2').value.get() == 2 + assert mix.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.mix1 + assert newconf1.option('od1.i2').owner.get() is owners.user + # + mix.option('od1.i2').value.set(4) + assert mix.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 4 + assert newconf1.option('od1.i2').value.get() == 2 + assert mix.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.mix1 + assert newconf1.option('od1.i2').owner.get() is owners.user + # + mix.option('od1.i2').value.reset() + assert mix.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 1 + assert newconf1.option('od1.i2').value.get() == 2 + assert mix.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.default + assert newconf1.option('od1.i2').owner.get() is owners.user + # + newconf1.option('od1.i2').value.reset() + assert mix.option('od1.i2').value.get() == newconf1.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 1 + assert mix.option('od1.i2').owner.get() is newconf1.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.default + + +def test_contexts(): + mix = make_mixconfig() + errors = mix.value.set('od1.i2', 6, only_config=True) + newconf1 = mix.config('conf1') + assert mix.option('od1.i2').value.get() == 1 + assert mix.option('od1.i2').owner.get() == owners.default + assert newconf1.option('od1.i2').value.get() == newconf1.option('od1.i2').value.get() == 6 + assert newconf1.option('od1.i2').owner.get() == newconf1.option('od1.i2').owner.get() is owners.user + assert len(errors) == 0 # # # @@ -222,1035 +223,998 @@ def make_mixconfig(double=False): # assert 1 == ret[0].value.get() # ret = mix.option.find('i2', first=True) # assert 1 == ret.value.get() -# assert mix.value.dict() == {'od1.i4': 2, 'od1.i1': None, 'od1.i3': None, +# assert parse_od_get(mix.value.get()) == {'od1.i4': 2, 'od1.i1': None, 'od1.i3': None, # 'od1.i2': 1, 'od1.i5': [2]} -# -# -#def test_mix_mix(): -# mix = make_mixconfig(double=True) -# newmix = mix.config('mix') -# newconf1 = mix.config('mix.conf1') -# newconf2 = mix.config('mix.conf2') -# assert mix.option('od1.i2').value.get() == newmix.option('od1.i2').value.get() == newconf1.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 1 -# assert mix.option('od1.i2').owner.get() is newmix.option('od1.i2').owner.get() is newconf1.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.default -# # -# mix.option('od1.i2').value.set(3) -# assert mix.option('od1.i2').value.get() == newmix.option('od1.i2').value.get() == newconf1.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 3 -# assert mix.option('od1.i2').owner.get() is newmix.option('od1.i2').owner.get() is newconf1.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.mix1 -# # -# newconf1.option('od1.i2').value.set(2) -# assert mix.option('od1.i2').value.get() == newmix.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 3 -# assert newconf1.option('od1.i2').value.get() == 2 -# assert mix.option('od1.i2').owner.get() is newmix.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.mix1 -# assert newconf1.option('od1.i2').owner.get() is owners.user -# # -# newmix.option('od1.i2').value.set(4) -# assert mix.option('od1.i2').value.get() == 3 -# assert newmix.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 4 -# assert newconf1.option('od1.i2').value.get() == 2 -# assert mix.option('od1.i2').owner.get() is owners.mix1 -# assert newmix.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.mix2 -# assert newconf1.option('od1.i2').owner.get() is owners.user -# # -# newmix.option('od1.i2').value.reset() -# assert mix.option('od1.i2').value.get() == newmix.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 3 -# assert newconf1.option('od1.i2').value.get() == 2 -# assert mix.option('od1.i2').owner.get() is newmix.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.mix1 -# assert newconf1.option('od1.i2').owner.get() is owners.user -# # -# mix.option('od1.i2').value.reset() -# assert mix.option('od1.i2').value.get() == newmix.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 1 -# assert newconf1.option('od1.i2').value.get() == 2 -# assert mix.option('od1.i2').owner.get() is newmix.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.default -# assert newconf1.option('od1.i2').owner.get() is owners.user -# # -# newconf1.option('od1.i2').value.reset() -# assert mix.option('od1.i2').value.get() == newmix.option('od1.i2').value.get() == newconf1.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 1 -# assert mix.option('od1.i2').owner.get() is newmix.option('od1.i2').owner.get() is newconf1.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.default -# -# -#def test_mix_mix_set(): -# mix = make_mixconfig(double=True) -# errors1 = mix.value.set('od1.i1', 7, only_config=True) -# errors2 = mix.value.set('od1.i6', 7, only_config=True) -# assert len(errors1) == 0 -# assert len(errors2) == 2 -# ret = mix.config('mix.conf1') -# conf1 = ret._config_bag.context -# ret = mix.config('mix.conf2') -# conf2 = ret._config_bag.context -# newconf1 = mix.config('mix.conf1') -# newconf2 = mix.config('mix.conf2') -# assert newconf1.option('od1.i1').value.get() == newconf2.option('od1.i1').value.get() == 7 -# # -# dconfigs = [] -# ret = mix.config.find('i1', value=7) -# for conf in ret.config.list(): -# dconfigs.append(conf._config_bag.context) -# assert [conf1, conf2] == dconfigs -# newconf1.option('od1.i1').value.set(8) -# # -# dconfigs = [] -# ret = mix.config.find('i1') -# for conf in ret.config.list(): -# dconfigs.append(conf._config_bag.context) -# assert [conf1, conf2] == dconfigs -# ret = mix.config.find('i1', value=7) -# assert conf2 == list(ret.config.list())[0]._config_bag.context -# ret = mix.config.find('i1', value=8) -# assert conf1 == list(ret.config.list())[0]._config_bag.context -# # -# dconfigs = [] -# ret = mix.config.find('i5', value=2) -# for conf in ret.config.list(): -# dconfigs.append(conf._config_bag.context) -# assert [conf1, conf2] == dconfigs -# # -# with pytest.raises(AttributeError): -# mix.config.find('i1', value=10) -# with pytest.raises(AttributeError): -# mix.config.find('not', value=10) -# with pytest.raises(AttributeError): -# mix.config.find('i6') -# with pytest.raises(ValueError): -# mix.value.set('od1.i6', 7, only_config=True, force_default=True) -# with pytest.raises(ValueError): -# mix.value.set('od1.i6', 7, only_config=True, force_default_if_same=True) -# with pytest.raises(ValueError): -# mix.value.set('od1.i6', 7, only_config=True, force_dont_change_value=True) -# -# -#def test_mix_unconsistent(): -# i1 = IntOption('i1', '') -# i2 = IntOption('i2', '', default=1) -# i3 = IntOption('i3', '') -# i4 = IntOption('i4', '', default=2) -# od1 = OptionDescription('od1', '', [i1, i2, i3, i4]) -# od2 = OptionDescription('od2', '', [od1]) -# od3 = OptionDescription('od3', '', [od1]) -# conf1 = Config(od2, name='conf1') -# conf2 = Config(od2, name='conf2') -# conf3 = Config(od2, name='conf3') -# i5 = IntOption('i5', '') -# od4 = OptionDescription('od4', '', [i5]) -# conf4 = Config(od4, name='conf4') -# mix = MixConfig(od2, [conf1, conf2]) -# mix.owner.set(owners.mix1) -# with pytest.raises(TypeError): -# MixConfig(od2, "string", name='error') -# # same descr but conf1 already in mix -# assert len(list(conf1.config.parents())) == 1 -# assert len(list(conf3.config.parents())) == 0 -# new_mix = MixConfig(od2, [conf1, conf3]) -# assert len(list(conf1.config.parents())) == 2 -# assert len(list(conf3.config.parents())) == 1 -# # not same descr -# tmix = MixConfig(od2, [conf3, conf4]) -# -# -#def test_mix_leadership(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# mix = MixConfig(od, [conf1, conf2]) -# mix.property.read_only() -# ret = mix.config.find('ip_admin_eth0') -# configs = ret.config.list() -# assert len(configs) == 2 -# assert conf1._config_bag.context == configs[0]._config_bag.context -# assert conf2._config_bag.context == configs[1]._config_bag.context -# ret = mix.config.find('netmask_admin_eth0') -# configs = ret.config.list() -# assert len(configs) == 2 -# assert conf1._config_bag.context == configs[0]._config_bag.context -# assert conf2._config_bag.context == configs[1]._config_bag.context -# mix.property.read_write() -# with pytest.raises(AttributeError): -# mix.config.find('netmask_admin_eth0') -# ret = mix.unrestraint.config.find('netmask_admin_eth0') -# configs = ret.config.list() -# assert len(configs) == 2 -# assert conf1._config_bag.context == configs[0]._config_bag.context -# assert conf2._config_bag.context == configs[1]._config_bag.context -# mix.property.read_only() -# ret = mix.config.find('netmask_admin_eth0') -# configs = ret.config.list() -# assert len(configs) == 2 -# assert conf1._config_bag.context == configs[0]._config_bag.context -# assert conf2._config_bag.context == configs[1]._config_bag.context -# -# -#def test_mix_leadership_value2(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# mix = MixConfig(od, [conf1, conf2], name="mix") -# newconf1 = mix.config('conf1') -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.8']) -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None -# #FIXME devrait raise ! assert newconf1.option('ip_admin_eth0.ip_admin_eth0', 0).value.get() == None -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.reset() -# # -# mix.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None -# mix.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.0' -# mix.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.0.0') -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' -# -# -#def test_mix_leadership_value_default(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# mix = MixConfig(od, [conf1, conf2]) -# newconf1 = mix.config('conf1') -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None -# # -# mix.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None -# # -# mix.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.0' -# # -# mix.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.0.0') -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' -# -# -#def test_mix_leadership_owners(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# mix = MixConfig(od, [conf1, conf2]) -# mix.owner.set(owners.mix1) -# newconf1 = mix.config('conf1') -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() -# with pytest.raises(LeadershipError): -# newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.user -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.reset() -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() -# # -# mix.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.mix1 -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() -# # -# mix.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.mix1 -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == owners.mix1 -# # -# mix.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.0.0') -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.mix1 -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == owners.mix1 -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.user -# assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == owners.mix1 -# -# -#def test_mix_force_default(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# mix = MixConfig(od, [conf1, conf2]) -# mix.property.read_write() -# mix.owner.set('mix1') -# assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# newconf1 = mix.config('conf1') -# newconf2 = mix.config('conf2') -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# # -# errors = mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.1']) -# assert len(errors) == 0 -# assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.2']) -# assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.2'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# # -# errors = mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.3']) -# assert len(errors) == 0 -# assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.2'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] -# # -# errors = mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_default=True) -# assert len(errors) == 0 -# assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# -# -#def test_mix_force_dont_change_value(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# mix = MixConfig(od, [conf1, conf2]) -# mix.property.read_write() -# mix.owner.set('mix1') -# assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# newconf1 = mix.config('conf1') -# newconf2 = mix.config('conf2') -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.4']) -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() -# errors = mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_dont_change_value=True) -# assert len(errors) == 0 -# assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# -# -#def test_mix_force_default_if_same(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# mix = MixConfig(od, [conf1, conf2]) -# mix.property.read_write() -# mix.owner.set('mix1') -# # -# assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# newconf1 = mix.config('conf1') -# newconf2 = mix.config('conf2') -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.4']) -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() -# errors = mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_default_if_same=True) -# assert len(errors) == 0 -# assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.mix1 -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.mix1 -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.3']) -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.mix1 -# errors = mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.5'], force_default_if_same=True) -# assert len(errors) == 0 -# assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.5'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.5'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.mix1 -# -# -#def test_mix_force_default_if_same_and_dont_change(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# mix = MixConfig(od, [conf1, conf2]) -# mix.property.read_write() -# mix.owner.set('mix1') -# # -# assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# newconf1 = mix.config('conf1') -# newconf2 = mix.config('conf2') -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.4']) -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() -# errors = mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_default_if_same=True, force_dont_change_value=True) -# assert len(errors) == 0 -# assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.mix1 -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# # -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.3']) -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# errors = mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.5'], force_default_if_same=True, force_dont_change_value=True) -# assert len(errors) == 0 -# assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.5'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user -# -# -# -#def test_mix_force_default_and_dont_change(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='rconf1') -# conf2 = Config(od, name='rconf2') -# mix = MixConfig(od, [conf1, conf2]) -# mix.property.read_write() -# mix.owner.set('mix1') -# with pytest.raises(ValueError): -# mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_default=True, force_dont_change_value=True) -# -# -#def test_mix_properties_mix(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, validators=[Calculation(valid_network_netmask, Params((ParamOption(ip_admin_eth0), ParamSelfOption())))]) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0], properties=('disabled',)) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# conf1.property.read_write() -# conf2.property.read_write() -# mix = MixConfig(od, [conf1, conf2]) -# mix.property.read_write() -# newconf1 = mix.config('conf1') -# assert newconf1.value.dict() == {} -# -# -#def test_mix_exception_mix(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", Calculation(raise_exception), multi=True, validators=[Calculation(valid_network_netmask, Params((ParamOption(ip_admin_eth0), ParamSelfOption())))]) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od = OptionDescription('root', '', [interface1]) -# conf1 = Config(od, name='conf1') -# conf2 = Config(od, name='conf2') -# mix = MixConfig(od, [conf1, conf2]) -# mix.property.read_write() -# with pytest.raises(ConfigError): -# conf1.value.dict() -# -# -# -#def test_mix_callback(): -# val1 = StrOption('val1', "", 'val') -# val2 = StrOption('val2', "", Calculation(return_value, Params(ParamOption(val1)))) -# val3 = StrOption('val3', "", Calculation(return_value, Params(ParamValue('yes')))) -# val4 = StrOption('val4', "", Calculation(return_value, Params(kwargs={'value': ParamOption(val1)}))) -# val5 = StrOption('val5', "", Calculation(return_value, Params(kwargs={'value': ParamValue('yes')}))) -# maconfig = OptionDescription('rootconfig', '', [val1, val2, val3, val4, val5]) -# cfg = Config(maconfig, name='cfg') -# mix = MixConfig(maconfig, [cfg]) -# mix.property.read_write() -# newcfg = mix.config('cfg') -# assert newcfg.value.dict() == {'val3': 'yes', 'val2': 'val', 'val1': 'val', 'val5': 'yes', 'val4': 'val'} -# newcfg.option('val1').value.set('new') -# assert newcfg.value.dict() == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new'} -# newcfg.option('val1').value.reset() -# mix.option('val1').value.set('new') -# assert newcfg.value.dict() == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new'} -# newcfg.option('val4').value.set('new1') -# assert newcfg.value.dict() == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new1'} -# newcfg.option('val4').value.reset() -# mix.option('val4').value.set('new1') -# assert newcfg.value.dict() == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new1'} -# mix.option('val4').value.reset() -# -# -#def test_mix_callback_follower(): -# val = StrOption('val', "", default='val') -# val1 = StrOption('val1', "", [Calculation(return_value, Params(ParamOption(val)))], multi=True) -# val3 = StrOption('val2', "", Calculation(return_value, Params(ParamOption(val1))), multi=True) -# val4 = StrOption('val3', "", Calculation(return_value, Params(ParamOption(val1))), multi=True) -# interface1 = Leadership('val1', '', [val1, val3, val4]) -# od = OptionDescription('root', '', [interface1]) -# maconfig = OptionDescription('rootconfig', '', [val, interface1]) -# cfg = Config(maconfig, name='cfg1') -# mix = MixConfig(maconfig, [cfg]) -# mix.property.read_write() -# newcfg1 = mix.config('cfg1') -# assert newcfg1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val', 'val1.val3': 'val'}]} -# # -# newcfg1.option('val').value.set('val1') -# assert newcfg1.value.dict() == {'val': 'val1', 'val1.val1': [{'val1.val1': 'val1', 'val1.val2': 'val1', 'val1.val3': 'val1'}]} -# # -# newcfg1.option('val').value.reset() -# mix.option('val').value.set('val1') -# assert newcfg1.value.dict() == {'val': 'val1', 'val1.val1': [{'val1.val1': 'val1', 'val1.val2': 'val1', 'val1.val3': 'val1'}]} -# # -# mix.option('val').value.reset() -# newcfg1.option('val1.val2', 0).value.set('val2') -# assert newcfg1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val2', 'val1.val3': 'val'}]} -# # -# newcfg1.option('val1.val2', 0).value.reset() -# assert newcfg1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val', 'val1.val3': 'val'}]} -# # -# mix.option('val1.val2', 0).value.set('val2') -# assert newcfg1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val2', 'val1.val3': 'val'}]} -# # -# mix.option('val1.val1').value.set(['val']) -# assert newcfg1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val2', 'val1.val3': 'val'}]} -# # -# newcfg1.option('val1.val3', 0).value.set('val6') -# assert newcfg1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val2', 'val1.val3': 'val6'}]} -# # -# mix.option('val1.val2', 0).value.reset() -# newcfg1.option('val1.val3', 0).value.reset() -# newcfg1.option('val1.val1').value.set(['val3']) -# assert newcfg1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val3', 'val1.val2': 'val3', 'val1.val3': 'val3'}]} -# # -# newcfg1.option('val1.val1').value.reset() -# assert newcfg1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val', 'val1.val3': 'val'}]} -# # -# mix.option('val1.val1').value.set(['val3']) -# assert newcfg1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val3', 'val1.val2': 'val3', 'val1.val3': 'val3'}]} -# # -# newcfg1.option('val1.val2', 0).value.set('val2') -# assert newcfg1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val3', 'val1.val2': 'val2', 'val1.val3': 'val3'}]} -# # -# mix.option('val1.val1').value.set(['val3', 'rah']) -# assert newcfg1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val3', 'val1.val2': 'val2', 'val1.val3': 'val3'}, {'val1.val1': 'rah', 'val1.val2': 'rah', 'val1.val3': 'rah'}]} -# # -# mix.option('val1.val1').value.pop(1) -# mix.option('val1.val1').value.set(['val4']) -# assert newcfg1.value.dict() == {'val': 'val', 'val1.val1': [{'val1.val1': 'val4', 'val1.val2': 'val2', 'val1.val3': 'val4'}]} -# -# -#def test_meta_reset(): -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od0 = OptionDescription('root', '', [interface1]) -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od1 = OptionDescription('root', '', [interface1]) -# ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) -# netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) -# interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# od2 = OptionDescription('root', '', [interface1]) -# conf1 = Config(od0, name='conf1') -# conf2 = Config(od1, name='conf2') -# mix = MixConfig(od2, [conf1, conf2]) -# mix.property.read_write() -# mix.owner.set('mix1') -# assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# newconf1 = mix.config('conf1') -# newconf2 = mix.config('conf2') -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# errors = mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.1']) -# assert len(errors) == 0 -# assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.2']) -# assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.2'] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] -# mix.value.reset('ip_admin_eth0.ip_admin_eth0') -# assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] -# -# -#def test_mix_properties_mix_copy(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, properties=('disabled',)) -# interface0 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, properties=('disabled',)) -# interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, properties=('disabled',)) -# interface2 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# conf1 = Config(interface0, name='conf1') -# conf2 = Config(interface1, name='conf2') -# conf1.property.read_write() -# conf2.property.read_write() -# mix = MixConfig(interface2, [conf1, conf2], name='mix1') -# mix.property.read_write() -# -# newconf1 = mix.config('conf1') -# conf3 = newconf1.config.copy(name='conf3') -# newconf3 = mix.config('conf3') -# mix2 = list(conf3.config.parents()) -# assert len(mix2) == 1 -# assert mix.config.name() == mix2[0].config.name() -# -# newconf2 = mix.config('conf2') -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# assert conf2.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# assert newconf3.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# mix.option('ip_admin_eth0').value.set(['192.168.1.2']) -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.2']} -# assert conf2.value.dict() == {'ip_admin_eth0': ['192.168.1.2']} -# assert newconf3.value.dict() == {'ip_admin_eth0': ['192.168.1.2']} -# ret = mix.value.set('ip_admin_eth0', ['192.168.1.3'], force_default_if_same=True) -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.3']} -# assert conf2.value.dict() == {'ip_admin_eth0': ['192.168.1.3']} -# assert newconf3.value.dict() == {'ip_admin_eth0': ['192.168.1.3']} -# -# -#def test_mix_properties_mix_deepcopy(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, -# properties=('disabled',)) -# interface0 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, -# properties=('disabled',)) -# interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, -# properties=('disabled',)) -# interface2 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# conf1 = Config(interface0, name='conf1') -# conf2 = Config(interface1, name='conf2') -# conf1.property.read_write() -# conf2.property.read_write() -# mix = MixConfig(interface2, [conf1, conf2]) -# mix.permissive.add('hidden') -# mix.property.read_write() -# -# newconf1 = mix.config('conf1') -# newconf2 = mix.config('conf2') -# mix2 = newconf1.config.deepcopy(name='conf3') -# newconf3 = mix2.config('conf3') -# assert mix != mix2 -# assert mix.permissive.get() == mix2.permissive.get() -# -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# assert newconf2.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# assert newconf3.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# mix.option('ip_admin_eth0').value.set(['192.168.1.2']) -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.2']} -# assert newconf2.value.dict() == {'ip_admin_eth0': ['192.168.1.2']} -# assert newconf3.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# mix.value.set('ip_admin_eth0', ['192.168.1.3'], force_default_if_same=True) -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.3']} -# assert newconf2.value.dict() == {'ip_admin_eth0': ['192.168.1.3']} -# assert newconf3.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# -# -#def test_mix_properties_submix_deepcopy(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, -# properties=('disabled',)) -# interface0 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, -# properties=('disabled',)) -# interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, -# properties=('disabled',)) -# interface2 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# conf1 = Config(interface0, name='conf1') -# conf1.property.read_write() -# mix1 = MixConfig(interface1, [conf1], name='mix1') -# mix2 = MixConfig(interface2, [mix1], name='mix2') -# mix_copy = conf1.config.deepcopy(name='conf2', -# metaconfig_prefix='copy_') -# assert mix_copy.config.name() == 'copy_mix2' -# ret1 = mix_copy.config('copy_mix1') -# assert ret1.config.name() == 'copy_mix1' -# ret2 = mix_copy.config('copy_mix1.conf2') -# assert ret2.config.name() == 'conf2' -# -# -#def test_mix_properties_submix_deepcopy_owner(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip") -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth1', "mask") -# interface0 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# ip_admin_eth0 = NetworkOption('ip_admin_eth1', "ip") -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask") -# interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip") -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask") -# interface2 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# conf1 = Config(interface0, name='conf1') -# conf1.owner.set('conf1_user') -# conf1.property.read_write() -# mix1 = MixConfig(interface1, [conf1], name='mix1') -# mix1.owner.set('mix1_user') -# mix2 = MixConfig(interface2, [mix1], name='mix2') -# mix2.owner.set('mix2_user') -# # -# conf1.option('ip_admin_eth0').value.set('192.168.0.1') -# assert conf1.option('ip_admin_eth0').owner.get() == 'conf1_user' -# mix2.option('ip_admin_eth0').value.set('192.168.0.3') -# assert mix2.option('ip_admin_eth0').owner.get() == 'mix2_user' -# # -# mix2_copy = conf1.config.deepcopy(name='conf2', -# metaconfig_prefix='copy_') -# mix2_copy.option('netmask_admin_eth0').value.set('255.255.255.255') -# assert mix2_copy.option('ip_admin_eth0').value.get() == '192.168.0.3' -# assert mix2_copy.option('ip_admin_eth0').owner.get() == 'mix2_user' -# assert mix2_copy.option('netmask_admin_eth0').owner.get() == 'mix2_user' -# # -# mix1_copy = mix2_copy.config('copy_mix1') -# mix1_copy.option('netmask_admin_eth0').value.set('255.255.255.255') -# # -# conf2 = mix1_copy.config('conf2') -# conf2.owner.set('conf2_user') -# conf2.option('netmask_admin_eth1').value.set('255.255.255.255') -# assert conf2.option('netmask_admin_eth1').owner.get() == 'conf2_user' -# assert conf2.option('ip_admin_eth0').value.get() == '192.168.0.1' -# assert conf2.option('ip_admin_eth0').owner.get() == 'conf1_user' -# -# -#def test_mix_properties_mix_set_value(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth1', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, properties=('disabled',)) -# interface0 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth1', "mask", multi=True, properties=('disabled',)) -# interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, properties=('disabled',)) -# interface2 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) -# conf1 = Config(interface0, name='conf1') -# conf2 = Config(interface1, name='conf2') -# conf1.property.read_write() -# conf2.property.read_write() -# mix = MixConfig(interface2, [conf1, conf2]) -# mix.property.read_write() -# newconf2 = mix.config('conf2') -# assert newconf2.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# ret = mix.value.set('netmask_admin_eth0', ['255.255.255.255'], only_config=True) -# assert len(ret) == 2 -# assert isinstance(ret[0], PropertiesOptionError) -# assert isinstance(ret[1], AttributeError) -# del ret[1] -# del ret[0] -# del ret -# ret = mix.value.set('netmask_admin_eth0', ['255.255.255.255'], force_default=True) -# assert len(ret) == 2 -# assert isinstance(ret[0], AttributeError) -# assert isinstance(ret[1], PropertiesOptionError) -# del ret[1] -# del ret[0] -# del ret -# ret = mix.value.set('netmask_admin_eth0', ['255.255.255.255'], force_dont_change_value=True) -# assert len(ret) == 3 -# assert isinstance(ret[0], PropertiesOptionError) -# assert isinstance(ret[1], AttributeError) -# assert isinstance(ret[2], PropertiesOptionError) -# del ret[2] -# del ret[1] -# del ret[0] -# del ret -# ret = mix.value.set('netmask_admin_eth0', ['255.255.255.255'], force_default_if_same=True) -# assert len(ret) == 2 -# assert isinstance(ret[0], AttributeError) -# assert isinstance(ret[1], PropertiesOptionError) -# del ret[1] -# del ret[0] -# del ret -# ret = mix.value.set('ip_admin_eth0', '255.255.255.255', only_config=True) -# assert len(ret) == 2 -# assert isinstance(ret[0], AttributeError) -# assert isinstance(ret[1], ValueError) -# del ret[1] -# del ret[0] -# del ret -# ret = mix.value.set('ip_admin_eth0', '255.255.255.255', force_default=True) -# assert len(ret) == 2 -# assert isinstance(ret[0], AttributeError) -# assert isinstance(ret[1], ValueError) -# del ret[1] -# del ret[0] -# del ret -# ret = mix.value.set('ip_admin_eth0', '255.255.255.255', force_dont_change_value=True) -# assert len(ret) == 2 -# assert isinstance(ret[0], AttributeError) -# assert isinstance(ret[1], ValueError) -# del ret[1] -# del ret[0] -# del ret -# ret = mix.value.set('ip_admin_eth0', '255.255.255.255', force_default_if_same=True) -# assert len(ret) == 2 -# assert isinstance(ret[0], AttributeError) -# assert isinstance(ret[1], ValueError) -# del ret[1] -# del ret[0] -# del ret -# -# -#def test_mix_different_default(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# interface0 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0]) -# ip_admin_eth0 = NetworkOption('ip_admin_eth1', "ip", multi=True, default=['192.168.1.2']) -# interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0]) -# ip_admin_eth0 = NetworkOption('ip_admin_eth1', "ip", multi=True, default=['192.168.1.3']) -# interface2 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0]) -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.4']) -# ip_admin_eth1 = NetworkOption('ip_admin_eth1', "ip", multi=True, default=['192.168.1.5']) -# interface3 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, ip_admin_eth1]) -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.6']) -# interface4 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0]) -# conf1 = Config(interface0, name='conf1') -# conf1.property.read_write() -# conf2 = Config(interface1, name='conf2') -# conf2.property.read_write() -# mix = MixConfig(interface2, [conf1, conf2], name='submix1') -# mix = MixConfig(interface3, [mix], name='submix2') -# mix = MixConfig(interface4, [mix]) -# mix.property.read_write() -# # -# assert mix.value.dict() == {'ip_admin_eth0': ['192.168.1.6']} -# newsubmix2 = mix.config('submix2') -# newsubmix1 = mix.config('submix2.submix1') -# newconf1 = mix.config('submix2.submix1.conf1') -# newconf2 = mix.config('submix2.submix1.conf2') -# assert newsubmix2.value.dict() == {'ip_admin_eth0': ['192.168.1.4'], 'ip_admin_eth1': ['192.168.1.5']} -# assert newsubmix1.value.dict() == {'ip_admin_eth1': ['192.168.1.3']} -# assert newconf2.value.dict() == {'ip_admin_eth1': ['192.168.1.2']} -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# # -# mix.option('ip_admin_eth0').value.set(['192.168.1.7']) -# assert mix.value.dict() == {'ip_admin_eth0': ['192.168.1.7']} -# assert newsubmix2.value.dict() == {'ip_admin_eth0': ['192.168.1.7'], 'ip_admin_eth1': ['192.168.1.5']} -# assert newsubmix1.value.dict() == {'ip_admin_eth1': ['192.168.1.3']} -# assert newconf2.value.dict() == {'ip_admin_eth1': ['192.168.1.2']} -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.7']} -# # -# newsubmix2.option('ip_admin_eth0').value.set(['192.168.1.8']) -# assert mix.value.dict() == {'ip_admin_eth0': ['192.168.1.7']} -# assert newsubmix2.value.dict() == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.5']} -# assert newsubmix1.value.dict() == {'ip_admin_eth1': ['192.168.1.3']} -# assert newconf2.value.dict() == {'ip_admin_eth1': ['192.168.1.2']} -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.8']} -# # -# with pytest.raises(AttributeError): -# newsubmix1.option('ip_admin_eth0').value.set(['192.168.1.9']) -# assert mix.value.dict() == {'ip_admin_eth0': ['192.168.1.7']} -# assert newsubmix2.value.dict() == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.5']} -# assert newsubmix1.value.dict() == {'ip_admin_eth1': ['192.168.1.3']} -# assert newconf2.value.dict() == {'ip_admin_eth1': ['192.168.1.2']} -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.8']} -# # -# with pytest.raises(AttributeError): -# newconf2.option('ip_admin_eth0').value.set(['192.168.1.9']) -# assert mix.value.dict() == {'ip_admin_eth0': ['192.168.1.7']} -# assert newsubmix2.value.dict() == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.5']} -# assert newsubmix1.value.dict() == {'ip_admin_eth1': ['192.168.1.3']} -# assert newconf2.value.dict() == {'ip_admin_eth1': ['192.168.1.2']} -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.8']} -# # -# newconf1.option('ip_admin_eth0').value.set(['192.168.1.9']) -# assert mix.value.dict() == {'ip_admin_eth0': ['192.168.1.7']} -# assert newsubmix2.value.dict() == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.5']} -# assert newsubmix1.value.dict() == {'ip_admin_eth1': ['192.168.1.3']} -# assert newconf2.value.dict() == {'ip_admin_eth1': ['192.168.1.2']} -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.9']} -# # -# with pytest.raises(AttributeError): -# mix.option('ip_admin_eth1').value.set(['192.168.1.10']) -# assert mix.value.dict() == {'ip_admin_eth0': ['192.168.1.7']} -# assert newsubmix2.value.dict() == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.5']} -# assert newsubmix1.value.dict() == {'ip_admin_eth1': ['192.168.1.3']} -# assert newconf2.value.dict() == {'ip_admin_eth1': ['192.168.1.2']} -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.9']} -# # -# newsubmix2.option('ip_admin_eth1').value.set(['192.168.1.10']) -# assert mix.value.dict() == {'ip_admin_eth0': ['192.168.1.7']} -# assert newsubmix2.value.dict() == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.10']} -# assert newsubmix1.value.dict() == {'ip_admin_eth1': ['192.168.1.10']} -# assert newconf2.value.dict() == {'ip_admin_eth1': ['192.168.1.10']} -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.9']} -# # -# newsubmix1.option('ip_admin_eth1').value.set(['192.168.1.11']) -# assert mix.value.dict() == {'ip_admin_eth0': ['192.168.1.7']} -# assert newsubmix2.value.dict() == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.10']} -# assert newsubmix1.value.dict() == {'ip_admin_eth1': ['192.168.1.11']} -# assert newconf2.value.dict() == {'ip_admin_eth1': ['192.168.1.11']} -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.9']} -# # -# newconf2.option('ip_admin_eth1').value.set(['192.168.1.12']) -# assert mix.value.dict() == {'ip_admin_eth0': ['192.168.1.7']} -# assert newsubmix2.value.dict() == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.10']} -# assert newsubmix1.value.dict() == {'ip_admin_eth1': ['192.168.1.11']} -# assert newconf2.value.dict() == {'ip_admin_eth1': ['192.168.1.12']} -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.9']} -# # -# with pytest.raises(AttributeError): -# newconf1.option('ip_admin_eth1').value.set(['192.168.1.13']) -# assert mix.value.dict() == {'ip_admin_eth0': ['192.168.1.7']} -# assert newsubmix2.value.dict() == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.10']} -# assert newsubmix1.value.dict() == {'ip_admin_eth1': ['192.168.1.11']} -# assert newconf2.value.dict() == {'ip_admin_eth1': ['192.168.1.12']} -# assert newconf1.value.dict() == {'ip_admin_eth0': ['192.168.1.9']} -# -# -#def test_mix_different_default_reset(): -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) -# interface0 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0]) -# ip_admin_eth0 = NetworkOption('ip_admin_eth1', "ip", multi=True, default=['192.168.1.2']) -# interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0]) -# ip_admin_eth0 = NetworkOption('ip_admin_eth1', "ip", multi=True, default=['192.168.1.3']) -# interface2 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0]) -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.4']) -# ip_admin_eth1 = NetworkOption('ip_admin_eth1', "ip", multi=True, default=['192.168.1.5']) -# interface3 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, ip_admin_eth1]) -# ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.6']) -# interface4 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0]) -# conf1 = Config(interface0, name='conf1') -# conf1.property.read_write() -# conf2 = Config(interface1, name='conf2') -# conf2.property.read_write() -# mix = MixConfig(interface2, [conf1, conf2], name='submix1') -# mix = MixConfig(interface3, [mix], name='submix2') -# mix = MixConfig(interface4, [mix]) -# mix.property.read_write() -# # -# mix.option('ip_admin_eth0').value.set(['192.168.1.7']) -# submix2 = mix.config('submix2') -# submix1 = mix.config('submix2.submix1') -# conf1 = mix.config('submix2.submix1.conf1') -# conf2 = mix.config('submix2.submix1.conf2') -# submix2.option('ip_admin_eth0').value.set(['192.168.1.8']) -# submix2.option('ip_admin_eth1').value.set(['192.168.1.10']) -# submix1.option('ip_admin_eth1').value.set(['192.168.1.11']) -# conf2.option('ip_admin_eth1').value.set(['192.168.1.12']) -# conf1.option('ip_admin_eth0').value.set(['192.168.1.9']) -# assert mix.value.dict() == {'ip_admin_eth0': ['192.168.1.7']} -# assert submix2.value.dict() == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.10']} -# assert submix1.value.dict() == {'ip_admin_eth1': ['192.168.1.11']} -# assert conf2.value.dict() == {'ip_admin_eth1': ['192.168.1.12']} -# assert conf1.value.dict() == {'ip_admin_eth0': ['192.168.1.9']} -# # -# mix.value.reset('ip_admin_eth0') -# assert mix.value.dict() == {'ip_admin_eth0': ['192.168.1.6']} -# assert submix2.value.dict() == {'ip_admin_eth0': ['192.168.1.4'], 'ip_admin_eth1': ['192.168.1.10']} -# assert submix1.value.dict() == {'ip_admin_eth1': ['192.168.1.11']} -# assert conf2.value.dict() == {'ip_admin_eth1': ['192.168.1.12']} -# assert conf1.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# # -# mix.value.reset('ip_admin_eth1') -# assert mix.value.dict() == {'ip_admin_eth0': ['192.168.1.6']} -# assert submix2.value.dict() == {'ip_admin_eth0': ['192.168.1.4'], 'ip_admin_eth1': ['192.168.1.5']} -# assert submix1.value.dict() == {'ip_admin_eth1': ['192.168.1.3']} -# assert conf2.value.dict() == {'ip_admin_eth1': ['192.168.1.2']} -# assert conf1.value.dict() == {'ip_admin_eth0': ['192.168.1.1']} -# -# -#def test_mix_pop_config(): -# od = make_description() -# config1 = Config(od, name='config1') -# config2 = Config(od, name='config2') -# mix = MixConfig(od, [config1, config2]) -# mix.option('od1.i1').value.set(2) -# # -# assert len(list(mix.config.list())) == 2 -# newconfig1 = mix.config('config1') -# assert newconfig1.value.dict() == {'od1.i1': 2, 'od1.i2': 1, 'od1.i3': None, 'od1.i4': 2, 'od1.i5': [2], 'od1.i6': None} -# newconf1 = mix.config.remove('config1') -# try: -# mix.config('config1') -# except ConfigError: -# pass -# else: -# raise Exception('must raise') -# assert newconf1.value.dict() == {'od1.i1': None, 'od1.i2': 1, 'od1.i3': None, 'od1.i4': 2, 'od1.i5': [2], 'od1.i6': None} -# # -# assert len(list(mix.config.list())) == 1 -# with pytest.raises(ConfigError): -# mix.config.remove('newconf1') -# -# -#def test_mix_add_config(): -# od = make_description() -# config1 = Config(od, name='config1') -# config2 = Config(od, name='config2') -# mix = MixConfig(od, [config1, config2]) -# mix.option('od1.i1').value.set(2) -# # -# assert len(list(mix.config.list())) == 2 -# config = Config(od, name='new') -# assert config.value.dict() == {'od1.i1': None, 'od1.i2': 1, 'od1.i3': None, 'od1.i4': 2, 'od1.i5': [2], 'od1.i6': None} -# mix.config.add(config) -# # -# assert len(list(mix.config.list())) == 3 -# assert config.value.dict() == {'od1.i1': 2, 'od1.i2': 1, 'od1.i3': None, 'od1.i4': 2, 'od1.i5': [2], 'od1.i6': None} -# # -# with pytest.raises(ConflictError): -# mix.config.add(config) -# -# -#def test_mix_add_config_readd(): -# od = make_description() -# mix = MixConfig(od, []) -# mix2 = MixConfig(od, []) -# # -# config = Config(od, name='new') -# mix.config.add(config) -# mix2.config.add(config) -# assert len(list(config.config.parents())) == 2 -# -# -#def test_mix_new_config_readd(): -# od = make_description() -# mix = MixConfig(od, []) -# assert len(list(mix.config.list())) == 0 -# mix2 = mix.config.new('mix2') -# assert len(list(mix.config.list())) == 1 -# -# -#def test_meta_new_mixconfig(): -# od = make_description() -# cfg = Config(od, name='cfg1') -# meta = MetaConfig([cfg]) -# mix = meta.config.new('mixconfig', type="mixconfig") -# assert isinstance(mix, MixConfig) -# -# -#def test_meta_mixconfig_parents(): -# od = make_description() -# cfg = Config(od, name='cfg1') -# meta = MetaConfig([cfg]) -# mix = meta.config.new('mixconfig', type="mixconfig") -# parents = mix.config.parents() -# assert len(parents) == 1 -## assert parents[0].config.get() == meta + + +def test_mix_mix(): + mix = make_mixconfig(double=True) + newmix = mix.config('mix') + newconf1 = mix.config('mix.conf1') + newconf2 = mix.config('mix.conf2') + assert mix.option('od1.i2').value.get() == newmix.option('od1.i2').value.get() == newconf1.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 1 + assert mix.option('od1.i2').owner.get() is newmix.option('od1.i2').owner.get() is newconf1.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.default + # + mix.option('od1.i2').value.set(3) + assert mix.option('od1.i2').value.get() == newmix.option('od1.i2').value.get() == newconf1.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 3 + assert mix.option('od1.i2').owner.get() is newmix.option('od1.i2').owner.get() is newconf1.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.mix1 + # + newconf1.option('od1.i2').value.set(2) + assert mix.option('od1.i2').value.get() == newmix.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 3 + assert newconf1.option('od1.i2').value.get() == 2 + assert mix.option('od1.i2').owner.get() is newmix.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.mix1 + assert newconf1.option('od1.i2').owner.get() is owners.user + # + newmix.option('od1.i2').value.set(4) + assert mix.option('od1.i2').value.get() == 3 + assert newmix.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 4 + assert newconf1.option('od1.i2').value.get() == 2 + assert mix.option('od1.i2').owner.get() is owners.mix1 + assert newmix.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.mix2 + assert newconf1.option('od1.i2').owner.get() is owners.user + # + newmix.option('od1.i2').value.reset() + assert mix.option('od1.i2').value.get() == newmix.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 3 + assert newconf1.option('od1.i2').value.get() == 2 + assert mix.option('od1.i2').owner.get() is newmix.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.mix1 + assert newconf1.option('od1.i2').owner.get() is owners.user + # + mix.option('od1.i2').value.reset() + assert mix.option('od1.i2').value.get() == newmix.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 1 + assert newconf1.option('od1.i2').value.get() == 2 + assert mix.option('od1.i2').owner.get() is newmix.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.default + assert newconf1.option('od1.i2').owner.get() is owners.user + # + newconf1.option('od1.i2').value.reset() + assert mix.option('od1.i2').value.get() == newmix.option('od1.i2').value.get() == newconf1.option('od1.i2').value.get() == newconf2.option('od1.i2').value.get() == 1 + assert mix.option('od1.i2').owner.get() is newmix.option('od1.i2').owner.get() is newconf1.option('od1.i2').owner.get() is newconf2.option('od1.i2').owner.get() is owners.default + + +def test_mix_mix_set(): + mix = make_mixconfig(double=True) + errors1 = mix.value.set('od1.i1', 7, only_config=True) + errors2 = mix.value.set('od1.i6', 7, only_config=True) + assert len(errors1) == 0 + assert len(errors2) == 2 + ret = mix.config('mix.conf1') + conf1 = ret._config_bag.context + ret = mix.config('mix.conf2') + conf2 = ret._config_bag.context + newconf1 = mix.config('mix.conf1') + newconf2 = mix.config('mix.conf2') + assert newconf1.option('od1.i1').value.get() == newconf2.option('od1.i1').value.get() == 7 + # + newconf1.option('od1.i1').value.set(8) + assert newconf1.option('od1.i1').value.get() == 8 + assert newconf2.option('od1.i1').value.get() == 7 + # + with pytest.raises(ValueError): + mix.value.set('od1.i6', 7, only_config=True, force_default=True) + with pytest.raises(ValueError): + mix.value.set('od1.i6', 7, only_config=True, force_default_if_same=True) + with pytest.raises(ValueError): + mix.value.set('od1.i6', 7, only_config=True, force_dont_change_value=True) + + +def test_mix_unconsistent(): + i1 = IntOption('i1', '') + i2 = IntOption('i2', '', default=1) + i3 = IntOption('i3', '') + i4 = IntOption('i4', '', default=2) + od1 = OptionDescription('od1', '', [i1, i2, i3, i4]) + od2 = OptionDescription('od2', '', [od1]) + od3 = OptionDescription('od3', '', [od1]) + conf1 = Config(od2, name='conf1') + conf2 = Config(od2, name='conf2') + conf3 = Config(od2, name='conf3') + i5 = IntOption('i5', '') + od4 = OptionDescription('od4', '', [i5]) + conf4 = Config(od4, name='conf4') + mix = MixConfig(od2, [conf1, conf2]) + mix.owner.set(owners.mix1) + with pytest.raises(TypeError): + MixConfig(od2, "string", name='error') + # same descr but conf1 already in mix + assert len(list(conf1.config.parents())) == 1 + assert len(list(conf3.config.parents())) == 0 + new_mix = MixConfig(od2, [conf1, conf3]) + assert len(list(conf1.config.parents())) == 2 + assert len(list(conf3.config.parents())) == 1 + # not same descr + tmix = MixConfig(od2, [conf3, conf4]) + + +def test_mix_leadership(): + leader = StrOption('leader', "ip", multi=True) + follower = StrOption('follower', "mask", multi=True) + leadership = Leadership('leadership', '', [leader, follower]) + od = OptionDescription('root', '', [leadership]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + mix = MixConfig(od, [conf1, conf2]) + mix.property.read_write() + # + assert conf1.option('leadership.leader').value.get() == conf2.option('leadership.leader').value.get() == [] + # + mix.option('leadership.leader').value.set(["val1"]) + assert conf1.option('leadership.leader').value.get() == conf2.option('leadership.leader').value.get() == ['val1'] + assert conf1.option('leadership.follower', 0).value.get() == conf2.option('leadership.follower', 0).value.get() == None + # + mix.option('leadership.leader').value.set(["val1", "val2"]) + mix.option('leadership.follower', 0).value.set("val3") + assert conf1.option('leadership.leader').value.get() == conf2.option('leadership.leader').value.get() == ['val1', 'val2'] + assert conf1.option('leadership.follower', 0).value.get() == conf2.option('leadership.follower', 0).value.get() == "val3" + assert conf1.option('leadership.follower', 1).value.get() == conf2.option('leadership.follower', 1).value.get() == None + + +def test_mix_leadership_value2(): + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + mix = MixConfig(od, [conf1, conf2], name="mix") + newconf1 = mix.config('conf1') + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.8']) + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None + #FIXME devrait raise ! assert newconf1.option('ip_admin_eth0.ip_admin_eth0', 0).value.get() == None + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.reset() + # + mix.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None + mix.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.0' + mix.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.0.0') + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' + + +def test_mix_leadership_value_default(): + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + mix = MixConfig(od, [conf1, conf2]) + newconf1 = mix.config('conf1') + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None + # + mix.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None + # + mix.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.0' + # + mix.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.0.0') + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' + + +def test_mix_leadership_owners(): + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + mix = MixConfig(od, [conf1, conf2]) + mix.owner.set(owners.mix1) + newconf1 = mix.config('conf1') + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + with pytest.raises(LeadershipError): + newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.user + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.reset() + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + # + mix.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.mix1 + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() + # + mix.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.mix1 + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == owners.mix1 + # + mix.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.0.0') + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.mix1 + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == owners.mix1 + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owners.user + assert newconf1.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == owners.mix1 + + +def test_mix_force_default(): + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + mix = MixConfig(od, [conf1, conf2]) + mix.property.read_write() + mix.owner.set('mix1') + assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + newconf1 = mix.config('conf1') + newconf2 = mix.config('conf2') + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + # + errors = mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.1']) + assert len(errors) == 0 + assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.2']) + assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.2'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + # + errors = mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.3']) + assert len(errors) == 0 + assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.2'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] + # + errors = mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_default=True) + assert len(errors) == 0 + assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + + +def test_mix_force_dont_change_value(): + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + mix = MixConfig(od, [conf1, conf2]) + mix.property.read_write() + mix.owner.set('mix1') + assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + newconf1 = mix.config('conf1') + newconf2 = mix.config('conf2') + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.4']) + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + errors = mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_dont_change_value=True) + assert len(errors) == 0 + assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + + +def test_mix_force_default_if_same(): + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + mix = MixConfig(od, [conf1, conf2]) + mix.property.read_write() + mix.owner.set('mix1') + # + assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + newconf1 = mix.config('conf1') + newconf2 = mix.config('conf2') + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.4']) + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + errors = mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_default_if_same=True) + assert len(errors) == 0 + assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.mix1 + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.mix1 + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.3']) + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.mix1 + errors = mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.5'], force_default_if_same=True) + assert len(errors) == 0 + assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.5'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.5'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.mix1 + + +def test_mix_force_default_if_same_and_dont_change(): + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + mix = MixConfig(od, [conf1, conf2]) + mix.property.read_write() + mix.owner.set('mix1') + # + assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + newconf1 = mix.config('conf1') + newconf2 = mix.config('conf2') + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.4']) + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + errors = mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_default_if_same=True, force_dont_change_value=True) + assert len(errors) == 0 + assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.4'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.mix1 + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + # + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.3']) + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + errors = mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.5'], force_default_if_same=True, force_dont_change_value=True) + assert len(errors) == 0 + assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.5'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.3'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').owner.get() is owners.user + + + +def test_mix_force_default_and_dont_change(): + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='rconf1') + conf2 = Config(od, name='rconf2') + mix = MixConfig(od, [conf1, conf2]) + mix.property.read_write() + mix.owner.set('mix1') + with pytest.raises(ValueError): + mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.4'], force_default=True, force_dont_change_value=True) + + +def test_mix_properties_mix(): + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, validators=[Calculation(valid_network_netmask, Params((ParamOption(ip_admin_eth0), ParamSelfOption())))]) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0], properties=('disabled',)) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + conf1.property.read_write() + conf2.property.read_write() + mix = MixConfig(od, [conf1, conf2]) + mix.property.read_write() + newconf1 = mix.config('conf1') + assert parse_od_get(newconf1.value.get()) == {} + + +def test_mix_exception_mix(): + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", Calculation(raise_exception), multi=True, validators=[Calculation(valid_network_netmask, Params((ParamOption(ip_admin_eth0), ParamSelfOption())))]) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od = OptionDescription('root', '', [interface1]) + conf1 = Config(od, name='conf1') + conf2 = Config(od, name='conf2') + mix = MixConfig(od, [conf1, conf2]) + mix.property.read_write() + with pytest.raises(ConfigError): + parse_od_get(conf1.value.get()) + + + +def test_mix_callback(): + val1 = StrOption('val1', "", 'val') + val2 = StrOption('val2', "", Calculation(return_value, Params(ParamOption(val1)))) + val3 = StrOption('val3', "", Calculation(return_value, Params(ParamValue('yes')))) + val4 = StrOption('val4', "", Calculation(return_value, Params(kwargs={'value': ParamOption(val1)}))) + val5 = StrOption('val5', "", Calculation(return_value, Params(kwargs={'value': ParamValue('yes')}))) + maconfig = OptionDescription('rootconfig', '', [val1, val2, val3, val4, val5]) + cfg = Config(maconfig, name='cfg') + mix = MixConfig(maconfig, [cfg]) + mix.property.read_write() + newcfg = mix.config('cfg') + assert parse_od_get(newcfg.value.get()) == {'val3': 'yes', 'val2': 'val', 'val1': 'val', 'val5': 'yes', 'val4': 'val'} + newcfg.option('val1').value.set('new') + assert parse_od_get(newcfg.value.get()) == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new'} + newcfg.option('val1').value.reset() + mix.option('val1').value.set('new') + assert parse_od_get(newcfg.value.get()) == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new'} + newcfg.option('val4').value.set('new1') + assert parse_od_get(newcfg.value.get()) == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new1'} + newcfg.option('val4').value.reset() + mix.option('val4').value.set('new1') + assert parse_od_get(newcfg.value.get()) == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new1'} + mix.option('val4').value.reset() + + +def test_mix_callback_follower(): + val = StrOption('val', "", default='val') + val1 = StrOption('val1', "", [Calculation(return_value, Params(ParamOption(val)))], multi=True) + val3 = StrOption('val2', "", Calculation(return_value, Params(ParamOption(val1))), multi=True) + val4 = StrOption('val3', "", Calculation(return_value, Params(ParamOption(val1))), multi=True) + interface1 = Leadership('val1', '', [val1, val3, val4]) + od = OptionDescription('root', '', [interface1]) + maconfig = OptionDescription('rootconfig', '', [val, interface1]) + cfg = Config(maconfig, name='cfg1') + mix = MixConfig(maconfig, [cfg]) + mix.property.read_write() + newcfg1 = mix.config('cfg1') + assert parse_od_get(newcfg1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val', 'val1.val3': 'val'}]} + # + newcfg1.option('val').value.set('val1') + assert parse_od_get(newcfg1.value.get()) == {'val': 'val1', 'val1.val1': [{'val1.val1': 'val1', 'val1.val2': 'val1', 'val1.val3': 'val1'}]} + # + newcfg1.option('val').value.reset() + mix.option('val').value.set('val1') + assert parse_od_get(newcfg1.value.get()) == {'val': 'val1', 'val1.val1': [{'val1.val1': 'val1', 'val1.val2': 'val1', 'val1.val3': 'val1'}]} + # + mix.option('val').value.reset() + newcfg1.option('val1.val2', 0).value.set('val2') + assert parse_od_get(newcfg1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val2', 'val1.val3': 'val'}]} + # + newcfg1.option('val1.val2', 0).value.reset() + assert parse_od_get(newcfg1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val', 'val1.val3': 'val'}]} + # + mix.option('val1.val2', 0).value.set('val2') + assert parse_od_get(newcfg1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val2', 'val1.val3': 'val'}]} + # + mix.option('val1.val1').value.set(['val']) + assert parse_od_get(newcfg1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val2', 'val1.val3': 'val'}]} + # + newcfg1.option('val1.val3', 0).value.set('val6') + assert parse_od_get(newcfg1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val2', 'val1.val3': 'val6'}]} + # + mix.option('val1.val2', 0).value.reset() + newcfg1.option('val1.val3', 0).value.reset() + newcfg1.option('val1.val1').value.set(['val3']) + assert parse_od_get(newcfg1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val3', 'val1.val2': 'val3', 'val1.val3': 'val3'}]} + # + newcfg1.option('val1.val1').value.reset() + assert parse_od_get(newcfg1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val', 'val1.val2': 'val', 'val1.val3': 'val'}]} + # + mix.option('val1.val1').value.set(['val3']) + assert parse_od_get(newcfg1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val3', 'val1.val2': 'val3', 'val1.val3': 'val3'}]} + # + newcfg1.option('val1.val2', 0).value.set('val2') + assert parse_od_get(newcfg1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val3', 'val1.val2': 'val2', 'val1.val3': 'val3'}]} + # + mix.option('val1.val1').value.set(['val3', 'rah']) + assert parse_od_get(newcfg1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val3', 'val1.val2': 'val2', 'val1.val3': 'val3'}, {'val1.val1': 'rah', 'val1.val2': 'rah', 'val1.val3': 'rah'}]} + # + mix.option('val1.val1').value.pop(1) + mix.option('val1.val1').value.set(['val4']) + assert parse_od_get(newcfg1.value.get()) == {'val': 'val', 'val1.val1': [{'val1.val1': 'val4', 'val1.val2': 'val2', 'val1.val3': 'val4'}]} + + +def test_meta_reset(): + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od0 = OptionDescription('root', '', [interface1]) + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od1 = OptionDescription('root', '', [interface1]) + ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True) + netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',)) + interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + od2 = OptionDescription('root', '', [interface1]) + conf1 = Config(od0, name='conf1') + conf2 = Config(od1, name='conf2') + mix = MixConfig(od2, [conf1, conf2]) + mix.property.read_write() + mix.owner.set('mix1') + assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + newconf1 = mix.config('conf1') + newconf2 = mix.config('conf2') + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + errors = mix.value.set('ip_admin_eth0.ip_admin_eth0', ['192.168.1.1']) + assert len(errors) == 0 + assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + newconf1.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.2']) + assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.2'] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + mix.value.reset('ip_admin_eth0.ip_admin_eth0') + assert mix.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf1.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert newconf2.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + + +def test_mix_properties_mix_copy(): + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, properties=('disabled',)) + interface0 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, properties=('disabled',)) + interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, properties=('disabled',)) + interface2 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + conf1 = Config(interface0, name='conf1') + conf2 = Config(interface1, name='conf2') + conf1.property.read_write() + conf2.property.read_write() + mix = MixConfig(interface2, [conf1, conf2], name='mix1') + mix.property.read_write() + + newconf1 = mix.config('conf1') + conf3 = newconf1.config.copy(name='conf3') + newconf3 = mix.config('conf3') + mix2 = list(conf3.config.parents()) + assert len(mix2) == 1 + assert mix.config.name() == mix2[0].config.name() + + newconf2 = mix.config('conf2') + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + assert parse_od_get(conf2.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + assert parse_od_get(newconf3.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + mix.option('ip_admin_eth0').value.set(['192.168.1.2']) + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.2']} + assert parse_od_get(conf2.value.get()) == {'ip_admin_eth0': ['192.168.1.2']} + assert parse_od_get(newconf3.value.get()) == {'ip_admin_eth0': ['192.168.1.2']} + ret = mix.value.set('ip_admin_eth0', ['192.168.1.3'], force_default_if_same=True) + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.3']} + assert parse_od_get(conf2.value.get()) == {'ip_admin_eth0': ['192.168.1.3']} + assert parse_od_get(newconf3.value.get()) == {'ip_admin_eth0': ['192.168.1.3']} + + +def test_mix_properties_mix_deepcopy(): + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, + properties=('disabled',)) + interface0 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, + properties=('disabled',)) + interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, + properties=('disabled',)) + interface2 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + conf1 = Config(interface0, name='conf1') + conf2 = Config(interface1, name='conf2') + conf1.property.read_write() + conf2.property.read_write() + mix = MixConfig(interface2, [conf1, conf2]) + mix.permissive.add('hidden') + mix.property.read_write() + + newconf1 = mix.config('conf1') + newconf2 = mix.config('conf2') + mix2 = newconf1.config.deepcopy(name='conf3') + newconf3 = mix2.config('conf3') + assert mix != mix2 + assert mix.permissive.get() == mix2.permissive.get() + + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + assert parse_od_get(newconf3.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + mix.option('ip_admin_eth0').value.set(['192.168.1.2']) + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.2']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth0': ['192.168.1.2']} + assert parse_od_get(newconf3.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + mix.value.set('ip_admin_eth0', ['192.168.1.3'], force_default_if_same=True) + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.3']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth0': ['192.168.1.3']} + assert parse_od_get(newconf3.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + + +def test_mix_properties_submix_deepcopy(): + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, + properties=('disabled',)) + interface0 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, + properties=('disabled',)) + interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, + properties=('disabled',)) + interface2 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + conf1 = Config(interface0, name='conf1') + conf1.property.read_write() + mix1 = MixConfig(interface1, [conf1], name='mix1') + mix2 = MixConfig(interface2, [mix1], name='mix2') + mix_copy = conf1.config.deepcopy(name='conf2', + metaconfig_prefix='copy_') + assert mix_copy.config.name() == 'copy_mix2' + ret1 = mix_copy.config('copy_mix1') + assert ret1.config.name() == 'copy_mix1' + ret2 = mix_copy.config('copy_mix1.conf2') + assert ret2.config.name() == 'conf2' + + +def test_mix_properties_submix_deepcopy_owner(): + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip") + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth1', "mask") + interface0 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + ip_admin_eth0 = NetworkOption('ip_admin_eth1', "ip") + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask") + interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip") + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask") + interface2 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + conf1 = Config(interface0, name='conf1') + conf1.owner.set('conf1_user') + conf1.property.read_write() + mix1 = MixConfig(interface1, [conf1], name='mix1') + mix1.owner.set('mix1_user') + mix2 = MixConfig(interface2, [mix1], name='mix2') + mix2.owner.set('mix2_user') + # + conf1.option('ip_admin_eth0').value.set('192.168.0.1') + assert conf1.option('ip_admin_eth0').owner.get() == 'conf1_user' + mix2.option('ip_admin_eth0').value.set('192.168.0.3') + assert mix2.option('ip_admin_eth0').owner.get() == 'mix2_user' + # + mix2_copy = conf1.config.deepcopy(name='conf2', + metaconfig_prefix='copy_') + mix2_copy.option('netmask_admin_eth0').value.set('255.255.255.255') + assert mix2_copy.option('ip_admin_eth0').value.get() == '192.168.0.3' + assert mix2_copy.option('ip_admin_eth0').owner.get() == 'mix2_user' + assert mix2_copy.option('netmask_admin_eth0').owner.get() == 'mix2_user' + # + mix1_copy = mix2_copy.config('copy_mix1') + mix1_copy.option('netmask_admin_eth0').value.set('255.255.255.255') + # + conf2 = mix1_copy.config('conf2') + conf2.owner.set('conf2_user') + conf2.option('netmask_admin_eth1').value.set('255.255.255.255') + assert conf2.option('netmask_admin_eth1').owner.get() == 'conf2_user' + assert conf2.option('ip_admin_eth0').value.get() == '192.168.0.1' + assert conf2.option('ip_admin_eth0').owner.get() == 'conf1_user' + + +def test_mix_properties_mix_set_value(): + ip_admin_eth0 = NetworkOption('ip_admin_eth1', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, properties=('disabled',)) + interface0 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth1', "mask", multi=True, properties=('disabled',)) + interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, properties=('disabled',)) + interface2 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) + conf1 = Config(interface0, name='conf1') + conf2 = Config(interface1, name='conf2') + conf1.property.read_write() + conf2.property.read_write() + mix = MixConfig(interface2, [conf1, conf2]) + mix.property.read_write() + newconf2 = mix.config('conf2') + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + ret = mix.value.set('netmask_admin_eth0', ['255.255.255.255'], only_config=True) + assert len(ret) == 2 + assert isinstance(ret[0], PropertiesOptionError) + assert isinstance(ret[1], AttributeError) + del ret[1] + del ret[0] + del ret + ret = mix.value.set('netmask_admin_eth0', ['255.255.255.255'], force_default=True) + assert len(ret) == 2 + assert isinstance(ret[0], AttributeError) + assert isinstance(ret[1], PropertiesOptionError) + del ret[1] + del ret[0] + del ret + ret = mix.value.set('netmask_admin_eth0', ['255.255.255.255'], force_dont_change_value=True) + assert len(ret) == 3 + assert isinstance(ret[0], PropertiesOptionError) + assert isinstance(ret[1], AttributeError) + assert isinstance(ret[2], PropertiesOptionError) + del ret[2] + del ret[1] + del ret[0] + del ret + ret = mix.value.set('netmask_admin_eth0', ['255.255.255.255'], force_default_if_same=True) + assert len(ret) == 2 + assert isinstance(ret[0], AttributeError) + assert isinstance(ret[1], PropertiesOptionError) + del ret[1] + del ret[0] + del ret + ret = mix.value.set('ip_admin_eth0', '255.255.255.255', only_config=True) + assert len(ret) == 2 + assert isinstance(ret[0], AttributeError) + assert isinstance(ret[1], ValueError) + del ret[1] + del ret[0] + del ret + ret = mix.value.set('ip_admin_eth0', '255.255.255.255', force_default=True) + assert len(ret) == 2 + assert isinstance(ret[0], AttributeError) + assert isinstance(ret[1], ValueError) + del ret[1] + del ret[0] + del ret + ret = mix.value.set('ip_admin_eth0', '255.255.255.255', force_dont_change_value=True) + assert len(ret) == 2 + assert isinstance(ret[0], AttributeError) + assert isinstance(ret[1], ValueError) + del ret[1] + del ret[0] + del ret + ret = mix.value.set('ip_admin_eth0', '255.255.255.255', force_default_if_same=True) + assert len(ret) == 2 + assert isinstance(ret[0], AttributeError) + assert isinstance(ret[1], ValueError) + del ret[1] + del ret[0] + del ret + + +def test_mix_different_default(): + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + interface0 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0]) + ip_admin_eth0 = NetworkOption('ip_admin_eth1', "ip", multi=True, default=['192.168.1.2']) + interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0]) + ip_admin_eth0 = NetworkOption('ip_admin_eth1', "ip", multi=True, default=['192.168.1.3']) + interface2 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0]) + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.4']) + ip_admin_eth1 = NetworkOption('ip_admin_eth1', "ip", multi=True, default=['192.168.1.5']) + interface3 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, ip_admin_eth1]) + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.6']) + interface4 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0]) + conf1 = Config(interface0, name='conf1') + conf1.property.read_write() + conf2 = Config(interface1, name='conf2') + conf2.property.read_write() + mix = MixConfig(interface2, [conf1, conf2], name='submix1') + mix = MixConfig(interface3, [mix], name='submix2') + mix = MixConfig(interface4, [mix]) + mix.property.read_write() + # + assert parse_od_get(mix.value.get()) == {'ip_admin_eth0': ['192.168.1.6']} + newsubmix2 = mix.config('submix2') + newsubmix1 = mix.config('submix2.submix1') + newconf1 = mix.config('submix2.submix1.conf1') + newconf2 = mix.config('submix2.submix1.conf2') + assert parse_od_get(newsubmix2.value.get()) == {'ip_admin_eth0': ['192.168.1.4'], 'ip_admin_eth1': ['192.168.1.5']} + assert parse_od_get(newsubmix1.value.get()) == {'ip_admin_eth1': ['192.168.1.3']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth1': ['192.168.1.2']} + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + # + mix.option('ip_admin_eth0').value.set(['192.168.1.7']) + assert parse_od_get(mix.value.get()) == {'ip_admin_eth0': ['192.168.1.7']} + assert parse_od_get(newsubmix2.value.get()) == {'ip_admin_eth0': ['192.168.1.7'], 'ip_admin_eth1': ['192.168.1.5']} + assert parse_od_get(newsubmix1.value.get()) == {'ip_admin_eth1': ['192.168.1.3']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth1': ['192.168.1.2']} + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.7']} + # + newsubmix2.option('ip_admin_eth0').value.set(['192.168.1.8']) + assert parse_od_get(mix.value.get()) == {'ip_admin_eth0': ['192.168.1.7']} + assert parse_od_get(newsubmix2.value.get()) == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.5']} + assert parse_od_get(newsubmix1.value.get()) == {'ip_admin_eth1': ['192.168.1.3']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth1': ['192.168.1.2']} + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.8']} + # + with pytest.raises(AttributeError): + newsubmix1.option('ip_admin_eth0').value.set(['192.168.1.9']) + assert parse_od_get(mix.value.get()) == {'ip_admin_eth0': ['192.168.1.7']} + assert parse_od_get(newsubmix2.value.get()) == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.5']} + assert parse_od_get(newsubmix1.value.get()) == {'ip_admin_eth1': ['192.168.1.3']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth1': ['192.168.1.2']} + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.8']} + # + with pytest.raises(AttributeError): + newconf2.option('ip_admin_eth0').value.set(['192.168.1.9']) + assert parse_od_get(mix.value.get()) == {'ip_admin_eth0': ['192.168.1.7']} + assert parse_od_get(newsubmix2.value.get()) == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.5']} + assert parse_od_get(newsubmix1.value.get()) == {'ip_admin_eth1': ['192.168.1.3']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth1': ['192.168.1.2']} + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.8']} + # + newconf1.option('ip_admin_eth0').value.set(['192.168.1.9']) + assert parse_od_get(mix.value.get()) == {'ip_admin_eth0': ['192.168.1.7']} + assert parse_od_get(newsubmix2.value.get()) == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.5']} + assert parse_od_get(newsubmix1.value.get()) == {'ip_admin_eth1': ['192.168.1.3']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth1': ['192.168.1.2']} + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.9']} + # + with pytest.raises(AttributeError): + mix.option('ip_admin_eth1').value.set(['192.168.1.10']) + assert parse_od_get(mix.value.get()) == {'ip_admin_eth0': ['192.168.1.7']} + assert parse_od_get(newsubmix2.value.get()) == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.5']} + assert parse_od_get(newsubmix1.value.get()) == {'ip_admin_eth1': ['192.168.1.3']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth1': ['192.168.1.2']} + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.9']} + # + newsubmix2.option('ip_admin_eth1').value.set(['192.168.1.10']) + assert parse_od_get(mix.value.get()) == {'ip_admin_eth0': ['192.168.1.7']} + assert parse_od_get(newsubmix2.value.get()) == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.10']} + assert parse_od_get(newsubmix1.value.get()) == {'ip_admin_eth1': ['192.168.1.10']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth1': ['192.168.1.10']} + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.9']} + # + newsubmix1.option('ip_admin_eth1').value.set(['192.168.1.11']) + assert parse_od_get(mix.value.get()) == {'ip_admin_eth0': ['192.168.1.7']} + assert parse_od_get(newsubmix2.value.get()) == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.10']} + assert parse_od_get(newsubmix1.value.get()) == {'ip_admin_eth1': ['192.168.1.11']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth1': ['192.168.1.11']} + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.9']} + # + newconf2.option('ip_admin_eth1').value.set(['192.168.1.12']) + assert parse_od_get(mix.value.get()) == {'ip_admin_eth0': ['192.168.1.7']} + assert parse_od_get(newsubmix2.value.get()) == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.10']} + assert parse_od_get(newsubmix1.value.get()) == {'ip_admin_eth1': ['192.168.1.11']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth1': ['192.168.1.12']} + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.9']} + # + with pytest.raises(AttributeError): + newconf1.option('ip_admin_eth1').value.set(['192.168.1.13']) + assert parse_od_get(mix.value.get()) == {'ip_admin_eth0': ['192.168.1.7']} + assert parse_od_get(newsubmix2.value.get()) == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.10']} + assert parse_od_get(newsubmix1.value.get()) == {'ip_admin_eth1': ['192.168.1.11']} + assert parse_od_get(newconf2.value.get()) == {'ip_admin_eth1': ['192.168.1.12']} + assert parse_od_get(newconf1.value.get()) == {'ip_admin_eth0': ['192.168.1.9']} + + +def test_mix_different_default_reset(): + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1']) + interface0 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0]) + ip_admin_eth0 = NetworkOption('ip_admin_eth1', "ip", multi=True, default=['192.168.1.2']) + interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0]) + ip_admin_eth0 = NetworkOption('ip_admin_eth1', "ip", multi=True, default=['192.168.1.3']) + interface2 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0]) + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.4']) + ip_admin_eth1 = NetworkOption('ip_admin_eth1', "ip", multi=True, default=['192.168.1.5']) + interface3 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, ip_admin_eth1]) + ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.6']) + interface4 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0]) + conf1 = Config(interface0, name='conf1') + conf1.property.read_write() + conf2 = Config(interface1, name='conf2') + conf2.property.read_write() + mix = MixConfig(interface2, [conf1, conf2], name='submix1') + mix = MixConfig(interface3, [mix], name='submix2') + mix = MixConfig(interface4, [mix]) + mix.property.read_write() + # + mix.option('ip_admin_eth0').value.set(['192.168.1.7']) + submix2 = mix.config('submix2') + submix1 = mix.config('submix2.submix1') + conf1 = mix.config('submix2.submix1.conf1') + conf2 = mix.config('submix2.submix1.conf2') + submix2.option('ip_admin_eth0').value.set(['192.168.1.8']) + submix2.option('ip_admin_eth1').value.set(['192.168.1.10']) + submix1.option('ip_admin_eth1').value.set(['192.168.1.11']) + conf2.option('ip_admin_eth1').value.set(['192.168.1.12']) + conf1.option('ip_admin_eth0').value.set(['192.168.1.9']) + assert parse_od_get(mix.value.get()) == {'ip_admin_eth0': ['192.168.1.7']} + assert parse_od_get(submix2.value.get()) == {'ip_admin_eth0': ['192.168.1.8'], 'ip_admin_eth1': ['192.168.1.10']} + assert parse_od_get(submix1.value.get()) == {'ip_admin_eth1': ['192.168.1.11']} + assert parse_od_get(conf2.value.get()) == {'ip_admin_eth1': ['192.168.1.12']} + assert parse_od_get(conf1.value.get()) == {'ip_admin_eth0': ['192.168.1.9']} + # + mix.value.reset('ip_admin_eth0') + assert parse_od_get(mix.value.get()) == {'ip_admin_eth0': ['192.168.1.6']} + assert parse_od_get(submix2.value.get()) == {'ip_admin_eth0': ['192.168.1.4'], 'ip_admin_eth1': ['192.168.1.10']} + assert parse_od_get(submix1.value.get()) == {'ip_admin_eth1': ['192.168.1.11']} + assert parse_od_get(conf2.value.get()) == {'ip_admin_eth1': ['192.168.1.12']} + assert parse_od_get(conf1.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + # + mix.value.reset('ip_admin_eth1') + assert parse_od_get(mix.value.get()) == {'ip_admin_eth0': ['192.168.1.6']} + assert parse_od_get(submix2.value.get()) == {'ip_admin_eth0': ['192.168.1.4'], 'ip_admin_eth1': ['192.168.1.5']} + assert parse_od_get(submix1.value.get()) == {'ip_admin_eth1': ['192.168.1.3']} + assert parse_od_get(conf2.value.get()) == {'ip_admin_eth1': ['192.168.1.2']} + assert parse_od_get(conf1.value.get()) == {'ip_admin_eth0': ['192.168.1.1']} + + +def test_mix_pop_config(): + od = make_description() + config1 = Config(od, name='config1') + config2 = Config(od, name='config2') + mix = MixConfig(od, [config1, config2]) + mix.option('od1.i1').value.set(2) + # + assert len(list(mix.config.list())) == 2 + newconfig1 = mix.config('config1') + assert parse_od_get(newconfig1.value.get()) == {'od1.i1': 2, 'od1.i2': 1, 'od1.i3': None, 'od1.i4': 2, 'od1.i5': [2], 'od1.i6': None} + newconf1 = mix.config.remove('config1') + try: + mix.config('config1') + except ConfigError: + pass + else: + raise Exception('must raise') + assert parse_od_get(newconf1.value.get()) == {'od1.i1': None, 'od1.i2': 1, 'od1.i3': None, 'od1.i4': 2, 'od1.i5': [2], 'od1.i6': None} + # + assert len(list(mix.config.list())) == 1 + with pytest.raises(ConfigError): + mix.config.remove('newconf1') + + +def test_mix_add_config(): + od = make_description() + config1 = Config(od, name='config1') + config2 = Config(od, name='config2') + mix = MixConfig(od, [config1, config2]) + mix.option('od1.i1').value.set(2) + # + assert len(list(mix.config.list())) == 2 + config = Config(od, name='new') + assert parse_od_get(config.value.get()) == {'od1.i1': None, 'od1.i2': 1, 'od1.i3': None, 'od1.i4': 2, 'od1.i5': [2], 'od1.i6': None} + mix.config.add(config) + # + assert len(list(mix.config.list())) == 3 + assert parse_od_get(config.value.get()) == {'od1.i1': 2, 'od1.i2': 1, 'od1.i3': None, 'od1.i4': 2, 'od1.i5': [2], 'od1.i6': None} + # + with pytest.raises(ConflictError): + mix.config.add(config) + + +def test_mix_add_config_readd(): + od = make_description() + mix = MixConfig(od, []) + mix2 = MixConfig(od, []) + # + config = Config(od, name='new') + mix.config.add(config) + mix2.config.add(config) + assert len(list(config.config.parents())) == 2 + + +def test_mix_new_config_readd(): + od = make_description() + mix = MixConfig(od, []) + assert len(list(mix.config.list())) == 0 + mix2 = mix.config.new('mix2') + assert len(list(mix.config.list())) == 1 + + +def test_meta_new_mixconfig(): + od = make_description() + cfg = Config(od, name='cfg1') + meta = MetaConfig([cfg]) + mix = meta.config.new('mixconfig', type="mixconfig") + assert isinstance(mix, MixConfig) + + +def test_meta_mixconfig_parents(): + od = make_description() + cfg = Config(od, name='cfg1') + meta = MetaConfig([cfg]) + mix = meta.config.new('mixconfig', type="mixconfig") + parents = mix.config.parents() + assert len(parents) == 1 +# assert parents[0].config.get() == meta diff --git a/tests/test_multi_parents.py b/tests/test_multi_parents.py index ad0ac26..8107577 100644 --- a/tests/test_multi_parents.py +++ b/tests/test_multi_parents.py @@ -15,76 +15,76 @@ def make_metaconfig(): return MetaConfig([], optiondescription=od2, name='metacfg1') -#def test_multi_parents_path(): -# """ -# metacfg1 (1) --- -# | -- cfg1 -# metacfg2 (2) --- -# """ -# metacfg1 = make_metaconfig() -# cfg1 = metacfg1.config.new(type='config', name="cfg1") -# metacfg2 = MetaConfig([cfg1], name='metacfg2') -# # -# assert metacfg1.config.path() == 'metacfg1' -# assert metacfg2.config.path() == 'metacfg2' -# assert cfg1.config.path() == 'metacfg2.metacfg1.cfg1' -# -# -#def test_multi_parents_path_same(): -# """ -# --- metacfg2 (1) --- -# metacfg1 --| | -- cfg1 -# --- metacfg3 (2) --- -# """ -# metacfg1 = make_metaconfig() -# metacfg2 = metacfg1.config.new(type='metaconfig', name="metacfg2") -# metacfg3 = metacfg1.config.new(type='metaconfig', name="metacfg3") -# cfg1 = metacfg2.config.new(type='config', name="cfg1") -# metacfg3.config.add(cfg1) -# # -# assert metacfg2.config.path() == 'metacfg1.metacfg2' -# assert metacfg3.config.path() == 'metacfg1.metacfg3' -# assert cfg1.config.path() == 'metacfg1.metacfg3.metacfg1.metacfg2.cfg1' -# metacfg1.option('od1.i1').value.set(1) -# metacfg3.option('od1.i1').value.set(2) -# assert cfg1.option('od1.i1').value.get() == 1 -# orideep = cfg1.config.deepcopy(metaconfig_prefix="test_", name='test_cfg1') -# deep = orideep -# while True: -# try: -# children = list(deep.config.list()) -# except: -# break -# assert len(children) < 2 -# deep = children[0] -# assert deep.config.path() == 'test_metacfg3.test_metacfg1.test_metacfg2.test_cfg1' -# assert cfg1.option('od1.i1').value.get() == 1 -# -# -# -#def test_multi_parents_value(): -# metacfg1 = make_metaconfig() -# cfg1 = metacfg1.config.new(type='config', name="cfg1") -# metacfg2 = MetaConfig([cfg1], name='metacfg2') -# # -# assert cfg1.option('od1.i1').value.get() == None -# assert cfg1.option('od1.i2').value.get() == 1 -# assert cfg1.option('od1.i3').value.get() == None -# # -# assert metacfg1.option('od1.i1').value.get() == None -# assert metacfg1.option('od1.i2').value.get() == 1 -# assert metacfg1.option('od1.i3').value.get() == None -# # -# assert metacfg2.option('od1.i1').value.get() == None -# assert metacfg2.option('od1.i2').value.get() == 1 -# assert metacfg2.option('od1.i3').value.get() == None -# # -# metacfg1.option('od1.i3').value.set(3) -# assert metacfg1.option('od1.i3').value.get() == 3 -# assert cfg1.option('od1.i3').value.get() == 3 -# assert metacfg2.option('od1.i2').value.get() == 1 -# # -# metacfg2.option('od1.i2').value.set(4) -# assert metacfg2.option('od1.i2').value.get() == 4 -# assert metacfg1.option('od1.i2').value.get() == 1 -# assert cfg1.option('od1.i2').value.get() == 4 +def test_multi_parents_path(): + """ + metacfg1 (1) --- + | -- cfg1 + metacfg2 (2) --- + """ + metacfg1 = make_metaconfig() + cfg1 = metacfg1.config.new(type='config', name="cfg1") + metacfg2 = MetaConfig([cfg1], name='metacfg2') + # + assert metacfg1.config.path() == 'metacfg1' + assert metacfg2.config.path() == 'metacfg2' + assert cfg1.config.path() == 'metacfg2.metacfg1.cfg1' + + +def test_multi_parents_path_same(): + """ + --- metacfg2 (1) --- + metacfg1 --| | -- cfg1 + --- metacfg3 (2) --- + """ + metacfg1 = make_metaconfig() + metacfg2 = metacfg1.config.new(type='metaconfig', name="metacfg2") + metacfg3 = metacfg1.config.new(type='metaconfig', name="metacfg3") + cfg1 = metacfg2.config.new(type='config', name="cfg1") + metacfg3.config.add(cfg1) + # + assert metacfg2.config.path() == 'metacfg1.metacfg2' + assert metacfg3.config.path() == 'metacfg1.metacfg3' + assert cfg1.config.path() == 'metacfg1.metacfg3.metacfg1.metacfg2.cfg1' + metacfg1.option('od1.i1').value.set(1) + metacfg3.option('od1.i1').value.set(2) + assert cfg1.option('od1.i1').value.get() == 1 + orideep = cfg1.config.deepcopy(metaconfig_prefix="test_", name='test_cfg1') + deep = orideep + while True: + try: + children = list(deep.config.list()) + except: + break + assert len(children) < 2 + deep = children[0] + assert deep.config.path() == 'test_metacfg3.test_metacfg1.test_metacfg2.test_cfg1' + assert cfg1.option('od1.i1').value.get() == 1 + + + +def test_multi_parents_value(): + metacfg1 = make_metaconfig() + cfg1 = metacfg1.config.new(type='config', name="cfg1") + metacfg2 = MetaConfig([cfg1], name='metacfg2') + # + assert cfg1.option('od1.i1').value.get() == None + assert cfg1.option('od1.i2').value.get() == 1 + assert cfg1.option('od1.i3').value.get() == None + # + assert metacfg1.option('od1.i1').value.get() == None + assert metacfg1.option('od1.i2').value.get() == 1 + assert metacfg1.option('od1.i3').value.get() == None + # + assert metacfg2.option('od1.i1').value.get() == None + assert metacfg2.option('od1.i2').value.get() == 1 + assert metacfg2.option('od1.i3').value.get() == None + # + metacfg1.option('od1.i3').value.set(3) + assert metacfg1.option('od1.i3').value.get() == 3 + assert cfg1.option('od1.i3').value.get() == 3 + assert metacfg2.option('od1.i2').value.get() == 1 + # + metacfg2.option('od1.i2').value.set(4) + assert metacfg2.option('od1.i2').value.get() == 4 + assert metacfg1.option('od1.i2').value.get() == 1 + assert cfg1.option('od1.i2').value.get() == 4 diff --git a/tests/test_option_callback.py b/tests/test_option_callback.py index f54c186..1816db6 100644 --- a/tests/test_option_callback.py +++ b/tests/test_option_callback.py @@ -13,7 +13,7 @@ from tiramisu import ChoiceOption, BoolOption, IntOption, FloatOption, \ valid_ip_netmask, ParamSelfOption, ParamInformation, ParamSelfInformation from tiramisu.error import PropertiesOptionError, ConflictError, LeadershipError, ConfigError from tiramisu.i18n import _ -from .config import config_type, get_config, parse_od_get +from .config import config_type, get_config, parse_od_get, get_dependencies def return_val(): @@ -693,6 +693,7 @@ def test_callback_leader_and_followers_leader(config_type): cfg = Config(od1) cfg.property.read_write() cfg = get_config(cfg, config_type) + assert [(a.path(), a.index()) for a in cfg.option('val1').dependencies()] == [('val2.val2', None)] assert cfg.option('val1').value.get() == ['val'] assert cfg.option('val2.val2').value.get() == ['val'] # @@ -783,10 +784,29 @@ def test_callback_leader_and_followers_leader2(config_type): cfg = Config(od1) cfg.property.read_write() cfg = get_config(cfg, config_type) + assert get_dependencies(cfg.option('val1.val2')) == [('val1', None)] + assert get_dependencies(cfg.option('val1.val3')) == [('val1', None)] #, ('val2.val2', 0)] + assert get_dependencies(cfg.option('val1.val4')) == [('val1', None)] #, ('val2.val3', 0)] + # cfg.option('val1.val1').value.set(['val']) + assert get_dependencies(cfg.option('val1.val2')) == [('val1', None), ('val1.val3', 0)] + assert get_dependencies(cfg.option('val1.val2', 0)) == [('val1', None), ('val1.val3', 0)] + assert get_dependencies(cfg.option('val1.val3')) == [('val1', None), ('val1.val4', 0)] + assert get_dependencies(cfg.option('val1.val3', 0)) == [('val1', None), ('val1.val4', 0)] + assert get_dependencies(cfg.option('val1.val4')) == [('val1', None)] + assert cfg.option('val1.val4', 0).value.get() == 'val2' assert cfg.option('val1.val3', 0).value.get() == 'val2' assert cfg.option('val1.val2', 0).value.get() == 'val2' + # + cfg.option('val1.val1').value.set(['val1', 'val2']) + assert get_dependencies(cfg.option('val1.val2')) == [('val1', None), ('val1.val3', 0), ('val1.val3', 1)] + assert get_dependencies(cfg.option('val1.val2', 0)) == [('val1', None), ('val1.val3', 0)] + assert get_dependencies(cfg.option('val1.val2', 1)) == [('val1', None), ('val1.val3', 1)] + assert get_dependencies(cfg.option('val1.val3')) == [('val1', None), ('val1.val4', 0), ('val1.val4', 1)] + assert get_dependencies(cfg.option('val1.val3', 0)) == [('val1', None), ('val1.val4', 0)] + assert get_dependencies(cfg.option('val1.val3', 1)) == [('val1', None), ('val1.val4', 1)] + assert get_dependencies(cfg.option('val1.val4')) == [('val1', None)] # assert not list_sessions() @@ -1499,6 +1519,7 @@ def test_leadership_callback_description(config_type): cfg.option('od.st.st1.st2', 0).value.set('yes') assert cfg.option('od.st.st1.st1').owner.get() == owner assert cfg.option('od.st.st1.st2', 0).owner.get() == owner + assert get_dependencies(cfg.option('od.st.st1.st2')) == [('od.st.st1', None)] # assert not list_sessions() @@ -1515,6 +1536,8 @@ def test_leadership_callback_outside(config_type): owner = cfg.owner.get() cfg.option('od.st.st1.st1').value.set(['yes']) assert parse_od_get(cfg.value.get()) == {'od.st.st1.st1': [{'od.st.st1.st1': 'yes', 'od.st.st1.st2': 'val2'}], 'od.st.st3': ['val2']} + assert get_dependencies(cfg.option('od.st.st1.st2')) == [('od.st.st1', None), ('od.st.st3', None,)] + ## assert not list_sessions() diff --git a/tests/test_option_default.py b/tests/test_option_default.py index f8feaad..77b1b21 100644 --- a/tests/test_option_default.py +++ b/tests/test_option_default.py @@ -154,8 +154,8 @@ def test_force_default_on_freeze_multi(): # with pytest.raises(ConfigError): # Config(od1) # assert not list_sessions() - - +# +# #def test_force_metaconfig_on_freeze_leader(): # dummy1 = BoolOption('dummy1', 'Test int option', multi=True, properties=('force_metaconfig_on_freeze',)) # dummy2 = BoolOption('dummy2', 'Test string option', multi=True) diff --git a/tests/test_option_setting.py b/tests/test_option_setting.py index 9960530..2c13699 100644 --- a/tests/test_option_setting.py +++ b/tests/test_option_setting.py @@ -818,27 +818,27 @@ def test_reset_properties_force_store_value(): # assert not list_sessions() -#def test_importation_force_store_value(): -# gcdummy = BoolOption('dummy', 'dummy', default=False, -# properties=('force_store_value',)) -# gcgroup = OptionDescription('gc', '', [gcdummy]) -# od1 = OptionDescription('tiramisu', '', [gcgroup]) -# config1 = Config(od1) -# assert config1.value.exportation() == {} -# config1.property.add('frozen') -# assert config1.value.exportation() == {} -# config1.property.add('force_store_value') -# assert config1.value.exportation() == {'gc.dummy': {None: [False, 'forced']}} -# exportation = config1.property.exportation() -# config2 = Config(od1) -# assert config2.value.exportation() == {} -# config2.property.importation(exportation) -# assert config2.value.exportation() == {'gc.dummy': {None: [False, 'forced']}} -# config2.property.importation(exportation) -# assert config2.value.exportation() == {'gc.dummy': {None: [False, 'forced']}} -## assert not list_sessions() -# -# +def test_importation_force_store_value(): + gcdummy = BoolOption('dummy', 'dummy', default=False, + properties=('force_store_value',)) + gcgroup = OptionDescription('gc', '', [gcdummy]) + od1 = OptionDescription('tiramisu', '', [gcgroup]) + config1 = Config(od1) + assert config1.value.exportation() == {} + config1.property.add('frozen') + assert config1.value.exportation() == {} + config1.property.add('force_store_value') + assert config1.value.exportation() == {'gc.dummy': {None: [False, 'forced']}} + exportation = config1.property.exportation() + config2 = Config(od1) + assert config2.value.exportation() == {} + config2.property.importation(exportation) + assert config2.value.exportation() == {'gc.dummy': {None: [False, 'forced']}} + config2.property.importation(exportation) + assert config2.value.exportation() == {'gc.dummy': {None: [False, 'forced']}} +# assert not list_sessions() + + def test_set_modified_value(): gcdummy = BoolOption('dummy', 'dummy', default=False, properties=('force_store_value',)) gcgroup = OptionDescription('gc', '', [gcdummy]) @@ -920,18 +920,18 @@ def test_set_modified_value(): # assert not list_sessions() -#def test_none_is_not_modified(): -# gcdummy = StrOption('dummy', 'dummy', properties=('force_store_value',)) -# gcdummy1 = StrOption('dummy1', 'dummy1', default="str", properties=('force_store_value',)) -# gcgroup = OptionDescription('gc', '', [gcdummy, gcdummy1]) -# od1 = OptionDescription('tiramisu', '', [gcgroup]) -# cfg = Config(od1) -# assert cfg.value.exportation() == {} -# cfg.property.read_write() -# assert cfg.value.exportation() == {'gc.dummy1': {None: ['str', 'forced']}} -## assert not list_sessions() -# -# +def test_none_is_not_modified(): + gcdummy = StrOption('dummy', 'dummy', properties=('force_store_value',)) + gcdummy1 = StrOption('dummy1', 'dummy1', default="str", properties=('force_store_value',)) + gcgroup = OptionDescription('gc', '', [gcdummy, gcdummy1]) + od1 = OptionDescription('tiramisu', '', [gcgroup]) + cfg = Config(od1) + assert cfg.value.exportation() == {} + cfg.property.read_write() + assert cfg.value.exportation() == {'gc.dummy1': {None: ['str', 'forced']}} +# assert not list_sessions() + + def test_pprint(): msg_error = _("cannot access to {0} {1} because has {2} {3}") msg_is_not = _('the value of "{0}" is not {1}') diff --git a/tests/test_option_validator.py b/tests/test_option_validator.py index f7e2f36..25ebb12 100644 --- a/tests/test_option_validator.py +++ b/tests/test_option_validator.py @@ -34,7 +34,7 @@ def return_val(value, param=None): def return_if_val(value): - if value != 'val': + if value not in ['val', 'val_not_raise']: raise ValueError('test error') @@ -341,6 +341,13 @@ def test_validator_multi(config_type): with warnings.catch_warnings(record=True) as w: cfg.option('opt1').value.set(['val', 'val1']) assert len(w) == 1 + with warnings.catch_warnings(record=True) as w: + cfg.option('opt1').value.set(['val1', 'val2']) + assert len(w) == 2 + with warnings.catch_warnings(record=True) as w: + # same value twice + cfg.option('opt1').value.set(['val', 'val', 'val_not_raise']) + assert len(w) == 2 # assert not list_sessions() diff --git a/tests/test_slots.py b/tests/test_slots.py index e7dfa5a..5dbc8d4 100644 --- a/tests/test_slots.py +++ b/tests/test_slots.py @@ -146,8 +146,8 @@ def test_slots_option_readonly(): with pytest.raises(AttributeError): q._requires = 'q' # assert not list_sessions() - - +# +# #def test_slots_description(): # # __slots__ for OptionDescription should be complete for __getattr__ # slots = set() diff --git a/tests/test_submulti.py b/tests/test_submulti.py index c76ee6b..a7271ac 100644 --- a/tests/test_submulti.py +++ b/tests/test_submulti.py @@ -528,43 +528,43 @@ def test_submulti_unique(): # assert not list_sessions() -#def test_multi_submulti_meta(): -# multi = StrOption('multi', '', multi=submulti) -# od1 = OptionDescription('od', '', [multi]) -# cfg = Config(od1, name='cfg') -# cfg.property.read_write() -# cfg2 = Config(od1) -# cfg2.property.read_write() -# meta = MetaConfig([cfg, cfg2]) -# meta.property.read_write() -# meta.option('multi').value.set([['val']]) -# assert meta.option('multi').value.get() == [['val']] -# newcfg = meta.config('cfg') -# newcfg.option('multi').value.set([['val', None]]) -# assert cfg.option('multi').value.get() == [['val', None]] -# newcfg = meta.config('cfg') -# assert newcfg.option('multi').value.get() == [['val', None]] -# assert meta.option('multi').value.get() == [['val']] -## assert not list_sessions() -# -# -#def test_multi_submulti_meta_no_cache(): -# multi = StrOption('multi', '', multi=submulti) -# multi = StrOption('multi', '', multi=submulti) -# od1 = OptionDescription('od', '', [multi]) -# cfg = Config(od1, name='cfg') -# cfg.property.read_write() -# cfg2 = Config(od1) -# cfg.property.read_write() -# meta = MetaConfig([cfg, cfg2]) -# meta.property.read_write() -# meta.property.remove('cache') -# meta.option('multi').value.set([['val']]) -# assert meta.option('multi').value.get() == [['val']] -# newcfg = meta.config('cfg') -# newcfg.option('multi').value.set([['val', None]]) -# assert cfg.option('multi').value.get() == [['val', None]] -# newcfg = meta.config('cfg') -# assert newcfg.option('multi').value.get() == [['val', None]] -# assert meta.option('multi').value.get() == [['val']] -## assert not list_sessions() +def test_multi_submulti_meta(): + multi = StrOption('multi', '', multi=submulti) + od1 = OptionDescription('od', '', [multi]) + cfg = Config(od1, name='cfg') + cfg.property.read_write() + cfg2 = Config(od1) + cfg2.property.read_write() + meta = MetaConfig([cfg, cfg2]) + meta.property.read_write() + meta.option('multi').value.set([['val']]) + assert meta.option('multi').value.get() == [['val']] + newcfg = meta.config('cfg') + newcfg.option('multi').value.set([['val', None]]) + assert cfg.option('multi').value.get() == [['val', None]] + newcfg = meta.config('cfg') + assert newcfg.option('multi').value.get() == [['val', None]] + assert meta.option('multi').value.get() == [['val']] +# assert not list_sessions() + + +def test_multi_submulti_meta_no_cache(): + multi = StrOption('multi', '', multi=submulti) + multi = StrOption('multi', '', multi=submulti) + od1 = OptionDescription('od', '', [multi]) + cfg = Config(od1, name='cfg') + cfg.property.read_write() + cfg2 = Config(od1) + cfg.property.read_write() + meta = MetaConfig([cfg, cfg2]) + meta.property.read_write() + meta.property.remove('cache') + meta.option('multi').value.set([['val']]) + assert meta.option('multi').value.get() == [['val']] + newcfg = meta.config('cfg') + newcfg.option('multi').value.set([['val', None]]) + assert cfg.option('multi').value.get() == [['val', None]] + newcfg = meta.config('cfg') + assert newcfg.option('multi').value.get() == [['val', None]] + assert meta.option('multi').value.get() == [['val']] +# assert not list_sessions() diff --git a/tiramisu/api.py b/tiramisu/api.py index 03e744f..a2274ab 100644 --- a/tiramisu/api.py +++ b/tiramisu/api.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright (C) 2017-2024 Team tiramisu (see AUTHORS for all contributors) +# Copyright (C) 2017-2025 Team tiramisu (see AUTHORS for all contributors) # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by the @@ -52,6 +52,13 @@ from .autolib import Calculation TIRAMISU_VERSION = 5 +class Fake_SubConfig: + def __init__(self, config_bag, path, index): + self.config_bag = config_bag + self.path = path + self.index = index + + class TiramisuHelp: _tmpl_help = " {0}\t{1}" @@ -120,13 +127,16 @@ class CommonTiramisu(TiramisuHelp): def _set_subconfig(self) -> None: if not self._subconfig: - self._subconfig = self._config_bag.context.get_sub_config( - self._config_bag, - self._path, - self._index, - validate_properties=False, - allow_dynoption=self._allow_dynoption, - ) + try: + self._subconfig = self._config_bag.context.get_sub_config( + self._config_bag, + self._path, + self._index, + validate_properties=False, + allow_dynoption=self._allow_dynoption, + ) + except AssertionError as err: + raise ConfigError(str(err)) def option_type(typ): @@ -202,7 +212,7 @@ def option_type(typ): "please specify index with a follower option ({0}.{1})" ).format(self.__class__.__name__, func.__name__) raise ConfigError(msg) - if self._validate_properties and "dont_validate_property" not in types: + if 'validate_properties' in types or (self._validate_properties and "dont_validate_property" not in types): settings = self._config_bag.context.get_settings() parent = self._subconfig.parent if parent and parent.transitive_properties: @@ -253,10 +263,11 @@ class _TiramisuOptionWalk: validate_properties: bool, *, uncalculated: bool = False, + with_index: bool = True, ): options = [] for sub_subconfig in subconfig.get_children( - validate_properties, uncalculated=uncalculated + validate_properties, uncalculated=uncalculated, with_index=with_index, ): options.append( TiramisuOption( @@ -287,7 +298,7 @@ class _TiramisuOptionOptionDescription: """Get Tiramisu option""" return self._subconfig.option - @option_type(["optiondescription", "option", "with_or_without_index", "symlink"]) + @option_type(["optiondescription", "option", "with_or_without_index", "symlink", "allow_dynoption"]) def isoptiondescription(self): """Test if option is an optiondescription""" return self._subconfig.option.impl_is_optiondescription() @@ -336,6 +347,15 @@ class _TiramisuOptionOptionDescription: return self._subconfig.option.impl_getpath() return self._subconfig.true_path + def parent(self): + parent = self._subconfig.parent + return TiramisuOption( + parent.path, + None, + self._config_bag, + subconfig=parent, + ) + @option_type(["optiondescription", "option", "symlink", "with_or_without_index"]) def has_dependency( self, @@ -345,18 +365,54 @@ class _TiramisuOptionOptionDescription: return self._subconfig.option.impl_has_dependency(self_is_dep) @option_type(["optiondescription", "option", "symlink", "with_or_without_index"]) - def dependencies(self): + def dependencies( + self, + *, + uncalculated: bool = False, + ): """Get dependencies from this option""" options = [] - for option in self._subconfig.option.get_dependencies(self._config_bag.context): - options.append( - TiramisuOption( - option().impl_getpath(), - None, - self._config_bag, - allow_dynoption=True, - ) - ) + context = self._config_bag.context + index = self._index + parent = self._subconfig.parent + parent_option = parent.option + for woption in self._subconfig.option.get_dependencies(self._config_bag.context): + option = woption() + if not uncalculated and option.issubdyn(): + for subconfig in context.get_dynamic_from_dyn_option(self._subconfig, option): + options.append( + TiramisuOption( + subconfig.path, + None, + self._config_bag, + ) + ) + elif not uncalculated and option.impl_is_dynoptiondescription(): + for subconfig in context.get_dynamic_from_dyn_option(self._subconfig, option): + options.append( + TiramisuOption( + subconfig.path, + None, + self._config_bag, + ) + ) + else: + if not option.impl_is_optiondescription() and option.impl_is_follower() and parent_option.impl_is_leadership() and parent_option.in_same_leadership(option): + if index is not None: + current_indexes = [index] + else: + current_indexes = range(parent.get_length_leadership()) + else: + current_indexes = [None] + for current_index in current_indexes: + options.append( + TiramisuOption( + option.impl_getpath(), + current_index, + self._config_bag, + allow_dynoption=uncalculated, + ) + ) return options @option_type(["option", "optiondescription", "symlink", "with_or_without_index"]) @@ -456,27 +512,27 @@ class _TiramisuOptionOptionDescription: class _TiramisuOptionOption(_TiramisuOptionOptionDescription): """Manage option""" - @option_type(["option", "symlink", "with_or_without_index"]) + @option_type(["option", "symlink", "with_or_without_index", "allow_dynoption"]) def ismulti(self): """Test if option could have multi value""" return self._subconfig.option.impl_is_multi() - @option_type(["option", "symlink", "with_or_without_index"]) + @option_type(["option", "symlink", "with_or_without_index", "allow_dynoption"]) def issubmulti(self): """Test if option could have submulti value""" return self._subconfig.option.impl_is_submulti() - @option_type(["option", "with_or_without_index", "symlink"]) + @option_type(["option", "with_or_without_index", "symlink", "allow_dynoption"]) def isleader(self): """Test if option is a leader""" return self._subconfig.option.impl_is_leader() - @option_type(["option", "with_or_without_index", "symlink"]) + @option_type(["option", "with_or_without_index", "symlink", "allow_dynoption"]) def isfollower(self): """Test if option is a follower""" return self._subconfig.option.impl_is_follower() - @option_type(["option", "symlink", "with_or_without_index"]) + @option_type(["option", "symlink", "with_or_without_index", "allow_dynoption"]) def issymlinkoption(self) -> bool: """Test if option is a symlink option""" return self._subconfig.option.impl_is_symlinkoption() @@ -498,9 +554,11 @@ class _TiramisuOptionOption(_TiramisuOptionOptionDescription): return r"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$" @option_type(["option", "with_or_without_index", "symlink"]) - def index(self): + def index(self, index=None): """Get index of option""" - return self._subconfig.index + if index is None: + return self._subconfig.index + return TiramisuOption(self._path, index, self._config_bag) @option_type(["symlink", "optiondescription"]) def option(self, *args, **kwargs): @@ -546,9 +604,9 @@ class TiramisuOptionOwner(CommonTiramisuOption): _validate_properties = True @option_type(["symlink", "option", "with_index"]) - def get(self): + def get(self, only_self=False): """Get owner for a specified option""" - return self._config_bag.context.get_owner(self._subconfig) + return self._config_bag.context.get_owner(self._subconfig, validate_meta=not only_self) @option_type(["symlink", "option", "with_index"]) def isdefault(self): @@ -597,6 +655,7 @@ class TiramisuOptionProperty(CommonTiramisuOption): self._subconfig, uncalculated=uncalculated, apply_requires=apply_requires, + not_unrestraint=True, ) @option_type(["option", "optiondescription", "with_or_without_index"]) @@ -1056,12 +1115,13 @@ class TiramisuOption( self._set_subconfig() return self._subconfig.option.impl_get_group_type() - @option_type("optiondescription") + @option_type(["optiondescription", "validate_properties"]) def list( self, *, validate_properties: bool = True, uncalculated: bool = False, + with_index: bool = True, ): """List options inside an option description (by default list only option)""" self._set_subconfig() @@ -1069,6 +1129,7 @@ class TiramisuOption( self._subconfig, validate_properties, uncalculated=uncalculated, + with_index=with_index, ) def _load_dict( @@ -1189,6 +1250,8 @@ class TiramisuContextValue(TiramisuConfig, _TiramisuODGet): self, path: str, value: Any, + *, + index: Optional[int] = None, only_config=undefined, force_default=undefined, force_default_if_same=undefined, @@ -1204,14 +1267,21 @@ class TiramisuContextValue(TiramisuConfig, _TiramisuODGet): kwargs["force_default_if_same"] = force_default_if_same if force_dont_change_value is not undefined: kwargs["force_dont_change_value"] = force_dont_change_value - option_bag = OptionBag( - None, - None, - self._config_bag, - path=path, - ) + context = self._config_bag.context + if isinstance(context, KernelGroupConfig): + subconfig = Fake_SubConfig(self._config_bag, + path, + index, + ) + else: + subconfig = context.get_sub_config( + self._config_bag, + path, + index, + validate_properties=False, + ) return self._config_bag.context.set_value( - option_bag, + subconfig, value, **kwargs, ) @@ -1599,6 +1669,7 @@ class TiramisuContextOption(TiramisuConfig, _TiramisuOptionWalk): *, validate_properties: bool = True, uncalculated: bool = False, + with_index: bool = True, ): """List options (by default list only option)""" root = self._config_bag.context.get_root(self._config_bag) @@ -1606,6 +1677,7 @@ class TiramisuContextOption(TiramisuConfig, _TiramisuOptionWalk): root, validate_properties, uncalculated=uncalculated, + with_index=with_index, ) def _load_dict(self, clearable="all", remotable="minimum"): @@ -1912,7 +1984,7 @@ class Config(TiramisuAPI, TiramisuContextOption): return f"" -class MetaConfig(TiramisuAPI): +class MetaConfig(TiramisuAPI, TiramisuContextOption): """MetaConfig object that enables us to handle the sub configuration's options with common root optiondescription """ @@ -1980,7 +2052,7 @@ class MixConfig(TiramisuAPI): display_name=display_name, ) settings = config.get_settings() - properties = settings.get_context_properties(config.properties_cache) + properties = settings.get_context_properties() permissives = settings.get_context_permissives() config_bag = ConfigBag( config, diff --git a/tiramisu/config.py b/tiramisu/config.py index 219609b..a0a2313 100644 --- a/tiramisu/config.py +++ b/tiramisu/config.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright (C) 2012-2024 Team tiramisu (see AUTHORS for all contributors) +# Copyright (C) 2012-2025 Team tiramisu (see AUTHORS for all contributors) # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by the @@ -91,12 +91,12 @@ class CCache: if option.issubdyn(): # it's an option in dynoptiondescription, remove cache for all generated option self.reset_cache_dyn_option( - config_bag, + subconfig, option, resetted_opts, ) elif option.impl_is_dynoptiondescription(): - self._reset_cache_dyn_optiondescription( + self.reset_cache_dyn_optiondescription( option, config_bag, resetted_opts, @@ -120,13 +120,7 @@ class CCache: resetted_opts, ) - def _reset_cache_dyn_optiondescription( - self, - option, - config_bag, - resetted_opts, - ): - # reset cache for all chidren + def get_dynamic_from_dyn_optiondescription(self, config_bag, option): path = option.impl_getpath() if "." in path: parent_path = path.rsplit(".", 1)[0] @@ -139,9 +133,21 @@ class CCache: ) else: parent_subconfig = self.get_root(config_bag) - for subconfig in parent_subconfig.dyn_to_subconfig( + return parent_subconfig.dyn_to_subconfig( option, False, + ) + + def reset_cache_dyn_optiondescription( + self, + option, + config_bag, + resetted_opts, + ): + # reset cache for all chidren + for subconfig in self.get_dynamic_from_dyn_optiondescription( + config_bag, + option, ): self.reset_one_option_cache( subconfig, @@ -157,15 +163,20 @@ class CCache: resetted_opts, ) - def reset_cache_dyn_option( - self, - config_bag, - option, - resetted_opts, - ): - currents = [self.get_root(config_bag)] + def get_dynamic_from_dyn_option(self, subconfig, option): + config_bag = subconfig.config_bag sub_paths = option.impl_getpath() - for sub_path in sub_paths.split("."): + current_paths = subconfig.path.split('.') + current_paths_max_index = len(current_paths) - 1 + current_subconfigs = [] + parent = subconfig + while True: + current_subconfigs.insert(0, parent) + parent = parent.parent + if parent.path is None: + break + currents = [self.get_root(config_bag)] + for idx, sub_path in enumerate(sub_paths.split(".")): new_currents = [] for current in currents: sub_option = current.option.get_child( @@ -175,15 +186,17 @@ class CCache: allow_dynoption=True, ) if sub_option.impl_is_dynoptiondescription(): - new_currents.extend( - list( - current.dyn_to_subconfig( - sub_option, - False, + if idx <= current_paths_max_index and sub_option == current_subconfigs[idx].option: + new_currents.append(current_subconfigs[idx]) + else: + new_currents.extend( + list( + current.dyn_to_subconfig( + sub_option, + False, + ) ) ) - ) - else: new_currents.append( current.get_child( @@ -194,7 +207,15 @@ class CCache: ), ) currents = new_currents - for dyn_option_subconfig in currents: + return currents + + def reset_cache_dyn_option( + self, + subconfig, + option, + resetted_opts, + ): + for dyn_option_subconfig in self.get_dynamic_from_dyn_option(subconfig, option): self.reset_one_option_cache( dyn_option_subconfig, resetted_opts, @@ -348,8 +369,9 @@ class SubConfig: validate_properties, *, uncalculated: bool = False, + with_index: bool = True, ): - if self.option.impl_is_leadership() and not uncalculated: + if self.option.impl_is_leadership() and not uncalculated and with_index: yield from self.get_leadership_children(validate_properties) else: for child in self.option.get_children(): @@ -536,6 +558,19 @@ class SubConfig: return subconfigs return subconfigs[0] + def change_context(self, context) -> "SubConfig": + config_bag = self.config_bag.copy() + config_bag.context = context + return SubConfig(self.option, + self.index, + self.path, + config_bag, + self.parent, + self.identifiers, + true_path=self.true_path, + validate_properties=False, + ) + class _Config(CCache): """Sub configuration management entry. @@ -816,6 +851,17 @@ class _Config(CCache): # ============================================================================= # Manage value + def set_value(self, + subconfig, + value: Any, + ) -> Any: + """set value + """ + self.get_settings().validate_properties(subconfig) + return self.get_values().set_value(subconfig, + value + ) + def get_value( self, subconfig, @@ -935,6 +981,8 @@ class _Config(CCache): def get_owner( self, subconfig: "SubConfig", + *, + validate_meta=True, ): """get owner""" subconfigs = self._get( @@ -945,13 +993,14 @@ class _Config(CCache): for sc in subconfigs: owner = self.get_owner( sc, + validate_meta=validate_meta, ) if owner != owners.default: break else: owner = owners.default else: - owner = self.get_values().getowner(subconfigs) + owner = self.get_values().getowner(subconfigs, validate_meta=validate_meta) return owner @@ -1232,6 +1281,8 @@ class KernelGroupConfig(_CommonConfig): # pylint: disable=super-init-not-called names = [] for child in children: + if not isinstance(child, (KernelConfig, KernelGroupConfig)): + raise TypeError(_("child must be a Config, GroupConfig, MixConfig or MetaConfig")) name_ = child._impl_name names.append(name_) if len(names) != len(set(names)): @@ -1259,61 +1310,58 @@ class KernelGroupConfig(_CommonConfig): def reset_cache( self, - option_bag, + subconfig, resetted_opts=None, ): if resetted_opts is None: resetted_opts = [] if isinstance(self, KernelMixConfig): super().reset_cache( - option_bag, + subconfig, resetted_opts=copy(resetted_opts), ) for child in self._impl_children: - if option_bag is not None: - coption_bag = option_bag.copy() - cconfig_bag = coption_bag.config_bag.copy() - cconfig_bag.context = child - coption_bag.config_bag = cconfig_bag + if subconfig is not None: + parent_subconfig = subconfig.change_context(child) else: - coption_bag = None + parent_subconfig = None child.reset_cache( - coption_bag, + parent_subconfig, resetted_opts=copy(resetted_opts), ) def set_value( self, - option_bag, + subconfig, value, only_config=False, ): """Setattr not in current KernelGroupConfig, but in each children""" ret = [] for child in self._impl_children: - cconfig_bag = option_bag.config_bag.copy() + cconfig_bag = subconfig.config_bag.copy() cconfig_bag.context = child if isinstance(child, KernelGroupConfig): ret.extend( child.set_value( - option_bag, + subconfig, value, only_config=only_config, ) ) else: settings = child.get_settings() - properties = settings.get_context_properties(child.properties_cache) + properties = settings.get_context_properties() permissives = settings.get_context_permissives() cconfig_bag.properties = properties cconfig_bag.permissives = permissives try: # GROUP - coption_bag = child.get_sub_option_bag( + coption_bag = child.get_sub_config( cconfig_bag, - option_bag.path, - option_bag.index, - False, + subconfig.path, + subconfig.index, + validate_properties=False, ) child.set_value( coption_bag, @@ -1323,7 +1371,7 @@ class KernelGroupConfig(_CommonConfig): # pylint: disable=protected-access ret.append( PropertiesOptionError( - err._option_bag, + err._subconfig, err.proptype, err._settings, err._opt_type, @@ -1386,7 +1434,7 @@ class KernelGroupConfig(_CommonConfig): cconfig_bag.context = child if cconfig_bag.properties is None: settings = child.get_settings() - properties = settings.get_context_properties(child.properties_cache) + properties = settings.get_context_properties() permissives = settings.get_context_permissives() cconfig_bag.properties = properties cconfig_bag.permissives = permissives @@ -1420,6 +1468,7 @@ class KernelGroupConfig(_CommonConfig): def reset( self, path: str, + only_children: bool, config_bag: ConfigBag, ) -> None: """reset value for specified path""" @@ -1428,19 +1477,19 @@ class KernelGroupConfig(_CommonConfig): cconfig_bag = config_bag.copy() cconfig_bag.context = child settings = child.get_settings() - properties = settings.get_context_properties(child.properties_cache) + properties = settings.get_context_properties() permissives = settings.get_context_permissives() cconfig_bag.properties = properties cconfig_bag.permissives = permissives cconfig_bag.remove_validation() # GROUP - option_bag = child.get_sub_option_bag( + subconfig = child.get_sub_config( cconfig_bag, path, None, - False, - )[-1] - child.get_values().reset(option_bag) + validate_properties=False, + ) + child.get_values().reset(subconfig) def getconfig( self, @@ -1495,7 +1544,7 @@ class KernelMixConfig(KernelGroupConfig): def set_value( self, - option_bag, + subconfig, value, only_config=False, force_default=False, @@ -1526,10 +1575,10 @@ class KernelMixConfig(KernelGroupConfig): ) ) for child in self._impl_children: - cconfig_bag = option_bag.config_bag.copy() + cconfig_bag = subconfig.config_bag.copy() cconfig_bag.context = child settings = child.get_settings() - properties = settings.get_context_properties(child.properties_cache) + properties = settings.get_context_properties() cconfig_bag.properties = properties cconfig_bag.permissives = settings.get_context_permissives() try: @@ -1541,14 +1590,14 @@ class KernelMixConfig(KernelGroupConfig): not force_default and not force_default_if_same ) # MIX - moption_bag = obj.get_sub_option_bag( + moption_bag = obj.get_sub_config( cconfig_bag, - option_bag.path, - option_bag.index, - validate_properties, - )[-1] + subconfig.path, + subconfig.index, + validate_properties=validate_properties, + ) if force_default_if_same: - if not child.get_values().hasvalue(option_bag.path): + if not child.get_values().hasvalue(subconfig.path, index=subconfig.index): child_value = undefined else: child_value = child.get_value(moption_bag) @@ -1568,7 +1617,7 @@ class KernelMixConfig(KernelGroupConfig): # pylint: disable=protected-access ret.append( PropertiesOptionError( - err._option_bag, + err._subconfig, err.proptype, err._settings, err._opt_type, @@ -1581,12 +1630,12 @@ class KernelMixConfig(KernelGroupConfig): try: # MIX - moption_bag = self.get_sub_option_bag( - option_bag.config_bag, - option_bag.path, - option_bag.index, - not only_config, - )[-1] + moption_bag = self.get_sub_config( + subconfig.config_bag, + subconfig.path, + subconfig.index, + validate_properties=not only_config, + ) if only_config: ret = super().set_value( moption_bag, @@ -1615,37 +1664,37 @@ class KernelMixConfig(KernelGroupConfig): rconfig_bag.remove_validation() if self.impl_type == "meta": # MIX - option_bag = self.get_sub_option_bag( + subconfig = self.get_sub_config( config_bag, path, None, - True, - )[-1] + validate_properties=True, + ) elif not only_children: try: # MIX - option_bag = self.get_sub_option_bag( + subconfig = self.get_sub_config( rconfig_bag, path, None, - True, - )[-1] + validate_properties=True, + ) except AttributeError: only_children = True for child in self._impl_children: rconfig_bag.context = child try: if self.impl_type == "meta": - moption_bag = option_bag + moption_bag = subconfig moption_bag.config_bag = rconfig_bag else: # MIX - moption_bag = child.get_sub_option_bag( + moption_bag = child.get_sub_config( rconfig_bag, path, None, - True, - )[-1] + validate_properties=True, + ) child.get_values().reset(moption_bag) except AttributeError: pass @@ -1656,8 +1705,8 @@ class KernelMixConfig(KernelGroupConfig): rconfig_bag, ) if not only_children: - option_bag.config_bag = config_bag - self.get_values().reset(option_bag) + subconfig.config_bag = config_bag + self.get_values().reset(subconfig) def new_config( self, diff --git a/tiramisu/error.py b/tiramisu/error.py index fda0d4b..22155ae 100644 --- a/tiramisu/error.py +++ b/tiramisu/error.py @@ -249,19 +249,19 @@ class LeadershipError(Exception): option = subconfig.option self.display_name = option.impl_get_display_name(subconfig, with_quote=True) self.code = code - if prop: + if prop is not None: self.prop = prop - if index: + if index is not None: self.index = index - if length: + if length is not None: self.length = length - if callback: + if callback is not None: self.callback = callback - if args: + if args is not None: self.args = args - if kwargs: + if kwargs is not None: self.kwargs = kwargs - if ret: + if ret is not None: self.ret = ret def __str__(self): @@ -310,6 +310,8 @@ class _CommonError: self.display_type = display_type self.opt = weakref.ref(opt) self.name = opt.impl_get_display_name(subconfig, with_quote=True) + if subconfig: + self.path = subconfig.path self.err_msg = err_msg self.index = index super().__init__(self.err_msg) @@ -394,6 +396,12 @@ class CancelParam(Exception): return False +class ValueErrorIndexes(ValueError): + def __init__(self, msg, indexes): + super().__init__(msg) + self.indexes = indexes + + class Errors: @staticmethod def raise_carry_out_calculation_error( diff --git a/tiramisu/locale/fr/LC_MESSAGES/tiramisu.mo b/tiramisu/locale/fr/LC_MESSAGES/tiramisu.mo index 665b5e8..dae84d5 100644 Binary files a/tiramisu/locale/fr/LC_MESSAGES/tiramisu.mo and b/tiramisu/locale/fr/LC_MESSAGES/tiramisu.mo differ diff --git a/tiramisu/option/dynoptiondescription.py b/tiramisu/option/dynoptiondescription.py index d840db9..734cd69 100644 --- a/tiramisu/option/dynoptiondescription.py +++ b/tiramisu/option/dynoptiondescription.py @@ -145,7 +145,7 @@ class DynOptionDescription(OptionDescription): ) else: values_.append(val) - if __debug__ and len(values_) > len(set(values_)): + if __debug__ and "demoting_error_warning" not in subconfig.config_bag.properties and len(values_) > len(set(values_)): raise ValueError( _( 'DynOptionDescription "{0}" identifiers return a list with same values "{1}"' diff --git a/tiramisu/option/option.py b/tiramisu/option/option.py index e7ed6e1..7c574d6 100644 --- a/tiramisu/option/option.py +++ b/tiramisu/option/option.py @@ -281,17 +281,14 @@ class Option(BaseOption): force_index = None is_warnings_only = getattr(self, "_warnings_only", False) - def _is_not_unique(value): - # if set(value) has not same length than value + def _is_not_unique(current_value, values): + if current_value is None: + return if not subconfig or not check_error or "unique" not in subconfig.properties: return - lvalue = [val for val in value if val is not None] - if len(set(lvalue)) == len(lvalue): - return - for idx, val in enumerate(value): - if val not in value[idx + 1 :]: - continue - raise ValueError(_('the value "{}" is not unique' "").format(val)) + indexes = [index for index, value in enumerate(values) if value == current_value] + if len(indexes) > 1: + raise ValueError(_('the value "{}" is not unique' "").format(current_value)) def calculation_validator( val, @@ -394,80 +391,100 @@ class Option(BaseOption): _index, ) - val = value err_index = force_index - try: - if not self.impl_is_multi(): + ret = True + if not self.impl_is_multi(): + try: do_validation( - val, + value, None, ) - elif force_index is not None: - if self.impl_is_submulti(): - if not isinstance(value, list): - raise ValueError(_("which must be a list")) - for val in value: + except ValueError as err: + self.validate_parse_error(value, err_index, err, subconfig) + ret = False + elif force_index is not None: + if self.impl_is_submulti(): + if not isinstance(value, list): + raise ValueError(_("which must be a list")) + for val in value: + try: do_validation( val, force_index, ) - _is_not_unique(value) - else: + _is_not_unique(val, value) + except ValueError as err: + self.validate_parse_error(val, err_index, err, subconfig) + ret = False + else: + try: do_validation( - val, + value, force_index, ) - elif isinstance(value, Calculation) and not subconfig: - pass - elif self.impl_is_submulti(): - for err_index, lval in enumerate(value): - if isinstance(lval, Calculation): - continue - if not isinstance(lval, list): - raise ValueError( - _('which "{}" must be a list of list' "").format(lval) - ) - for val in lval: + except ValueError as err: + self.validate_parse_error(value, err_index, err, subconfig) + ret = False + elif isinstance(value, Calculation) and not subconfig: + pass + elif self.impl_is_submulti(): + for err_index, lval in enumerate(value): + if isinstance(lval, Calculation): + continue + if not isinstance(lval, list): + raise ValueError( + _('which "{}" must be a list of list' "").format(lval) + ) + for val in lval: + try: do_validation(val, err_index) - _is_not_unique(lval) - elif not isinstance(value, list): - raise ValueError(_("which must be a list")) - else: - # FIXME suboptimal, not several time for whole=True! - for err_index, val in enumerate(value): + _is_not_unique(val, lval) + except ValueError as err: + self.validate_parse_error(val, err_index, err, subconfig) + ret = False + elif not isinstance(value, list): + raise ValueError(_("which must be a list")) + else: + # FIXME suboptimal, not several time for whole=True! + for err_index, val in enumerate(value): + try: do_validation( val, err_index, ) - _is_not_unique(value) - except ValueError as err: - if ( - not subconfig - or "demoting_error_warning" not in subconfig.config_bag.properties - ): - raise ValueOptionError( - subconfig=subconfig, - val=val, - display_type=_(self.get_type()), - opt=self, - err_msg=str(err), - index=err_index, - ) from err - warnings.warn_explicit( - ValueErrorWarning( - subconfig=subconfig, - val=val, - display_type=_(self.get_type()), - opt=self, - err_msg=str(err), - index=err_index, - ), - ValueErrorWarning, - self.__class__.__name__, - 0, - ) - return False - return True + _is_not_unique(val, value) + except ValueError as err: + self.validate_parse_error(val, err_index, err, subconfig) + ret = False +# return False + return ret + + def validate_parse_error(self, val, index, err, subconfig): + if ( + not subconfig + or "demoting_error_warning" not in subconfig.config_bag.properties + ): + raise ValueOptionError( + subconfig=subconfig, + val=val, + display_type=_(self.get_type()), + opt=self, + err_msg=str(err), + index=index, + ) from err + warnings.warn_explicit( + ValueErrorWarning( + subconfig=subconfig, + val=val, + display_type=_(self.get_type()), + opt=self, + err_msg=str(err), + index=index, + ), + ValueErrorWarning, + self.__class__.__name__, + 0, + ) def validate_with_option( self, diff --git a/tiramisu/setting.py b/tiramisu/setting.py index 1c163b8..fffaa6d 100644 --- a/tiramisu/setting.py +++ b/tiramisu/setting.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- "sets the options of the configuration objects Config object itself" -# Copyright (C) 2012-2024 Team tiramisu (see AUTHORS for all contributors) +# Copyright (C) 2012-2025 Team tiramisu (see AUTHORS for all contributors) # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by the diff --git a/tiramisu/value.py b/tiramisu/value.py index 9ded876..752571e 100644 --- a/tiramisu/value.py +++ b/tiramisu/value.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- "takes care of the option's values and multi values" -# Copyright (C) 2013-2024 Team tiramisu (see AUTHORS for all contributors) +# Copyright (C) 2013-2025 Team tiramisu (see AUTHORS for all contributors) # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by the @@ -189,10 +189,9 @@ class Values: if subconfig.config_bag.context.impl_type == "config": return True # it's a not a config, force to metaconfig only in *explicitly* set - return "force_metaconfig_on_freeze" in settings.get_stored_properties( + return "force_metaconfig_on_freeze" in settings.get_personalize_properties( subconfig.path, subconfig.index, - frozenset(), ) return False @@ -434,36 +433,28 @@ class Values: If not found, return None For follower option, return the Config where leader is modified """ - - def build_option_bag(subconfig, parent): - doption_bag = subconfig.copy() - config_bag = subconfig.config_bag.copy() - config_bag.context = parent - config_bag.unrestraint() - doption_bag.config_bag = config_bag - return doption_bag - for parent in subconfig.config_bag.context.get_parents(): - doption_bag = build_option_bag(subconfig, parent) + parent_subconfig = subconfig.change_context(parent) + parent_subconfig.config_bag.unrestraint() + parent_subconfig.properties = subconfig.properties if "force_metaconfig_on_freeze" in subconfig.properties: # remove force_metaconfig_on_freeze only if option in metaconfig # hasn't force_metaconfig_on_freeze properties - ori_properties = doption_bag.properties - settings = doption_bag.config_bag.context.get_settings() - doption_bag.properties = settings.getproperties(doption_bag) - if not self.check_force_to_metaconfig(doption_bag): - doption_bag.properties = ori_properties - { + ori_properties = parent_subconfig.properties + settings = parent_subconfig.config_bag.context.get_settings() + parent_subconfig.properties = settings.getproperties(parent_subconfig) + if not self.check_force_to_metaconfig(parent_subconfig): + parent_subconfig.properties = ori_properties - { "force_metaconfig_on_freeze" } else: - doption_bag.properties = ori_properties + parent_subconfig.properties = ori_properties parent_owner = parent.get_values().getowner( - doption_bag, - parent, + parent_subconfig, only_default=True, ) if parent_owner != owners.default: - return doption_bag + return parent_subconfig return None @@ -517,9 +508,6 @@ class Values: was present :returns: a `setting.owners.Owner` object """ - # context = subconfig.config_bag.context - # settings = context.get_settings() - # settings.validate_properties(subconfig) if ( "frozen" in subconfig.properties and "force_default_on_freeze" in subconfig.properties @@ -548,11 +536,10 @@ class Values: values = msubconfig.config_bag.context.get_values() owner = values.getowner( msubconfig, - parent, only_default=only_default, ) elif "force_metaconfig_on_freeze" in subconfig.properties: - return owners.default + owner = owners.default return owner def set_owner( @@ -749,8 +736,8 @@ class Values: if index >= length: raise IndexError( _( - "index {index} is greater than the length {length} " - "for option {subconfig.option.impl_get_display_name(with_quote=True)}" + f"index {index} is greater than the length {length} " + f"for option {subconfig.option.impl_get_display_name(subconfig, with_quote=True)}" ) ) current_value.pop(index)