c091aa0470dc50e90b573fcda7a6b1b2486dac5f
[tiramisu.git] / test / test_parsing_group.py
1 # coding: utf-8
2 from autopath import do_autopath
3 do_autopath()
4
5 from tiramisu.setting import groups, owners
6 from tiramisu.config import Config
7 from tiramisu.option import ChoiceOption, BoolOption, IntOption, \
8     StrOption, OptionDescription
9 from tiramisu.error import SlaveError, PropertiesOptionError
10
11 from py.test import raises
12
13
14 def make_description():
15     numero_etab = StrOption('numero_etab', "identifiant de l'établissement")
16     nom_machine = StrOption('nom_machine', "nom de la machine", default="eoleng")
17     nombre_interfaces = IntOption('nombre_interfaces', "nombre d'interfaces à activer",
18                                   default=1)
19     activer_proxy_client = BoolOption('activer_proxy_client', "utiliser un proxy",
20                                       default=False)
21     mode_conteneur_actif = BoolOption('mode_conteneur_actif', "le serveur est en mode conteneur",
22                                       default=False)
23     mode_conteneur_actif2 = BoolOption('mode_conteneur_actif2', "le serveur est en mode conteneur2",
24                                        default=False, properties=('hidden',))
25
26     adresse_serveur_ntp = StrOption('serveur_ntp', "adresse serveur ntp", multi=True)
27     time_zone = ChoiceOption('time_zone', 'fuseau horaire du serveur',
28                              ('Paris', 'Londres'), 'Paris')
29
30     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé")
31     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau")
32
33     master = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
34     interface1 = OptionDescription('interface1', '', [master])
35     interface1.impl_set_group_type(groups.family)
36
37     general = OptionDescription('general', '', [numero_etab, nom_machine,
38                                 nombre_interfaces, activer_proxy_client,
39                                 mode_conteneur_actif, mode_conteneur_actif2,
40                                 adresse_serveur_ntp, time_zone])
41     general.impl_set_group_type(groups.family)
42     new = OptionDescription('new', '', [], properties=('hidden',))
43     new.impl_set_group_type(groups.family)
44     creole = OptionDescription('creole', 'first tiramisu configuration', [general, interface1, new])
45     descr = OptionDescription('baseconfig', 'baseconifgdescr', [creole])
46     return descr
47
48
49 def test_base_config():
50     descr = make_description()
51     config = Config(descr)
52     config.read_write()
53     assert config.creole.general.activer_proxy_client is False
54     assert config.creole.general.nom_machine == "eoleng"
55     assert config.find_first(byname='nom_machine', type_='value') == "eoleng"
56     result = {'general.numero_etab': None, 'general.nombre_interfaces': 1,
57               'general.serveur_ntp': [], 'interface1.ip_admin_eth0.ip_admin_eth0': None,
58               'general.mode_conteneur_actif': False, 'general.time_zone': 'Paris',
59               'interface1.ip_admin_eth0.netmask_admin_eth0': None, 'general.nom_machine':
60               'eoleng', 'general.activer_proxy_client': False}
61     assert config.creole.make_dict() == result
62     result = {'serveur_ntp': [], 'mode_conteneur_actif': False,
63               'ip_admin_eth0': None, 'time_zone': 'Paris', 'numero_etab': None,
64               'netmask_admin_eth0': None, 'nom_machine': 'eoleng', 'activer_proxy_client':
65               False, 'nombre_interfaces': 1}
66     assert config.creole.make_dict(flatten=True) == result
67
68
69 def test_make_dict_filter():
70     descr = make_description()
71     config = Config(descr)
72     config.read_write()
73     subresult = {'numero_etab': None, 'nombre_interfaces': 1,
74                  'serveur_ntp': [], 'mode_conteneur_actif': False,
75                  'time_zone': 'Paris', 'nom_machine': 'eoleng',
76                  'activer_proxy_client': False}
77     result = {}
78     for key, value in subresult.items():
79         result['general.' + key] = value
80     assert config.creole.make_dict(withoption='numero_etab') == result
81     raises(AttributeError, "config.creole.make_dict(withoption='numero_etab', withvalue='toto')")
82     assert config.creole.make_dict(withoption='numero_etab', withvalue=None) == result
83     assert config.creole.general.make_dict(withoption='numero_etab') == subresult
84
85
86 def test_get_group_type():
87     descr = make_description()
88     config = Config(descr)
89     config.read_write()
90     grp = config.unwrap_from_path('creole.general')
91     assert grp.impl_get_group_type() == groups.family
92     assert grp.impl_get_group_type() == 'family'
93     assert isinstance(grp.impl_get_group_type(), groups.GroupType)
94     raises(TypeError, 'grp.impl_set_group_type(groups.default)')
95
96
97 def test_iter_on_groups():
98     descr = make_description()
99     config = Config(descr)
100     config.read_write()
101     result = list(config.creole.iter_groups(group_type=groups.family))
102     group_names = [res[0] for res in result]
103     assert group_names == ['general', 'interface1']
104     for i in config.creole.iter_groups(group_type=groups.family):
105         #test StopIteration
106         break
107
108
109 def test_iter_on_groups_force_permissive():
110     descr = make_description()
111     config = Config(descr)
112     config.read_write()
113     config.cfgimpl_get_settings().setpermissive(('hidden',))
114     result = list(config.creole.general.__iter__(force_permissive=True))
115     group_names = [res[0] for res in result]
116     ass = ['numero_etab', 'nom_machine', 'nombre_interfaces',
117            'activer_proxy_client', 'mode_conteneur_actif',
118            'mode_conteneur_actif2', 'serveur_ntp', 'time_zone']
119     assert group_names == ass
120     group_names = [res[0] for res in config.creole.general]
121     ass.remove('mode_conteneur_actif2')
122     assert group_names == ass
123
124
125 def test_iter_group_on_groups_force_permissive():
126     descr = make_description()
127     config = Config(descr)
128     config.read_write()
129     config.cfgimpl_get_settings().setpermissive(('hidden',))
130     result = list(config.creole.iter_groups(group_type=groups.family,
131                                             force_permissive=True))
132     group_names = [res[0] for res in result]
133     assert group_names == ['general', 'interface1', 'new']
134
135
136 def test_iter_on_groups_props():
137     descr = make_description()
138     config = Config(descr)
139     config.read_write()
140     config.cfgimpl_get_settings()[descr.creole.interface1].append('disabled')
141     result = list(config.creole.iter_groups(group_type=groups.family))
142     group_names = [res[0] for res in result]
143     assert group_names == ['general']
144
145
146 def test_iter_on_empty_group():
147     config = Config(OptionDescription("name", "descr", []))
148     config.read_write()
149     result = list(config.iter_groups())
150     assert result == []
151     for i in config.iter_groups():
152         pass
153     for i in config:
154         pass
155     assert [] == list(config)
156
157
158 def test_iter_not_group():
159     config = Config(OptionDescription("name", "descr", []))
160     config.read_write()
161     raises(TypeError, "list(config.iter_groups(group_type='family'))")
162
163
164 def test_groups_with_master():
165     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
166     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
167     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
168     interface1.impl_set_group_type(groups.master)
169     assert interface1.impl_get_group_type() == groups.master
170
171
172 def test_groups_with_master_in_config():
173     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
174     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
175     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
176     interface1.impl_set_group_type(groups.master)
177     Config(interface1)
178     assert interface1.impl_get_group_type() == groups.master
179
180
181 def test_groups_with_master_hidden_in_config():
182     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True, properties=('hidden',))
183     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True, properties=('hidden',))
184     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
185     interface1.impl_set_group_type(groups.master)
186     cfg = Config(interface1)
187     cfg.read_write()
188     cfg.cfgimpl_get_settings().setpermissive(('hidden',))
189     cfg.getattr('ip_admin_eth0', force_permissive=True)
190     cfg.getattr('netmask_admin_eth0', force_permissive=True)
191     raises(PropertiesOptionError, "cfg.getattr('ip_admin_eth0')")
192     raises(PropertiesOptionError, "cfg.getattr('netmask_admin_eth0')")
193
194
195 def test_groups_with_master_hidden_in_config2():
196     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
197     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True, properties=('hidden',))
198     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
199     interface1.impl_set_group_type(groups.master)
200     cfg = Config(interface1)
201     cfg.read_write()
202     cfg.cfgimpl_get_settings().setpermissive(('hidden',))
203     cfg.getattr('ip_admin_eth0', force_permissive=True)
204     cfg.getattr('netmask_admin_eth0', force_permissive=True)
205     cfg.getattr('ip_admin_eth0')
206     raises(PropertiesOptionError, "cfg.getattr('netmask_admin_eth0')")
207     cfg.ip_admin_eth0.append('192.168.1.1')
208     assert cfg.ip_admin_eth0 == ['192.168.1.1']
209     raises(PropertiesOptionError, "cfg.netmask_admin_eth0[0]")
210     del(cfg.ip_admin_eth0)
211     assert cfg.ip_admin_eth0 == []
212     #del
213     cfg.ip_admin_eth0.append('192.168.1.1')
214     assert cfg.ip_admin_eth0 == ['192.168.1.1']
215     cfg.cfgimpl_get_settings().remove('hidden')
216     assert cfg.netmask_admin_eth0 == [None]
217     cfg.netmask_admin_eth0 = ['255.255.255.0']
218     assert cfg.netmask_admin_eth0 == ['255.255.255.0']
219     cfg.cfgimpl_get_settings().append('hidden')
220     del(cfg.ip_admin_eth0)
221     cfg.ip_admin_eth0.append('192.168.1.1')
222     cfg.cfgimpl_get_settings().remove('hidden')
223     assert cfg.netmask_admin_eth0 == [None]
224
225
226 def test_groups_with_master_hidden_in_config3():
227     #if master is hidden, slave are hidden too
228     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True, properties=('hidden',))
229     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
230     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
231     interface1.impl_set_group_type(groups.master)
232     cfg = Config(interface1)
233     cfg.read_write()
234     cfg.cfgimpl_get_settings().setpermissive(('hidden',))
235     cfg.getattr('ip_admin_eth0', force_permissive=True)
236     cfg.getattr('netmask_admin_eth0', force_permissive=True)
237     raises(PropertiesOptionError, "cfg.getattr('ip_admin_eth0')")
238     raises(PropertiesOptionError, "cfg.getattr('netmask_admin_eth0')")
239
240
241 def test_allowed_groups():
242     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
243     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
244     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
245     interface1
246     raises(ValueError, "interface1.impl_set_group_type('toto')")
247
248
249 def test_values_with_master_disabled_master():
250     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
251     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
252     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
253     interface1.impl_set_group_type(groups.master)
254     maconfig = OptionDescription('toto', '', [interface1])
255     cfg = Config(maconfig)
256     cfg.read_write()
257     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
258     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
259     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
260     cfg.ip_admin_eth0.netmask_admin_eth0 = ["192.168.230.145"]
261     del(cfg.ip_admin_eth0.netmask_admin_eth0)
262     cfg.cfgimpl_get_settings()[ip_admin_eth0].append('disabled')
263     raises(PropertiesOptionError, "cfg.ip_admin_eth0.netmask_admin_eth0[0] = '192.168.230.145'")
264
265
266 def test_master_not_valid_name():
267     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
268     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
269     invalid_group = OptionDescription('interface1', '', [ip_admin_eth0, netmask_admin_eth0])
270     invalid_group
271     raises(ValueError, "invalid_group.impl_set_group_type(groups.master)")
272
273
274 def test_sub_group_in_master_group():
275     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
276     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
277     subgroup = OptionDescription("subgroup", '', [])
278     invalid_group = OptionDescription('ip_admin_eth0', '', [subgroup, ip_admin_eth0, netmask_admin_eth0])
279     invalid_group
280     raises(ValueError, "invalid_group.impl_set_group_type(groups.master)")
281
282
283 def test_group_always_has_multis():
284     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
285     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau")
286     group = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
287     group
288     raises(ValueError, "group.impl_set_group_type(groups.master)")
289
290
291 #____________________________________________________________
292 def test_values_with_master_and_slaves():
293     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
294     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
295     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
296     interface1.impl_set_group_type(groups.master)
297     maconfig = OptionDescription('toto', '', [interface1])
298     cfg = Config(maconfig)
299     cfg.read_write()
300     owner = cfg.cfgimpl_get_settings().getowner()
301     assert interface1.impl_get_group_type() == groups.master
302     assert cfg.getowner(ip_admin_eth0) == owners.default
303     assert cfg.getowner(netmask_admin_eth0) == owners.default
304     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
305     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
306     assert cfg.ip_admin_eth0.ip_admin_eth0 == ["192.168.230.145"]
307     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [None]
308     assert cfg.getowner(ip_admin_eth0) == owner
309     assert cfg.getowner(netmask_admin_eth0) == owners.default
310     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145", "192.168.230.147"]
311     raises(SlaveError, 'cfg.ip_admin_eth0.netmask_admin_eth0.append(None)')
312     raises(SlaveError, 'cfg.ip_admin_eth0.netmask_admin_eth0.pop(0)')
313
314
315 def test_reset_values_with_master_and_slaves():
316     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
317     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
318     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
319     interface1.impl_set_group_type(groups.master)
320     maconfig = OptionDescription('toto', '', [interface1])
321     cfg = Config(maconfig)
322     cfg.read_write()
323     owner = cfg.cfgimpl_get_settings().getowner()
324     assert interface1.impl_get_group_type() == groups.master
325     assert cfg.getowner(ip_admin_eth0) == owners.default
326     assert cfg.getowner(netmask_admin_eth0) == owners.default
327     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
328     assert cfg.getowner(ip_admin_eth0) == owner
329     assert cfg.getowner(netmask_admin_eth0) == owners.default
330     del(cfg.ip_admin_eth0.ip_admin_eth0)
331     assert cfg.getowner(ip_admin_eth0) == owners.default
332     assert cfg.getowner(netmask_admin_eth0) == owners.default
333     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
334     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
335     #reset
336     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
337     cfg.cfgimpl_get_values().reset(ip_admin_eth0)
338     assert cfg.getowner(ip_admin_eth0) == owners.default
339     assert cfg.getowner(netmask_admin_eth0) == owners.default
340     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
341     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
342
343
344 def test_reset_values_with_master_and_slaves_default():
345     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True, default=['192.168.230.145'])
346     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
347     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
348     interface1.impl_set_group_type(groups.master)
349     maconfig = OptionDescription('toto', '', [interface1])
350     cfg = Config(maconfig)
351     cfg.read_write()
352     owner = cfg.cfgimpl_get_settings().getowner()
353     assert cfg.getowner(ip_admin_eth0) == owners.default
354     assert cfg.getowner(netmask_admin_eth0) == owners.default
355
356     cfg.ip_admin_eth0.ip_admin_eth0[0] = "192.168.230.146"
357     assert cfg.getowner(ip_admin_eth0) == owner
358     assert cfg.getowner(netmask_admin_eth0) == owners.default
359     del(cfg.ip_admin_eth0.ip_admin_eth0)
360     assert cfg.getowner(ip_admin_eth0) == owners.default
361     assert cfg.getowner(netmask_admin_eth0) == owners.default
362     assert cfg.ip_admin_eth0.ip_admin_eth0 == ['192.168.230.145']
363     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [None]
364
365     cfg.ip_admin_eth0.ip_admin_eth0[0] = "192.168.230.146"
366     cfg.ip_admin_eth0.netmask_admin_eth0[0] = "255.255.255.0"
367     assert cfg.getowner(ip_admin_eth0) == owner
368     assert cfg.getowner(netmask_admin_eth0, 0) == owner
369     del(cfg.ip_admin_eth0.ip_admin_eth0)
370     assert cfg.getowner(ip_admin_eth0) == owners.default
371     assert cfg.getowner(netmask_admin_eth0, 0) == owners.default
372     assert cfg.ip_admin_eth0.ip_admin_eth0 == ['192.168.230.145']
373     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [None]
374
375     cfg.ip_admin_eth0.netmask_admin_eth0[0] = "255.255.255.0"
376     assert cfg.getowner(ip_admin_eth0) == owners.default
377     assert cfg.getowner(netmask_admin_eth0, 0) == owner
378     del(cfg.ip_admin_eth0.ip_admin_eth0)
379     assert cfg.getowner(ip_admin_eth0) == owners.default
380     assert cfg.getowner(netmask_admin_eth0) == owners.default
381     assert cfg.ip_admin_eth0.ip_admin_eth0 == ['192.168.230.145']
382     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [None]
383
384
385 def test_reset_values_with_master_and_slaves_setitem():
386     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True, default=['192.168.230.145'])
387     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
388     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
389     interface1.impl_set_group_type(groups.master)
390     maconfig = OptionDescription('toto', '', [interface1])
391     cfg = Config(maconfig)
392     cfg.read_write()
393     owner = cfg.cfgimpl_get_settings().getowner()
394     assert cfg.getowner(ip_admin_eth0) == owners.default
395     assert cfg.getowner(netmask_admin_eth0) == owners.default
396
397     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.146")
398     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.146")
399     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.146")
400     assert cfg.ip_admin_eth0.netmask_admin_eth0[-1] == None
401     assert cfg.ip_admin_eth0.netmask_admin_eth0[3] == None
402     assert cfg.getowner(netmask_admin_eth0, 3) == owners.default
403     cfg.ip_admin_eth0.netmask_admin_eth0[-1] = "255.255.255.0"
404     assert cfg.ip_admin_eth0.netmask_admin_eth0[-1] == "255.255.255.0"
405     assert cfg.ip_admin_eth0.netmask_admin_eth0[3] == "255.255.255.0"
406     assert cfg.getowner(netmask_admin_eth0, 3) == owner
407     #
408     assert cfg.getowner(netmask_admin_eth0, 2) == owners.default
409     cfg.ip_admin_eth0.netmask_admin_eth0[2] = "255.255.0.0"
410     assert cfg.ip_admin_eth0.netmask_admin_eth0[-2] == "255.255.0.0"
411     assert cfg.getowner(netmask_admin_eth0, 2) == owner
412
413
414 def test_values_with_master_and_slaves_slave():
415     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
416     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
417     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
418     interface1.impl_set_group_type(groups.master)
419     maconfig = OptionDescription('toto', '', [interface1])
420     cfg = Config(maconfig)
421     cfg.read_write()
422     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
423     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']")
424     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
425     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']
426     cfg.ip_admin_eth0.netmask_admin_eth0[0] = '255.255.255.0'
427     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']")
428     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = []")
429     del(cfg.ip_admin_eth0.netmask_admin_eth0)
430     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']
431     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
432     assert cfg.ip_admin_eth0.netmask_admin_eth0 == ['255.255.255.0', None]
433     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']
434     raises(SlaveError, 'cfg.ip_admin_eth0.netmask_admin_eth0.pop(1)')
435     #reset
436     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
437     cfg.cfgimpl_get_values().reset(ip_admin_eth0)
438     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
439     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
440
441
442 def test_values_with_master_and_slaves_master():
443     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
444     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
445     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
446     interface1.impl_set_group_type(groups.master)
447     maconfig = OptionDescription('toto', '', [interface1])
448     cfg = Config(maconfig)
449     cfg.read_write()
450     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
451     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145"]
452     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145", "192.168.230.145"]
453     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']
454     raises(SlaveError, 'cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145"]')
455     assert cfg.ip_admin_eth0.netmask_admin_eth0 == ['255.255.255.0', '255.255.255.0']
456     cfg.ip_admin_eth0.ip_admin_eth0.pop(1)
457     assert cfg.ip_admin_eth0.ip_admin_eth0 == ["192.168.230.145"]
458     assert cfg.ip_admin_eth0.netmask_admin_eth0 == ['255.255.255.0']
459     del(cfg.ip_admin_eth0.ip_admin_eth0)
460     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
461     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
462
463
464 def test_values_with_master_and_slaves_master_error():
465     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
466     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
467     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
468     interface1.impl_set_group_type(groups.master)
469     maconfig = OptionDescription('toto', '', [interface1])
470     cfg = Config(maconfig)
471     cfg.read_write()
472     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145", "192.168.230.145"]
473     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']")
474     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0', '255.255.255.0']")
475     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']
476     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']")
477     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0', '255.255.255.0']")
478
479
480 def test_values_with_master_owner():
481     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
482     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
483     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
484     interface1.impl_set_group_type(groups.master)
485     maconfig = OptionDescription('toto', '', [interface1])
486     cfg = Config(maconfig)
487     cfg.read_write()
488     owner = cfg.cfgimpl_get_settings().getowner()
489     assert cfg.getowner(ip_admin_eth0) == owners.default
490     assert cfg.getowner(netmask_admin_eth0) == owners.default
491     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
492     assert cfg.getowner(ip_admin_eth0) == owner
493     assert cfg.getowner(netmask_admin_eth0) == owners.default
494     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
495     assert cfg.getowner(ip_admin_eth0) == owner
496     assert cfg.getowner(netmask_admin_eth0) == owners.default
497
498
499 def test_values_with_master_disabled():
500     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
501     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
502     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
503     interface1.impl_set_group_type(groups.master)
504     maconfig = OptionDescription('toto', '', [interface1])
505     cfg = Config(maconfig)
506     cfg.read_write()
507     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
508     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
509     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
510     cfg.ip_admin_eth0.netmask_admin_eth0 = ["192.168.230.145"]
511     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
512     del(cfg.ip_admin_eth0.netmask_admin_eth0)
513     cfg.cfgimpl_get_settings()[netmask_admin_eth0].append('disabled')
514     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
515     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
516
517     #delete with value in disabled var
518     cfg.cfgimpl_get_settings()[netmask_admin_eth0].remove('disabled')
519     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
520     cfg.ip_admin_eth0.netmask_admin_eth0 = ["192.168.230.145"]
521     cfg.cfgimpl_get_settings()[netmask_admin_eth0].append('disabled')
522     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
523
524     #append with value in disabled var
525     cfg.cfgimpl_get_settings()[netmask_admin_eth0].remove('disabled')
526     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
527     cfg.ip_admin_eth0.netmask_admin_eth0 = ["192.168.230.145"]
528     cfg.cfgimpl_get_settings()[netmask_admin_eth0].append('disabled')
529     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.230.43')
530
531
532 def test_multi_insert():
533     var = StrOption('var', '', ['ok'], multi=True)
534     od = OptionDescription('od', '', [var])
535     c = Config(od)
536     c.read_write()
537     assert c.var == ['ok']
538     assert c.getowner(var) == owners.default
539     c.var.insert(0, 'nok')
540     assert c.var == ['nok', 'ok']
541     assert c.getowner(var) != owners.default
542     raises(ValueError, 'c.var.insert(0, 1)')
543
544
545 def test_multi_insert_master():
546     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
547     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
548     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
549     interface1.impl_set_group_type(groups.master)
550     maconfig = OptionDescription('toto', '', [interface1])
551     cfg = Config(maconfig)
552     cfg.read_write()
553     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.insert(0, 'nok')")
554     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.insert(0, 'nok')")
555
556
557 def test_multi_sort():
558     var = StrOption('var', '', ['ok', 'nok'], multi=True)
559     od = OptionDescription('od', '', [var])
560     c = Config(od)
561     c.read_write()
562     assert c.var == ['ok', 'nok']
563     assert c.getowner(var) == owners.default
564     c.var.sort()
565     assert c.var == ['nok', 'ok']
566     assert c.getowner(var) != owners.default
567
568
569 def test_multi_sort_master():
570     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
571     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
572     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
573     interface1.impl_set_group_type(groups.master)
574     maconfig = OptionDescription('toto', '', [interface1])
575     cfg = Config(maconfig)
576     cfg.read_write()
577     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.sort()")
578     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.sort()")
579
580
581 def test_multi_reverse():
582     var = StrOption('var', '', ['ok', 'nok'], multi=True)
583     od = OptionDescription('od', '', [var])
584     c = Config(od)
585     c.read_write()
586     assert c.var == ['ok', 'nok']
587     assert c.getowner(var) == owners.default
588     c.var.reverse()
589     assert c.var == ['nok', 'ok']
590     assert c.getowner(var) != owners.default
591
592
593 def test_multi_reverse_master():
594     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
595     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
596     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
597     interface1.impl_set_group_type(groups.master)
598     maconfig = OptionDescription('toto', '', [interface1])
599     cfg = Config(maconfig)
600     cfg.read_write()
601     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.reverse()")
602     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.reverse()")
603
604
605 def test_multi_extend():
606     var = StrOption('var', '', ['ok', 'nok'], multi=True)
607     od = OptionDescription('od', '', [var])
608     c = Config(od)
609     c.read_write()
610     assert c.var == ['ok', 'nok']
611     assert c.getowner(var) == owners.default
612     c.var.extend(['pok'])
613     assert c.var == ['ok', 'nok', 'pok']
614     assert c.getowner(var) != owners.default
615     raises(ValueError, 'c.var.extend([1])')
616
617
618 def test_multi_extend_master():
619     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
620     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
621     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
622     interface1.impl_set_group_type(groups.master)
623     maconfig = OptionDescription('toto', '', [interface1])
624     cfg = Config(maconfig)
625     cfg.read_write()
626     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.extend(['ok'])")
627     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.extend(['ok'])")
628
629
630 def test_multi_non_valid_value():
631     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
632     maconfig = OptionDescription('toto', '', [ip_admin_eth0])
633     cfg = Config(maconfig)
634     cfg.read_write()
635     cfg.ip_admin_eth0 = ['a']
636     raises(ValueError, 'cfg.ip_admin_eth0[0] = 1')
637
638
639 def test_multi_master_default_slave():
640     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
641     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", default_multi="255.255.255.0", multi=True)
642     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
643     interface1.impl_set_group_type(groups.master)
644     maconfig = OptionDescription('toto', '', [interface1])
645     cfg = Config(maconfig)
646     cfg.read_write()
647     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.1.1')
648     cfg.cfgimpl_reset_cache()
649     assert cfg.ip_admin_eth0.ip_admin_eth0 == ['192.168.1.1']
650
651
652 def test_groups_with_master_get_modified_value():
653     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
654     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
655     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
656     interface1.impl_set_group_type(groups.master)
657     maconfig = OptionDescription('toto', '', [interface1])
658     cfg = Config(maconfig)
659     cfg.read_write()
660     assert cfg.cfgimpl_get_values().get_modified_values() == {}
661     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.1.1')
662     cfg.cfgimpl_reset_cache()
663     assert cfg.cfgimpl_get_values().get_modified_values() == {'ip_admin_eth0.ip_admin_eth0': ('user', ('192.168.1.1',))}
664     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.255']
665     assert cfg.cfgimpl_get_values().get_modified_values() == {'ip_admin_eth0.ip_admin_eth0': ('user', ('192.168.1.1',)), 'ip_admin_eth0.netmask_admin_eth0': ({'0': 'user'}, {'0': '255.255.255.255'})}