b6492073ab453c95f8a2483d6173cfc3f985501a
[tiramisu.git] / test / test_parsing_group.py
1 # coding: utf-8
2 import autopath
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
8
9 from py.test import raises
10
11
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",
16                                   default=1)
17     activer_proxy_client = BoolOption('activer_proxy_client', "utiliser un proxy",
18                                       default=False)
19     mode_conteneur_actif = BoolOption('mode_conteneur_actif', "le serveur est en mode conteneur",
20                                       default=False)
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')
24
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")
27
28     master = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
29     interface1 = OptionDescription('interface1', '', [master])
30     interface1.impl_set_group_type(groups.family)
31
32     general = OptionDescription('general', '', [numero_etab, nom_machine,
33                                 nombre_interfaces, activer_proxy_client,
34                                 mode_conteneur_actif, adresse_serveur_ntp,
35                                 time_zone])
36     general.impl_set_group_type(groups.family)
37     creole = OptionDescription('creole', 'first tiramisu configuration', [general, interface1])
38     descr = OptionDescription('baseconfig', 'baseconifgdescr', [creole])
39     return descr
40
41
42 def test_base_config():
43     descr = make_description()
44     config = Config(descr)
45     config.read_write()
46     assert config.creole.general.activer_proxy_client is False
47     assert config.creole.general.nom_machine == "eoleng"
48     assert config.find_first(byname='nom_machine', type_='value') == "eoleng"
49     result = {'general.numero_etab': None, 'general.nombre_interfaces': 1,
50               'general.serveur_ntp': [], 'interface1.ip_admin_eth0.ip_admin_eth0': None,
51               'general.mode_conteneur_actif': False, 'general.time_zone': 'Paris',
52               'interface1.ip_admin_eth0.netmask_admin_eth0': None, 'general.nom_machine':
53               'eoleng', 'general.activer_proxy_client': False}
54     assert config.creole.make_dict() == result
55     result = {'serveur_ntp': [], 'mode_conteneur_actif': False,
56               'ip_admin_eth0': None, 'time_zone': 'Paris', 'numero_etab': None,
57               'netmask_admin_eth0': None, 'nom_machine': 'eoleng', 'activer_proxy_client':
58               False, 'nombre_interfaces': 1}
59     assert config.creole.make_dict(flatten=True) == result
60
61
62 def test_make_dict_filter():
63     descr = make_description()
64     config = Config(descr)
65     config.read_write()
66     result = {'general.numero_etab': None, 'general.nombre_interfaces': 1,
67               'general.serveur_ntp': [], 'general.mode_conteneur_actif': False,
68               'general.time_zone': 'Paris', 'general.nom_machine': 'eoleng',
69               'general.activer_proxy_client': False}
70     assert config.creole.make_dict(withoption='numero_etab') == result
71     raises(AttributeError, "config.creole.make_dict(withoption='numero_etab', withvalue='toto')")
72     assert config.creole.make_dict(withoption='numero_etab', withvalue=None) == result
73
74
75 def test_get_group_type():
76     descr = make_description()
77     config = Config(descr)
78     config.read_write()
79     grp = config.unwrap_from_path('creole.general')
80     assert grp.impl_get_group_type() == groups.family
81     assert grp.impl_get_group_type() == 'family'
82     assert isinstance(grp.impl_get_group_type(), groups.GroupType)
83     raises(TypeError, 'grp.impl_set_group_type(groups.default)')
84
85
86 def test_iter_on_groups():
87     descr = make_description()
88     config = Config(descr)
89     config.read_write()
90     result = list(config.creole.iter_groups(group_type=groups.family))
91     group_names = [res[0] for res in result]
92     assert group_names == ['general', 'interface1']
93
94
95 def test_iter_on_empty_group():
96     config = Config(OptionDescription("name", "descr", []))
97     config.read_write()
98     result = list(config.iter_groups())
99     assert result == []
100     for i in config.iter_groups():
101         pass
102     for i in config:
103         pass
104     assert [] == list(config)
105
106
107 def test_iter_not_group():
108     config = Config(OptionDescription("name", "descr", []))
109     config.read_write()
110     raises(TypeError, "list(config.iter_groups(group_type='family'))")
111
112
113
114 def test_groups_with_master():
115     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
116     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
117     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
118     interface1.impl_set_group_type(groups.master)
119     assert interface1.impl_get_group_type() == groups.master
120
121
122 def test_groups_with_master_in_config():
123     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
124     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
125     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
126     interface1.impl_set_group_type(groups.master)
127     Config(interface1)
128     assert interface1.impl_get_group_type() == groups.master
129
130
131 def test_allowed_groups():
132     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
133     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
134     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
135     raises(ValueError, "interface1.impl_set_group_type('toto')")
136
137
138 def test_master_not_valid_name():
139     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
140     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
141     invalid_group = OptionDescription('interface1', '', [ip_admin_eth0, netmask_admin_eth0])
142     raises(ValueError, "invalid_group.impl_set_group_type(groups.master)")
143
144
145 def test_sub_group_in_master_group():
146     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
147     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
148     subgroup = OptionDescription("subgroup", '', [])
149     invalid_group = OptionDescription('ip_admin_eth0', '', [subgroup, ip_admin_eth0, netmask_admin_eth0])
150     raises(ValueError, "invalid_group.impl_set_group_type(groups.master)")
151
152
153 def test_group_always_has_multis():
154     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
155     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau")
156     group = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
157     raises(ValueError, "group.impl_set_group_type(groups.master)")
158
159
160 #____________________________________________________________
161 def test_values_with_master_and_slaves():
162     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
163     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
164     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
165     interface1.impl_set_group_type(groups.master)
166     maconfig = OptionDescription('toto', '', [interface1])
167     cfg = Config(maconfig)
168     cfg.read_write()
169     owner = cfg.cfgimpl_get_settings().getowner()
170     assert interface1.impl_get_group_type() == groups.master
171     assert cfg.getowner("ip_admin_eth0.ip_admin_eth0") == owners.default
172     assert cfg.getowner("ip_admin_eth0.netmask_admin_eth0") == owners.default
173     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
174     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
175     assert cfg.ip_admin_eth0.ip_admin_eth0 == ["192.168.230.145"]
176     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [None]
177     assert cfg.getowner("ip_admin_eth0.ip_admin_eth0") == owner
178     assert cfg.getowner("ip_admin_eth0.netmask_admin_eth0") == owners.default
179
180
181 def test_reset_values_with_master_and_slaves():
182     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
183     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
184     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
185     interface1.impl_set_group_type(groups.master)
186     maconfig = OptionDescription('toto', '', [interface1])
187     cfg = Config(maconfig)
188     cfg.read_write()
189     owner = cfg.cfgimpl_get_settings().getowner()
190     assert interface1.impl_get_group_type() == groups.master
191     assert cfg.getowner("ip_admin_eth0.ip_admin_eth0") == owners.default
192     assert cfg.getowner("ip_admin_eth0.netmask_admin_eth0") == owners.default
193     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
194     assert cfg.getowner("ip_admin_eth0.ip_admin_eth0") == owner
195     assert cfg.getowner("ip_admin_eth0.netmask_admin_eth0") == owners.default
196     del(cfg.ip_admin_eth0.ip_admin_eth0)
197     assert cfg.getowner("ip_admin_eth0.ip_admin_eth0") == owners.default
198     assert cfg.getowner("ip_admin_eth0.netmask_admin_eth0") == owners.default
199     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
200     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
201
202
203 def test_values_with_master_and_slaves_slave():
204     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
205     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
206     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
207     interface1.impl_set_group_type(groups.master)
208     maconfig = OptionDescription('toto', '', [interface1])
209     cfg = Config(maconfig)
210     cfg.read_write()
211     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
212     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']")
213     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
214     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']
215     cfg.ip_admin_eth0.netmask_admin_eth0[0] = '255.255.255.0'
216     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']")
217     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = []")
218     del(cfg.ip_admin_eth0.netmask_admin_eth0)
219     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']
220     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
221     assert cfg.ip_admin_eth0.netmask_admin_eth0 == ['255.255.255.0', None]
222     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']
223     raises(SlaveError, 'cfg.ip_admin_eth0.netmask_admin_eth0.pop(1)')
224
225
226 def test_values_with_master_and_slaves_master():
227     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
228     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
229     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
230     interface1.impl_set_group_type(groups.master)
231     maconfig = OptionDescription('toto', '', [interface1])
232     cfg = Config(maconfig)
233     cfg.read_write()
234     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
235     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145"]
236     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145", "192.168.230.145"]
237     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']
238     raises(SlaveError, 'cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145"]')
239     assert cfg.ip_admin_eth0.netmask_admin_eth0 == ['255.255.255.0', '255.255.255.0']
240     cfg.ip_admin_eth0.ip_admin_eth0.pop(1)
241     assert cfg.ip_admin_eth0.ip_admin_eth0 == ["192.168.230.145"]
242     assert cfg.ip_admin_eth0.netmask_admin_eth0 == ['255.255.255.0']
243     del(cfg.ip_admin_eth0.ip_admin_eth0)
244     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
245     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
246
247
248 def test_values_with_master_owner():
249     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
250     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
251     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
252     interface1.impl_set_group_type(groups.master)
253     maconfig = OptionDescription('toto', '', [interface1])
254     cfg = Config(maconfig)
255     cfg.read_write()
256     owner = cfg.cfgimpl_get_settings().getowner()
257     assert cfg.getowner("ip_admin_eth0.ip_admin_eth0") == owners.default
258     assert cfg.getowner("ip_admin_eth0.netmask_admin_eth0") == owners.default
259     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
260     assert cfg.getowner("ip_admin_eth0.ip_admin_eth0") == owner
261     assert cfg.getowner("ip_admin_eth0.netmask_admin_eth0") == owners.default
262     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
263     assert cfg.getowner("ip_admin_eth0.ip_admin_eth0") == owner
264     assert cfg.getowner("ip_admin_eth0.netmask_admin_eth0") == owners.default
265
266
267 def test_values_with_master_disabled():
268     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
269     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
270     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
271     interface1.impl_set_group_type(groups.master)
272     maconfig = OptionDescription('toto', '', [interface1])
273     cfg = Config(maconfig)
274     cfg.read_write()
275     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
276     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
277     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
278     cfg.ip_admin_eth0.netmask_admin_eth0 = ["192.168.230.145"]
279     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
280     del(cfg.ip_admin_eth0.netmask_admin_eth0)
281     cfg.cfgimpl_get_settings()[netmask_admin_eth0].append('disabled')
282     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
283     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
284
285     #delete with value in disabled var
286     cfg.cfgimpl_get_settings()[netmask_admin_eth0].remove('disabled')
287     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
288     cfg.ip_admin_eth0.netmask_admin_eth0 = ["192.168.230.145"]
289     cfg.cfgimpl_get_settings()[netmask_admin_eth0].append('disabled')
290     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
291
292     #append with value in disabled var
293     cfg.cfgimpl_get_settings()[netmask_admin_eth0].remove('disabled')
294     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
295     cfg.ip_admin_eth0.netmask_admin_eth0 = ["192.168.230.145"]
296     cfg.cfgimpl_get_settings()[netmask_admin_eth0].append('disabled')
297     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.230.43')
298
299
300 def test_multi_insert():
301     var = StrOption('var', '', ['ok'], multi=True)
302     od = OptionDescription('od', '', [var])
303     c = Config(od)
304     c.read_write()
305     assert c.var == ['ok']
306     assert c.getowner("var") == owners.default
307     c.var.insert(0, 'nok')
308     assert c.var == ['nok', 'ok']
309     assert c.getowner("var") != owners.default
310
311
312 def test_multi_insert_master():
313     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
314     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
315     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
316     interface1.impl_set_group_type(groups.master)
317     maconfig = OptionDescription('toto', '', [interface1])
318     cfg = Config(maconfig)
319     cfg.read_write()
320     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.insert(0, 'nok')")
321     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.insert(0, 'nok')")
322
323
324 def test_multi_sort():
325     var = StrOption('var', '', ['ok', 'nok'], multi=True)
326     od = OptionDescription('od', '', [var])
327     c = Config(od)
328     c.read_write()
329     assert c.var == ['ok', 'nok']
330     assert c.getowner("var") == owners.default
331     c.var.sort()
332     assert c.var == ['nok', 'ok']
333     assert c.getowner("var") != owners.default
334
335
336 def test_multi_sort_master():
337     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
338     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
339     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
340     interface1.impl_set_group_type(groups.master)
341     maconfig = OptionDescription('toto', '', [interface1])
342     cfg = Config(maconfig)
343     cfg.read_write()
344     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.sort()")
345     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.sort()")
346
347
348 def test_multi_reverse():
349     var = StrOption('var', '', ['ok', 'nok'], multi=True)
350     od = OptionDescription('od', '', [var])
351     c = Config(od)
352     c.read_write()
353     assert c.var == ['ok', 'nok']
354     assert c.getowner("var") == owners.default
355     c.var.reverse()
356     assert c.var == ['nok', 'ok']
357     assert c.getowner("var") != owners.default
358
359
360 def test_multi_reverse_master():
361     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
362     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
363     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
364     interface1.impl_set_group_type(groups.master)
365     maconfig = OptionDescription('toto', '', [interface1])
366     cfg = Config(maconfig)
367     cfg.read_write()
368     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.reverse()")
369     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.reverse()")
370
371
372 def test_multi_extend():
373     var = StrOption('var', '', ['ok', 'nok'], multi=True)
374     od = OptionDescription('od', '', [var])
375     c = Config(od)
376     c.read_write()
377     assert c.var == ['ok', 'nok']
378     assert c.getowner("var") == owners.default
379     c.var.extend(['pok'])
380     assert c.var == ['ok', 'nok', 'pok']
381     assert c.getowner("var") != owners.default
382
383
384 def test_multi_extend_master():
385     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
386     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
387     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
388     interface1.impl_set_group_type(groups.master)
389     maconfig = OptionDescription('toto', '', [interface1])
390     cfg = Config(maconfig)
391     cfg.read_write()
392     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.extend(['ok'])")
393     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.extend(['ok'])")