python 3.5 support
[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_values_with_master_remove():
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     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
270     interface1.impl_set_group_type(groups.master)
271     maconfig = OptionDescription('toto', '', [interface1])
272     cfg = Config(maconfig)
273     cfg.read_write()
274     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.230.145')
275     cfg.ip_admin_eth0.ip_admin_eth0.remove('192.168.230.145')
276     raises(ValueError, "cfg.ip_admin_eth0.ip_admin_eth0.remove('192.168.230.14')")
277     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.230.15')
278     cfg.ip_admin_eth0.netmask_admin_eth0[-1] = '255.255.255.0'
279     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.230.16')
280     cfg.ip_admin_eth0.netmask_admin_eth0[-1] = '255.255.255.128'
281     assert cfg.ip_admin_eth0.ip_admin_eth0 == ['192.168.230.15', '192.168.230.16']
282     assert cfg.ip_admin_eth0.netmask_admin_eth0 == ['255.255.255.0', '255.255.255.128']
283     cfg.ip_admin_eth0.ip_admin_eth0.remove('192.168.230.15')
284     assert cfg.ip_admin_eth0.ip_admin_eth0 == ['192.168.230.16']
285     assert cfg.ip_admin_eth0.netmask_admin_eth0 == ['255.255.255.128']
286
287
288 def test_master_not_valid_name():
289     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
290     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
291     invalid_group = OptionDescription('interface1', '', [ip_admin_eth0, netmask_admin_eth0])
292     invalid_group
293     raises(ValueError, "invalid_group.impl_set_group_type(groups.master)")
294
295
296 def test_sub_group_in_master_group():
297     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
298     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
299     subgroup = OptionDescription("subgroup", '', [])
300     invalid_group = OptionDescription('ip_admin_eth0', '', [subgroup, ip_admin_eth0, netmask_admin_eth0])
301     invalid_group
302     raises(ValueError, "invalid_group.impl_set_group_type(groups.master)")
303
304
305 def test_group_always_has_multis():
306     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
307     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau")
308     group = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
309     group
310     raises(ValueError, "group.impl_set_group_type(groups.master)")
311
312
313 #____________________________________________________________
314 def test_values_with_master_and_slaves():
315     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
316     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
317     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
318     interface1.impl_set_group_type(groups.master)
319     maconfig = OptionDescription('toto', '', [interface1])
320     cfg = Config(maconfig)
321     cfg.read_write()
322     owner = cfg.cfgimpl_get_settings().getowner()
323     assert interface1.impl_get_group_type() == groups.master
324     assert cfg.getowner(ip_admin_eth0) == owners.default
325     assert cfg.getowner(netmask_admin_eth0) == owners.default
326     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
327     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
328     assert cfg.ip_admin_eth0.ip_admin_eth0 == ["192.168.230.145"]
329     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [None]
330     assert cfg.getowner(ip_admin_eth0) == owner
331     assert cfg.getowner(netmask_admin_eth0) == owners.default
332     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145", "192.168.230.147"]
333     raises(SlaveError, 'cfg.ip_admin_eth0.netmask_admin_eth0.append(None)')
334     raises(SlaveError, 'cfg.ip_admin_eth0.netmask_admin_eth0.pop(0)')
335
336
337 def test_reset_values_with_master_and_slaves():
338     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
339     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
340     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
341     interface1.impl_set_group_type(groups.master)
342     maconfig = OptionDescription('toto', '', [interface1])
343     cfg = Config(maconfig)
344     cfg.read_write()
345     owner = cfg.cfgimpl_get_settings().getowner()
346     assert interface1.impl_get_group_type() == groups.master
347     assert cfg.getowner(ip_admin_eth0) == owners.default
348     assert cfg.getowner(netmask_admin_eth0) == owners.default
349     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
350     assert cfg.getowner(ip_admin_eth0) == owner
351     assert cfg.getowner(netmask_admin_eth0) == owners.default
352     del(cfg.ip_admin_eth0.ip_admin_eth0)
353     assert cfg.getowner(ip_admin_eth0) == owners.default
354     assert cfg.getowner(netmask_admin_eth0) == owners.default
355     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
356     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
357     #reset
358     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
359     cfg.cfgimpl_get_values().reset(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 == []
363     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
364
365
366 def test_reset_values_with_master_and_slaves_default_value():
367     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True, default=['192.168.230.145'])
368     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True, default=['255.255.255.0'])
369     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
370     raises(ValueError, "interface1.impl_set_group_type(groups.master)")
371
372
373 def test_reset_values_with_master_and_slaves_default():
374     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True, default=['192.168.230.145'])
375     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
376     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
377     interface1.impl_set_group_type(groups.master)
378     maconfig = OptionDescription('toto', '', [interface1])
379     cfg = Config(maconfig)
380     cfg.read_write()
381     owner = cfg.cfgimpl_get_settings().getowner()
382     assert cfg.getowner(ip_admin_eth0) == owners.default
383     assert cfg.getowner(netmask_admin_eth0) == owners.default
384
385     cfg.ip_admin_eth0.ip_admin_eth0[0] = "192.168.230.146"
386     assert cfg.getowner(ip_admin_eth0) == owner
387     assert cfg.getowner(netmask_admin_eth0) == owners.default
388     del(cfg.ip_admin_eth0.ip_admin_eth0)
389     assert cfg.getowner(ip_admin_eth0) == owners.default
390     assert cfg.getowner(netmask_admin_eth0) == owners.default
391     assert cfg.ip_admin_eth0.ip_admin_eth0 == ['192.168.230.145']
392     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [None]
393
394     cfg.ip_admin_eth0.ip_admin_eth0[0] = "192.168.230.146"
395     cfg.ip_admin_eth0.netmask_admin_eth0[0] = "255.255.255.0"
396     assert cfg.getowner(ip_admin_eth0) == owner
397     assert cfg.getowner(netmask_admin_eth0, 0) == owner
398     del(cfg.ip_admin_eth0.ip_admin_eth0)
399     assert cfg.getowner(ip_admin_eth0) == owners.default
400     assert cfg.getowner(netmask_admin_eth0, 0) == owners.default
401     assert cfg.ip_admin_eth0.ip_admin_eth0 == ['192.168.230.145']
402     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [None]
403
404     cfg.ip_admin_eth0.netmask_admin_eth0[0] = "255.255.255.0"
405     assert cfg.getowner(ip_admin_eth0) == owners.default
406     assert cfg.getowner(netmask_admin_eth0, 0) == owner
407     del(cfg.ip_admin_eth0.ip_admin_eth0)
408     assert cfg.getowner(ip_admin_eth0) == owners.default
409     assert cfg.getowner(netmask_admin_eth0) == owners.default
410     assert cfg.ip_admin_eth0.ip_admin_eth0 == ['192.168.230.145']
411     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [None]
412
413
414 def test_reset_values_with_master_and_slaves_setitem():
415     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True, default=['192.168.230.145'])
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     owner = cfg.cfgimpl_get_settings().getowner()
423     assert cfg.getowner(ip_admin_eth0) == owners.default
424     assert cfg.getowner(netmask_admin_eth0) == owners.default
425
426     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.146")
427     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.146")
428     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.146")
429     assert cfg.ip_admin_eth0.netmask_admin_eth0[-1] == None
430     assert cfg.ip_admin_eth0.netmask_admin_eth0[3] == None
431     assert cfg.getowner(netmask_admin_eth0, 3) == owners.default
432     cfg.ip_admin_eth0.netmask_admin_eth0[-1] = "255.255.255.0"
433     assert cfg.ip_admin_eth0.netmask_admin_eth0[-1] == "255.255.255.0"
434     assert cfg.ip_admin_eth0.netmask_admin_eth0[3] == "255.255.255.0"
435     assert cfg.getowner(netmask_admin_eth0, 3) == owner
436     #
437     assert cfg.getowner(netmask_admin_eth0, 2) == owners.default
438     cfg.ip_admin_eth0.netmask_admin_eth0[2] = "255.255.0.0"
439     assert cfg.ip_admin_eth0.netmask_admin_eth0[-2] == "255.255.0.0"
440     assert cfg.getowner(netmask_admin_eth0, 2) == owner
441
442
443 def test_values_with_master_and_slaves_slave():
444     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
445     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
446     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
447     interface1.impl_set_group_type(groups.master)
448     maconfig = OptionDescription('toto', '', [interface1])
449     cfg = Config(maconfig)
450     cfg.read_write()
451     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
452     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']")
453     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
454     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']
455     cfg.ip_admin_eth0.netmask_admin_eth0[0] = '255.255.255.0'
456     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']")
457     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = []")
458     del(cfg.ip_admin_eth0.netmask_admin_eth0)
459     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']
460     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
461     assert cfg.ip_admin_eth0.netmask_admin_eth0 == ['255.255.255.0', None]
462     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']
463     raises(SlaveError, 'cfg.ip_admin_eth0.netmask_admin_eth0.pop(1)')
464     #reset
465     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
466     cfg.cfgimpl_get_values().reset(ip_admin_eth0)
467     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
468     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
469
470
471 def test_values_with_master_and_slaves_master():
472     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
473     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
474     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
475     interface1.impl_set_group_type(groups.master)
476     maconfig = OptionDescription('toto', '', [interface1])
477     cfg = Config(maconfig)
478     cfg.read_write()
479     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
480     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145"]
481     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145", "192.168.230.145"]
482     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']
483     raises(SlaveError, 'cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145"]')
484     assert cfg.ip_admin_eth0.netmask_admin_eth0 == ['255.255.255.0', '255.255.255.0']
485     cfg.ip_admin_eth0.ip_admin_eth0.pop(1)
486     assert cfg.ip_admin_eth0.ip_admin_eth0 == ["192.168.230.145"]
487     assert cfg.ip_admin_eth0.netmask_admin_eth0 == ['255.255.255.0']
488     del(cfg.ip_admin_eth0.ip_admin_eth0)
489     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
490     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
491
492
493 def test_values_with_master_and_slaves_master_error():
494     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
495     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
496     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
497     interface1.impl_set_group_type(groups.master)
498     maconfig = OptionDescription('toto', '', [interface1])
499     cfg = Config(maconfig)
500     cfg.read_write()
501     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145", "192.168.230.145"]
502     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']")
503     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0', '255.255.255.0']")
504     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']
505     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']")
506     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0', '255.255.255.0']")
507
508
509 def test_values_with_master_owner():
510     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
511     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
512     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
513     interface1.impl_set_group_type(groups.master)
514     maconfig = OptionDescription('toto', '', [interface1])
515     cfg = Config(maconfig)
516     cfg.read_write()
517     owner = cfg.cfgimpl_get_settings().getowner()
518     assert cfg.getowner(ip_admin_eth0) == owners.default
519     assert cfg.getowner(netmask_admin_eth0) == owners.default
520     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
521     assert cfg.getowner(ip_admin_eth0) == owner
522     assert cfg.getowner(netmask_admin_eth0) == owners.default
523     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
524     assert cfg.getowner(ip_admin_eth0) == owner
525     assert cfg.getowner(netmask_admin_eth0) == owners.default
526
527
528 def test_values_with_master_disabled():
529     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
530     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
531     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
532     interface1.impl_set_group_type(groups.master)
533     maconfig = OptionDescription('toto', '', [interface1])
534     cfg = Config(maconfig)
535     cfg.read_write()
536     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
537     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
538     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
539     cfg.ip_admin_eth0.netmask_admin_eth0 = ["192.168.230.145"]
540     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
541     del(cfg.ip_admin_eth0.netmask_admin_eth0)
542     cfg.cfgimpl_get_settings()[netmask_admin_eth0].append('disabled')
543     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
544     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
545
546     #delete with value in disabled var
547     cfg.cfgimpl_get_settings()[netmask_admin_eth0].remove('disabled')
548     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
549     cfg.ip_admin_eth0.netmask_admin_eth0 = ["192.168.230.145"]
550     cfg.cfgimpl_get_settings()[netmask_admin_eth0].append('disabled')
551     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
552
553     #append with value in disabled var
554     cfg.cfgimpl_get_settings()[netmask_admin_eth0].remove('disabled')
555     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
556     cfg.ip_admin_eth0.netmask_admin_eth0 = ["192.168.230.145"]
557     cfg.cfgimpl_get_settings()[netmask_admin_eth0].append('disabled')
558     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.230.43')
559
560
561 def test_multi_insert():
562     var = StrOption('var', '', ['ok'], multi=True)
563     od = OptionDescription('od', '', [var])
564     c = Config(od)
565     c.read_write()
566     assert c.var == ['ok']
567     assert c.getowner(var) == owners.default
568     c.var.insert(0, 'nok')
569     assert c.var == ['nok', 'ok']
570     assert c.getowner(var) != owners.default
571     raises(ValueError, 'c.var.insert(0, 1)')
572
573
574 def test_multi_insert_master():
575     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
576     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
577     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
578     interface1.impl_set_group_type(groups.master)
579     maconfig = OptionDescription('toto', '', [interface1])
580     cfg = Config(maconfig)
581     cfg.read_write()
582     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.insert(0, 'nok')")
583     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.insert(0, 'nok')")
584
585
586 def test_multi_sort():
587     var = StrOption('var', '', ['ok', 'nok'], multi=True)
588     od = OptionDescription('od', '', [var])
589     c = Config(od)
590     c.read_write()
591     assert c.var == ['ok', 'nok']
592     assert c.getowner(var) == owners.default
593     c.var.sort()
594     assert c.var == ['nok', 'ok']
595     assert c.getowner(var) != owners.default
596
597
598 def test_multi_sort_master():
599     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
600     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
601     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
602     interface1.impl_set_group_type(groups.master)
603     maconfig = OptionDescription('toto', '', [interface1])
604     cfg = Config(maconfig)
605     cfg.read_write()
606     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.sort()")
607     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.sort()")
608
609
610 def test_multi_reverse():
611     var = StrOption('var', '', ['ok', 'nok'], multi=True)
612     od = OptionDescription('od', '', [var])
613     c = Config(od)
614     c.read_write()
615     assert c.var == ['ok', 'nok']
616     assert c.getowner(var) == owners.default
617     c.var.reverse()
618     assert c.var == ['nok', 'ok']
619     assert c.getowner(var) != owners.default
620
621
622 def test_multi_reverse_master():
623     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
624     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
625     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
626     interface1.impl_set_group_type(groups.master)
627     maconfig = OptionDescription('toto', '', [interface1])
628     cfg = Config(maconfig)
629     cfg.read_write()
630     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.reverse()")
631     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.reverse()")
632
633
634 def test_multi_extend():
635     var = StrOption('var', '', ['ok', 'nok'], multi=True)
636     od = OptionDescription('od', '', [var])
637     c = Config(od)
638     c.read_write()
639     assert c.var == ['ok', 'nok']
640     assert c.getowner(var) == owners.default
641     c.var.extend(['pok'])
642     assert c.var == ['ok', 'nok', 'pok']
643     assert c.getowner(var) != owners.default
644     raises(ValueError, 'c.var.extend([1])')
645
646
647 def test_multi_extend_master():
648     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
649     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
650     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
651     interface1.impl_set_group_type(groups.master)
652     maconfig = OptionDescription('toto', '', [interface1])
653     cfg = Config(maconfig)
654     cfg.read_write()
655     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.extend(['ok'])")
656     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.extend(['ok'])")
657
658
659 def test_multi_non_valid_value():
660     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
661     maconfig = OptionDescription('toto', '', [ip_admin_eth0])
662     cfg = Config(maconfig)
663     cfg.read_write()
664     cfg.ip_admin_eth0 = ['a']
665     raises(ValueError, 'cfg.ip_admin_eth0[0] = 1')
666
667
668 def test_multi_master_default_slave():
669     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
670     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", default_multi="255.255.255.0", multi=True)
671     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
672     interface1.impl_set_group_type(groups.master)
673     maconfig = OptionDescription('toto', '', [interface1])
674     cfg = Config(maconfig)
675     cfg.read_write()
676     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.1.1')
677     cfg.cfgimpl_reset_cache()
678     assert cfg.ip_admin_eth0.ip_admin_eth0 == ['192.168.1.1']
679
680
681 def test_groups_with_master_get_modified_value():
682     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
683     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
684     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
685     interface1.impl_set_group_type(groups.master)
686     maconfig = OptionDescription('toto', '', [interface1])
687     cfg = Config(maconfig)
688     cfg.read_write()
689     assert cfg.cfgimpl_get_values().get_modified_values() == {}
690     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.1.1')
691     cfg.cfgimpl_reset_cache()
692     assert cfg.cfgimpl_get_values().get_modified_values() == {'ip_admin_eth0.ip_admin_eth0': ('user', ('192.168.1.1',))}
693     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.255']
694     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'})}
695     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.1.1')
696     cfg.ip_admin_eth0.netmask_admin_eth0[-1] = '255.255.255.255'
697     assert cfg.cfgimpl_get_values().get_modified_values() == {'ip_admin_eth0.ip_admin_eth0': ('user', ('192.168.1.1', '192.168.1.1')), 'ip_admin_eth0.netmask_admin_eth0': ({'0': 'user', '1': 'user'}, {'0': '255.255.255.255', '1': '255.255.255.255'})}