3 from tiramisu.setting import groups, owners
4 from tiramisu.config import Config
5 from tiramisu.option import ChoiceOption, BoolOption, IntOption, \
6 StrOption, OptionDescription
7 from tiramisu.error import SlaveError
9 from py.test import raises
12 def make_description():
13 numero_etab = StrOption('numero_etab', "identifiant de l'établissement")
14 nom_machine = StrOption('nom_machine', "nom de la machine", default="eoleng")
15 nombre_interfaces = IntOption('nombre_interfaces', "nombre d'interfaces à activer",
17 activer_proxy_client = BoolOption('activer_proxy_client', "utiliser un proxy",
19 mode_conteneur_actif = BoolOption('mode_conteneur_actif', "le serveur est en mode conteneur",
21 adresse_serveur_ntp = StrOption('serveur_ntp', "adresse serveur ntp", multi=True)
22 time_zone = ChoiceOption('time_zone', 'fuseau horaire du serveur',
23 ('Paris', 'Londres'), 'Paris')
25 ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé")
26 netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau")
28 master = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
29 interface1 = OptionDescription('interface1', '', [master])
30 interface1.optimpl_set_group_type(groups.family)
32 general = OptionDescription('general', '', [numero_etab, nom_machine,
33 nombre_interfaces, activer_proxy_client,
34 mode_conteneur_actif, adresse_serveur_ntp,
36 general.optimpl_set_group_type(groups.family)
37 creole = OptionDescription('creole', 'first tiramisu configuration', [general, interface1])
38 descr = OptionDescription('baseconfig', 'baseconifgdescr', [creole])
42 def test_base_config():
43 descr = make_description()
44 config = Config(descr)
45 assert config.creole.general.activer_proxy_client is False
46 assert config.creole.general.nom_machine == "eoleng"
47 assert config.find_first(byname='nom_machine', type_='value') == "eoleng"
48 result = {'general.numero_etab': None, 'general.nombre_interfaces': 1,
49 'general.serveur_ntp': [], 'interface1.ip_admin_eth0.ip_admin_eth0': None,
50 'general.mode_conteneur_actif': False, 'general.time_zone': 'Paris',
51 'interface1.ip_admin_eth0.netmask_admin_eth0': None, 'general.nom_machine':
52 'eoleng', 'general.activer_proxy_client': False}
53 assert config.creole.make_dict() == result
54 result = {'serveur_ntp': [], 'mode_conteneur_actif': False,
55 'ip_admin_eth0': None, 'time_zone': 'Paris', 'numero_etab': None,
56 'netmask_admin_eth0': None, 'nom_machine': 'eoleng', 'activer_proxy_client':
57 False, 'nombre_interfaces': 1}
58 assert config.creole.make_dict(flatten=True) == result
61 def test_make_dict_filter():
62 descr = make_description()
63 config = Config(descr)
64 result = {'general.numero_etab': None, 'general.nombre_interfaces': 1,
65 'general.serveur_ntp': [], 'general.mode_conteneur_actif': False,
66 'general.time_zone': 'Paris', 'general.nom_machine': 'eoleng',
67 'general.activer_proxy_client': False}
68 assert config.creole.make_dict(withoption='numero_etab') == result
69 raises(AttributeError, "config.creole.make_dict(withoption='numero_etab', withvalue='toto')")
70 assert config.creole.make_dict(withoption='numero_etab', withvalue=None) == result
73 def test_get_group_type():
74 descr = make_description()
75 config = Config(descr)
76 grp = config.unwrap_from_path('creole.general')
77 assert grp.optimpl_get_group_type() == groups.family
78 assert grp.optimpl_get_group_type() == 'family'
79 assert isinstance(grp.optimpl_get_group_type(), groups.GroupType)
80 raises(TypeError, 'grp.optimpl_set_group_type(groups.default)')
83 def test_iter_on_groups():
84 descr = make_description()
85 config = Config(descr)
86 result = list(config.creole.iter_groups(group_type=groups.family))
87 group_names = [res[0] for res in result]
88 assert group_names == ['general', 'interface1']
91 def test_iter_on_empty_group():
92 config = Config(OptionDescription("name", "descr", []))
93 result = list(config.iter_groups())
95 for i in config.iter_groups():
99 assert [] == list(config)
102 def test_groups_with_master():
103 ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
104 netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
105 interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
106 interface1.optimpl_set_group_type(groups.master)
107 assert interface1.optimpl_get_group_type() == groups.master
110 def test_groups_with_master_in_config():
111 ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
112 netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
113 interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
114 interface1.optimpl_set_group_type(groups.master)
116 assert interface1.optimpl_get_group_type() == groups.master
119 def test_allowed_groups():
120 ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
121 netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
122 interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
123 raises(ValueError, "interface1.optimpl_set_group_type('toto')")
126 def test_master_not_valid_name():
127 ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
128 netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
129 invalid_group = OptionDescription('interface1', '', [ip_admin_eth0, netmask_admin_eth0])
130 raises(ValueError, "invalid_group.optimpl_set_group_type(groups.master)")
133 def test_sub_group_in_master_group():
134 ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
135 netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
136 subgroup = OptionDescription("subgroup", '', [])
137 invalid_group = OptionDescription('ip_admin_eth0', '', [subgroup, ip_admin_eth0, netmask_admin_eth0])
138 raises(ValueError, "invalid_group.optimpl_set_group_type(groups.master)")
141 def test_group_always_has_multis():
142 ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
143 netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau")
144 group = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
145 raises(ValueError, "group.optimpl_set_group_type(groups.master)")
148 #____________________________________________________________
149 def test_values_with_master_and_slaves():
150 ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
151 netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
152 interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
153 interface1.optimpl_set_group_type(groups.master)
154 maconfig = OptionDescription('toto', '', [interface1])
155 cfg = Config(maconfig)
156 owner = cfg._cfgimpl_context._cfgimpl_settings.getowner()
157 assert interface1.optimpl_get_group_type() == groups.master
158 assert cfg.getowner("ip_admin_eth0.ip_admin_eth0") == owners.default
159 assert cfg.getowner("ip_admin_eth0.netmask_admin_eth0") == owners.default
160 assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
161 cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
162 assert cfg.ip_admin_eth0.ip_admin_eth0 == ["192.168.230.145"]
163 assert cfg.ip_admin_eth0.netmask_admin_eth0 == [None]
164 assert cfg.getowner("ip_admin_eth0.ip_admin_eth0") == owner
165 assert cfg.getowner("ip_admin_eth0.netmask_admin_eth0") == owners.default
168 def test_reset_values_with_master_and_slaves():
169 ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
170 netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
171 interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
172 interface1.optimpl_set_group_type(groups.master)
173 maconfig = OptionDescription('toto', '', [interface1])
174 cfg = Config(maconfig)
175 owner = cfg._cfgimpl_context._cfgimpl_settings.getowner()
176 assert interface1.optimpl_get_group_type() == groups.master
177 assert cfg.getowner("ip_admin_eth0.ip_admin_eth0") == owners.default
178 assert cfg.getowner("ip_admin_eth0.netmask_admin_eth0") == owners.default
179 cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
180 assert cfg.getowner("ip_admin_eth0.ip_admin_eth0") == owner
181 assert cfg.getowner("ip_admin_eth0.netmask_admin_eth0") == owners.default
182 del(cfg.ip_admin_eth0.ip_admin_eth0)
183 assert cfg.getowner("ip_admin_eth0.ip_admin_eth0") == owners.default
184 assert cfg.getowner("ip_admin_eth0.netmask_admin_eth0") == owners.default
185 assert cfg.ip_admin_eth0.ip_admin_eth0 == []
186 assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
189 def test_values_with_master_and_slaves_slave():
190 ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
191 netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
192 interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
193 interface1.optimpl_set_group_type(groups.master)
194 maconfig = OptionDescription('toto', '', [interface1])
195 cfg = Config(maconfig)
196 assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
197 raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']")
198 cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
199 cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']
200 cfg.ip_admin_eth0.netmask_admin_eth0[0] = '255.255.255.0'
201 raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']")
202 raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = []")
203 del(cfg.ip_admin_eth0.netmask_admin_eth0)
204 cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']
205 cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
206 assert cfg.ip_admin_eth0.netmask_admin_eth0 == ['255.255.255.0', None]
207 cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']
208 raises(SlaveError, 'cfg.ip_admin_eth0.netmask_admin_eth0.pop(1)')
211 def test_values_with_master_and_slaves_master():
212 ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
213 netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
214 interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
215 interface1.optimpl_set_group_type(groups.master)
216 maconfig = OptionDescription('toto', '', [interface1])
217 cfg = Config(maconfig)
218 cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
219 cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145"]
220 cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145", "192.168.230.145"]
221 cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']
222 raises(SlaveError, 'cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145"]')
223 cfg.ip_admin_eth0.ip_admin_eth0.pop(1)
224 assert cfg.ip_admin_eth0.ip_admin_eth0 == ["192.168.230.145"]