pass force_permissive to slave for a master or to master for a slave
[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, PropertiesOptionError
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     mode_conteneur_actif2 = BoolOption('mode_conteneur_actif2', "le serveur est en mode conteneur2",
22                                        default=False, properties=('hidden',))
23
24     adresse_serveur_ntp = StrOption('serveur_ntp', "adresse serveur ntp", multi=True)
25     time_zone = ChoiceOption('time_zone', 'fuseau horaire du serveur',
26                              ('Paris', 'Londres'), 'Paris')
27
28     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé")
29     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau")
30
31     master = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
32     interface1 = OptionDescription('interface1', '', [master])
33     interface1.impl_set_group_type(groups.family)
34
35     general = OptionDescription('general', '', [numero_etab, nom_machine,
36                                 nombre_interfaces, activer_proxy_client,
37                                 mode_conteneur_actif, mode_conteneur_actif2,
38                                 adresse_serveur_ntp, time_zone])
39     general.impl_set_group_type(groups.family)
40     new = OptionDescription('new', '', [], properties=('hidden',))
41     new.impl_set_group_type(groups.family)
42     creole = OptionDescription('creole', 'first tiramisu configuration', [general, interface1, new])
43     descr = OptionDescription('baseconfig', 'baseconifgdescr', [creole])
44     return descr
45
46
47 def test_base_config():
48     descr = make_description()
49     config = Config(descr)
50     config.read_write()
51     assert config.creole.general.activer_proxy_client is False
52     assert config.creole.general.nom_machine == "eoleng"
53     assert config.find_first(byname='nom_machine', type_='value') == "eoleng"
54     result = {'general.numero_etab': None, 'general.nombre_interfaces': 1,
55               'general.serveur_ntp': [], 'interface1.ip_admin_eth0.ip_admin_eth0': None,
56               'general.mode_conteneur_actif': False, 'general.time_zone': 'Paris',
57               'interface1.ip_admin_eth0.netmask_admin_eth0': None, 'general.nom_machine':
58               'eoleng', 'general.activer_proxy_client': False}
59     assert config.creole.make_dict() == result
60     result = {'serveur_ntp': [], 'mode_conteneur_actif': False,
61               'ip_admin_eth0': None, 'time_zone': 'Paris', 'numero_etab': None,
62               'netmask_admin_eth0': None, 'nom_machine': 'eoleng', 'activer_proxy_client':
63               False, 'nombre_interfaces': 1}
64     assert config.creole.make_dict(flatten=True) == result
65
66
67 def test_make_dict_filter():
68     descr = make_description()
69     config = Config(descr)
70     config.read_write()
71     subresult = {'numero_etab': None, 'nombre_interfaces': 1,
72                  'serveur_ntp': [], 'mode_conteneur_actif': False,
73                  'time_zone': 'Paris', 'nom_machine': 'eoleng',
74                  'activer_proxy_client': False}
75     result = {}
76     for key, value in subresult.items():
77         result['general.' + key] = value
78     assert config.creole.make_dict(withoption='numero_etab') == result
79     raises(AttributeError, "config.creole.make_dict(withoption='numero_etab', withvalue='toto')")
80     assert config.creole.make_dict(withoption='numero_etab', withvalue=None) == result
81     assert config.creole.general.make_dict(withoption='numero_etab') == subresult
82
83
84 def test_get_group_type():
85     descr = make_description()
86     config = Config(descr)
87     config.read_write()
88     grp = config.unwrap_from_path('creole.general')
89     assert grp.impl_get_group_type() == groups.family
90     assert grp.impl_get_group_type() == 'family'
91     assert isinstance(grp.impl_get_group_type(), groups.GroupType)
92     raises(TypeError, 'grp.impl_set_group_type(groups.default)')
93
94
95 def test_iter_on_groups():
96     descr = make_description()
97     config = Config(descr)
98     config.read_write()
99     result = list(config.creole.iter_groups(group_type=groups.family))
100     group_names = [res[0] for res in result]
101     assert group_names == ['general', 'interface1']
102     for i in config.creole.iter_groups(group_type=groups.family):
103         #test StopIteration
104         break
105
106
107 def test_iter_on_groups_force_permissive():
108     descr = make_description()
109     config = Config(descr)
110     config.read_write()
111     config.cfgimpl_get_settings().setpermissive(('hidden',))
112     result = list(config.creole.general.__iter__(force_permissive=True))
113     group_names = [res[0] for res in result]
114     ass = ['numero_etab', 'nom_machine', 'nombre_interfaces',
115            'activer_proxy_client', 'mode_conteneur_actif',
116            'mode_conteneur_actif2', 'serveur_ntp', 'time_zone']
117     assert group_names == ass
118     group_names = [res[0] for res in config.creole.general]
119     ass.remove('mode_conteneur_actif2')
120     assert group_names == ass
121
122
123 def test_iter_group_on_groups_force_permissive():
124     descr = make_description()
125     config = Config(descr)
126     config.read_write()
127     config.cfgimpl_get_settings().setpermissive(('hidden',))
128     result = list(config.creole.iter_groups(group_type=groups.family,
129                                             force_permissive=True))
130     group_names = [res[0] for res in result]
131     assert group_names == ['general', 'interface1', 'new']
132
133
134 def test_iter_on_groups_props():
135     descr = make_description()
136     config = Config(descr)
137     config.read_write()
138     config.cfgimpl_get_settings()[descr.creole.interface1].append('disabled')
139     result = list(config.creole.iter_groups(group_type=groups.family))
140     group_names = [res[0] for res in result]
141     assert group_names == ['general']
142
143
144 def test_iter_on_empty_group():
145     config = Config(OptionDescription("name", "descr", []))
146     config.read_write()
147     result = list(config.iter_groups())
148     assert result == []
149     for i in config.iter_groups():
150         pass
151     for i in config:
152         pass
153     assert [] == list(config)
154
155
156 def test_iter_not_group():
157     config = Config(OptionDescription("name", "descr", []))
158     config.read_write()
159     raises(TypeError, "list(config.iter_groups(group_type='family'))")
160
161
162 def test_groups_with_master():
163     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
164     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
165     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
166     interface1.impl_set_group_type(groups.master)
167     assert interface1.impl_get_group_type() == groups.master
168
169
170 def test_groups_with_master_in_config():
171     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
172     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
173     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
174     interface1.impl_set_group_type(groups.master)
175     Config(interface1)
176     assert interface1.impl_get_group_type() == groups.master
177
178
179 def test_groups_with_master_hidden_in_config():
180     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True, properties=('hidden',))
181     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True, properties=('hidden',))
182     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
183     interface1.impl_set_group_type(groups.master)
184     cfg = Config(interface1)
185     cfg.read_write()
186     cfg.cfgimpl_get_settings().setpermissive(('hidden',))
187     cfg.getattr('ip_admin_eth0', force_permissive=True)
188     cfg.getattr('netmask_admin_eth0', force_permissive=True)
189     raises(PropertiesOptionError, "cfg.getattr('ip_admin_eth0')")
190     raises(PropertiesOptionError, "cfg.getattr('netmask_admin_eth0')")
191
192
193 def test_groups_with_master_hidden_in_config2():
194     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
195     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True, properties=('hidden',))
196     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
197     interface1.impl_set_group_type(groups.master)
198     cfg = Config(interface1)
199     cfg.read_write()
200     cfg.cfgimpl_get_settings().setpermissive(('hidden',))
201     cfg.getattr('ip_admin_eth0', force_permissive=True)
202     cfg.getattr('netmask_admin_eth0', force_permissive=True)
203     cfg.getattr('ip_admin_eth0')
204     raises(PropertiesOptionError, "cfg.getattr('netmask_admin_eth0')")
205
206
207 def test_groups_with_master_hidden_in_config3():
208     #if master is hidden, slave are hidden too
209     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True, properties=('hidden',))
210     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
211     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
212     interface1.impl_set_group_type(groups.master)
213     cfg = Config(interface1)
214     cfg.read_write()
215     cfg.cfgimpl_get_settings().setpermissive(('hidden',))
216     cfg.getattr('ip_admin_eth0', force_permissive=True)
217     cfg.getattr('netmask_admin_eth0', force_permissive=True)
218     raises(PropertiesOptionError, "cfg.getattr('ip_admin_eth0')")
219     raises(PropertiesOptionError, "cfg.getattr('netmask_admin_eth0')")
220
221
222
223 def test_allowed_groups():
224     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
225     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
226     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
227     raises(ValueError, "interface1.impl_set_group_type('toto')")
228
229
230 def test_values_with_master_disabled_master():
231     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
232     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
233     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
234     interface1.impl_set_group_type(groups.master)
235     maconfig = OptionDescription('toto', '', [interface1])
236     cfg = Config(maconfig)
237     cfg.read_write()
238     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
239     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
240     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
241     cfg.ip_admin_eth0.netmask_admin_eth0 = ["192.168.230.145"]
242     del(cfg.ip_admin_eth0.netmask_admin_eth0)
243     cfg.cfgimpl_get_settings()[ip_admin_eth0].append('disabled')
244     raises(PropertiesOptionError, "cfg.ip_admin_eth0.netmask_admin_eth0[0] = '192.168.230.145'")
245
246
247 def test_master_not_valid_name():
248     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
249     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
250     invalid_group = OptionDescription('interface1', '', [ip_admin_eth0, netmask_admin_eth0])
251     raises(ValueError, "invalid_group.impl_set_group_type(groups.master)")
252
253
254 def test_sub_group_in_master_group():
255     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
256     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
257     subgroup = OptionDescription("subgroup", '', [])
258     invalid_group = OptionDescription('ip_admin_eth0', '', [subgroup, ip_admin_eth0, netmask_admin_eth0])
259     raises(ValueError, "invalid_group.impl_set_group_type(groups.master)")
260
261
262 def test_group_always_has_multis():
263     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
264     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau")
265     group = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
266     raises(ValueError, "group.impl_set_group_type(groups.master)")
267
268
269 #____________________________________________________________
270 def test_values_with_master_and_slaves():
271     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
272     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
273     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
274     interface1.impl_set_group_type(groups.master)
275     maconfig = OptionDescription('toto', '', [interface1])
276     cfg = Config(maconfig)
277     cfg.read_write()
278     owner = cfg.cfgimpl_get_settings().getowner()
279     assert interface1.impl_get_group_type() == groups.master
280     assert cfg.getowner(ip_admin_eth0) == owners.default
281     assert cfg.getowner(netmask_admin_eth0) == owners.default
282     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
283     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
284     assert cfg.ip_admin_eth0.ip_admin_eth0 == ["192.168.230.145"]
285     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [None]
286     assert cfg.getowner(ip_admin_eth0) == owner
287     assert cfg.getowner(netmask_admin_eth0) == owners.default
288     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145", "192.168.230.147"]
289     raises(SlaveError, 'cfg.ip_admin_eth0.netmask_admin_eth0.append(None)')
290     raises(SlaveError, 'cfg.ip_admin_eth0.netmask_admin_eth0.pop(0)')
291
292
293 def test_reset_values_with_master_and_slaves():
294     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
295     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
296     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
297     interface1.impl_set_group_type(groups.master)
298     maconfig = OptionDescription('toto', '', [interface1])
299     cfg = Config(maconfig)
300     cfg.read_write()
301     owner = cfg.cfgimpl_get_settings().getowner()
302     assert interface1.impl_get_group_type() == groups.master
303     assert cfg.getowner(ip_admin_eth0) == owners.default
304     assert cfg.getowner(netmask_admin_eth0) == owners.default
305     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
306     assert cfg.getowner(ip_admin_eth0) == owner
307     assert cfg.getowner(netmask_admin_eth0) == owners.default
308     del(cfg.ip_admin_eth0.ip_admin_eth0)
309     assert cfg.getowner(ip_admin_eth0) == owners.default
310     assert cfg.getowner(netmask_admin_eth0) == owners.default
311     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
312     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
313
314
315 def test_values_with_master_and_slaves_slave():
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     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
324     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']")
325     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
326     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']
327     cfg.ip_admin_eth0.netmask_admin_eth0[0] = '255.255.255.0'
328     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']")
329     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = []")
330     del(cfg.ip_admin_eth0.netmask_admin_eth0)
331     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']
332     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
333     assert cfg.ip_admin_eth0.netmask_admin_eth0 == ['255.255.255.0', None]
334     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']
335     raises(SlaveError, 'cfg.ip_admin_eth0.netmask_admin_eth0.pop(1)')
336
337
338 def test_values_with_master_and_slaves_master():
339     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
340     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
341     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
342     interface1.impl_set_group_type(groups.master)
343     maconfig = OptionDescription('toto', '', [interface1])
344     cfg = Config(maconfig)
345     cfg.read_write()
346     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
347     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145"]
348     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145", "192.168.230.145"]
349     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']
350     raises(SlaveError, 'cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145"]')
351     assert cfg.ip_admin_eth0.netmask_admin_eth0 == ['255.255.255.0', '255.255.255.0']
352     cfg.ip_admin_eth0.ip_admin_eth0.pop(1)
353     assert cfg.ip_admin_eth0.ip_admin_eth0 == ["192.168.230.145"]
354     assert cfg.ip_admin_eth0.netmask_admin_eth0 == ['255.255.255.0']
355     del(cfg.ip_admin_eth0.ip_admin_eth0)
356     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
357     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
358
359
360 def test_values_with_master_and_slaves_master_error():
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     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145", "192.168.230.145"]
369     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']")
370     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0', '255.255.255.0']")
371     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']
372     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']")
373     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0', '255.255.255.0']")
374
375
376 def test_values_with_master_owner():
377     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
378     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
379     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
380     interface1.impl_set_group_type(groups.master)
381     maconfig = OptionDescription('toto', '', [interface1])
382     cfg = Config(maconfig)
383     cfg.read_write()
384     owner = cfg.cfgimpl_get_settings().getowner()
385     assert cfg.getowner(ip_admin_eth0) == owners.default
386     assert cfg.getowner(netmask_admin_eth0) == owners.default
387     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
388     assert cfg.getowner(ip_admin_eth0) == owner
389     assert cfg.getowner(netmask_admin_eth0) == owners.default
390     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
391     assert cfg.getowner(ip_admin_eth0) == owner
392     assert cfg.getowner(netmask_admin_eth0) == owners.default
393
394
395 def test_values_with_master_disabled():
396     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
397     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
398     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
399     interface1.impl_set_group_type(groups.master)
400     maconfig = OptionDescription('toto', '', [interface1])
401     cfg = Config(maconfig)
402     cfg.read_write()
403     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
404     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
405     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
406     cfg.ip_admin_eth0.netmask_admin_eth0 = ["192.168.230.145"]
407     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
408     del(cfg.ip_admin_eth0.netmask_admin_eth0)
409     cfg.cfgimpl_get_settings()[netmask_admin_eth0].append('disabled')
410     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
411     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
412
413     #delete with value in disabled var
414     cfg.cfgimpl_get_settings()[netmask_admin_eth0].remove('disabled')
415     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
416     cfg.ip_admin_eth0.netmask_admin_eth0 = ["192.168.230.145"]
417     cfg.cfgimpl_get_settings()[netmask_admin_eth0].append('disabled')
418     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
419
420     #append with value in disabled var
421     cfg.cfgimpl_get_settings()[netmask_admin_eth0].remove('disabled')
422     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
423     cfg.ip_admin_eth0.netmask_admin_eth0 = ["192.168.230.145"]
424     cfg.cfgimpl_get_settings()[netmask_admin_eth0].append('disabled')
425     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.230.43')
426
427
428 def test_multi_insert():
429     var = StrOption('var', '', ['ok'], multi=True)
430     od = OptionDescription('od', '', [var])
431     c = Config(od)
432     c.read_write()
433     assert c.var == ['ok']
434     assert c.getowner(var) == owners.default
435     c.var.insert(0, 'nok')
436     assert c.var == ['nok', 'ok']
437     assert c.getowner(var) != owners.default
438     raises(ValueError, 'c.var.insert(0, 1)')
439
440
441 def test_multi_insert_master():
442     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
443     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
444     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
445     interface1.impl_set_group_type(groups.master)
446     maconfig = OptionDescription('toto', '', [interface1])
447     cfg = Config(maconfig)
448     cfg.read_write()
449     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.insert(0, 'nok')")
450     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.insert(0, 'nok')")
451
452
453 def test_multi_sort():
454     var = StrOption('var', '', ['ok', 'nok'], multi=True)
455     od = OptionDescription('od', '', [var])
456     c = Config(od)
457     c.read_write()
458     assert c.var == ['ok', 'nok']
459     assert c.getowner(var) == owners.default
460     c.var.sort()
461     assert c.var == ['nok', 'ok']
462     assert c.getowner(var) != owners.default
463
464
465 def test_multi_sort_master():
466     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
467     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
468     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
469     interface1.impl_set_group_type(groups.master)
470     maconfig = OptionDescription('toto', '', [interface1])
471     cfg = Config(maconfig)
472     cfg.read_write()
473     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.sort()")
474     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.sort()")
475
476
477 def test_multi_reverse():
478     var = StrOption('var', '', ['ok', 'nok'], multi=True)
479     od = OptionDescription('od', '', [var])
480     c = Config(od)
481     c.read_write()
482     assert c.var == ['ok', 'nok']
483     assert c.getowner(var) == owners.default
484     c.var.reverse()
485     assert c.var == ['nok', 'ok']
486     assert c.getowner(var) != owners.default
487
488
489 def test_multi_reverse_master():
490     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
491     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
492     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
493     interface1.impl_set_group_type(groups.master)
494     maconfig = OptionDescription('toto', '', [interface1])
495     cfg = Config(maconfig)
496     cfg.read_write()
497     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.reverse()")
498     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.reverse()")
499
500
501 def test_multi_extend():
502     var = StrOption('var', '', ['ok', 'nok'], multi=True)
503     od = OptionDescription('od', '', [var])
504     c = Config(od)
505     c.read_write()
506     assert c.var == ['ok', 'nok']
507     assert c.getowner(var) == owners.default
508     c.var.extend(['pok'])
509     assert c.var == ['ok', 'nok', 'pok']
510     assert c.getowner(var) != owners.default
511     raises(ValueError, 'c.var.extend([1])')
512
513
514 def test_multi_extend_master():
515     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
516     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
517     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
518     interface1.impl_set_group_type(groups.master)
519     maconfig = OptionDescription('toto', '', [interface1])
520     cfg = Config(maconfig)
521     cfg.read_write()
522     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.extend(['ok'])")
523     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.extend(['ok'])")
524
525
526 def test_multi_non_valid_value():
527     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
528     maconfig = OptionDescription('toto', '', [ip_admin_eth0])
529     cfg = Config(maconfig)
530     cfg.read_write()
531     cfg.ip_admin_eth0 = ['a']
532     raises(ValueError, 'cfg.ip_admin_eth0[0] = 1')