reorganise Base and Option
[tiramisu.git] / test / test_metaconfig.py
1 from .autopath import do_autopath
2 do_autopath()
3
4 from py.test import raises
5
6 from tiramisu.setting import groups, owners
7 from tiramisu.config import Config, GroupConfig, MetaConfig
8 from tiramisu.option import IntOption, StrOption, NetworkOption, NetmaskOption, OptionDescription
9 from tiramisu.error import ConfigError, ConflictError, PropertiesOptionError
10
11 owners.addowner('meta')
12
13
14 def return_value(value=None):
15     return value
16
17
18 def raise_exception():
19     raise Exception('test')
20
21
22 def make_description():
23     i1 = IntOption('i1', '')
24     i2 = IntOption('i2', '', default=1)
25     i3 = IntOption('i3', '')
26     i4 = IntOption('i4', '', default=2)
27     i5 = IntOption('i5', '', default=[2], multi=True)
28     i6 = IntOption('i6', '', properties=('disabled',))
29     od1 = OptionDescription('od1', '', [i1, i2, i3, i4, i5, i6])
30     od2 = OptionDescription('od2', '', [od1])
31     return od2
32
33
34 def make_metaconfig():
35     od2 = make_description()
36     conf1 = Config(od2, session_id='conf3')
37     conf2 = Config(od2, session_id='conf4')
38     meta = MetaConfig([conf1, conf2], session_id='meta')
39     meta.read_write()
40     meta.cfgimpl_get_settings().setowner(owners.meta)
41     return meta
42
43
44 #FIXME ne pas mettre 2 meta dans une config
45 #FIXME ne pas mettre 2 OD differents dans un meta
46 #FIXME serialization
47 def test_none():
48     meta = make_metaconfig()
49     conf1, conf2 = meta.cfgimpl_get_children()
50     assert conf1.od1.i3 is conf2.od1.i3 is None
51     assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.default
52     meta.od1.i3 = 3
53     assert conf1.od1.i3 == conf2.od1.i3 == 3
54     assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.meta
55     meta.od1.i3 = 3
56     conf1.od1.i3 = 2
57     assert conf1.od1.i3 == 2
58     assert conf2.od1.i3 == 3
59     assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is owners.user
60     assert conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.meta
61     meta.od1.i3 = 4
62     assert conf1.od1.i3 == 2
63     assert conf2.od1.i3 == 4
64     assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is owners.user
65     assert conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.meta
66     del(meta.od1.i3)
67     assert conf1.od1.i3 == 2
68     assert conf2.od1.i3 is None
69     assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is owners.user
70     assert conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.default
71     del(conf1.od1.i3)
72     assert conf1.od1.i3 is conf2.od1.i3 is None
73     assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.default
74
75
76 def test_default():
77     meta = make_metaconfig()
78     conf1, conf2 = meta.cfgimpl_get_children()
79     assert conf1.od1.i2 == conf2.od1.i2 == 1
80     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
81     meta.od1.i2 = 3
82     assert conf1.od1.i2 == conf2.od1.i2 == 3
83     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
84     meta.od1.i2 = 3
85     conf1.od1.i2 = 2
86     assert conf1.od1.i2 == 2
87     assert conf2.od1.i2 == 3
88     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is owners.user
89     assert conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
90     meta.od1.i2 = 4
91     assert conf1.od1.i2 == 2
92     assert conf2.od1.i2 == 4
93     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is owners.user
94     assert conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
95     del(meta.od1.i2)
96     assert conf1.od1.i2 == 2
97     assert conf2.od1.i2 == 1
98     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is owners.user
99     assert conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
100     del(conf1.od1.i2)
101     assert conf1.od1.i2 == conf2.od1.i2 == 1
102     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
103
104
105 def test_contexts():
106     meta = make_metaconfig()
107     conf1, conf2 = meta.cfgimpl_get_children()
108     assert conf1.od1.i2 == conf2.od1.i2 == 1
109     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
110     errors = meta.set_value('od1.i2', 6, only_config=True)
111     assert meta.od1.i2 == 1
112     assert conf1.od1.i2 == conf2.od1.i2 == 6
113     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.user
114     assert len(errors) == 0
115
116
117 def test_find():
118     meta = make_metaconfig()
119     i2 = meta.unwrap_from_path('od1.i2')
120     assert [i2] == meta.find(byname='i2')
121     assert i2 == meta.find_first(byname='i2')
122     assert meta.make_dict() == {'od1.i4': 2, 'od1.i1': None, 'od1.i3': None,
123                                 'od1.i2': 1, 'od1.i5': [2]}
124
125
126 def test_group_error():
127     raises(ValueError, "GroupConfig('str')")
128     raises(ValueError, "GroupConfig(['str'])")
129
130
131 def test_meta_meta():
132     meta1 = make_metaconfig()
133     meta2 = MetaConfig([meta1])
134     assert str(meta1) == """(conf3)
135 (conf4)
136 [od1]"""
137     meta2.cfgimpl_get_settings().setowner(owners.meta)
138     conf1, conf2 = meta1.cfgimpl_get_children()
139     assert conf1.od1.i2 == conf2.od1.i2 == 1
140     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
141     meta2.od1.i2 = 3
142     assert conf1.od1.i2 == conf2.od1.i2 == 3
143     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
144     meta2.od1.i2 = 3
145     conf1.od1.i2 = 2
146     assert conf1.od1.i2 == 2
147     assert conf2.od1.i2 == 3
148     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is owners.user
149     assert conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
150     meta2.od1.i2 = 4
151     assert conf1.od1.i2 == 2
152     assert conf2.od1.i2 == 4
153     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is owners.user
154     assert conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
155     del(meta2.od1.i2)
156     assert conf1.od1.i2 == 2
157     assert conf2.od1.i2 == 1
158     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is owners.user
159     assert conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
160     del(conf1.od1.i2)
161     assert conf1.od1.i2 == conf2.od1.i2 == 1
162     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
163     meta1.od1.i2 = 6
164     assert conf1.od1.i2 == conf2.od1.i2 == 6
165     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
166
167
168 def test_meta_config_name():
169     od = make_description()
170     meta = MetaConfig(['name1', 'name2'], optiondescription=od)
171     assert len(meta.cfgimpl_get_children()) == 2
172     assert meta.name1
173     assert meta.name2
174
175
176 def test_meta_new_config():
177     meta = make_metaconfig()
178     assert len(meta.cfgimpl_get_children()) == 2
179     meta.new_config('newconf1')
180     assert len(meta.cfgimpl_get_children()) == 3
181
182
183 def test_meta_new_config_wrong_name():
184     meta = make_metaconfig()
185     assert len(meta.cfgimpl_get_children()) == 2
186     raises(ConflictError, "meta.new_config('conf4')")
187     assert len(meta.cfgimpl_get_children()) == 2
188
189
190 def test_meta_meta_set():
191     meta1 = make_metaconfig()
192     meta2 = MetaConfig([meta1])
193     meta2.cfgimpl_get_settings().setowner(owners.meta)
194     meta2.read_write()
195     conf1, conf2 = meta1.cfgimpl_get_children()
196     errors1 = meta2.set_value('od1.i1', 7, only_config=True)
197     errors2 = meta2.set_value('od1.i6', 7, only_config=True)
198     assert len(errors1) == 0
199     assert len(errors2) == 2
200     assert conf1.od1.i1 == conf2.od1.i1 == 7
201     assert conf1.getowner(conf1.unwrap_from_path('od1.i1')) is conf2.getowner(conf2.unwrap_from_path('od1.i1')) is owners.user
202     assert [conf1, conf2] == meta2.find_firsts(byname='i1', byvalue=7).cfgimpl_get_children()
203     conf1.od1.i1 = 8
204     assert [conf1, conf2] == meta2.find_firsts(byname='i1').cfgimpl_get_children()
205     assert [conf2] == meta2.find_firsts(byname='i1', byvalue=7).cfgimpl_get_children()
206     assert [conf1] == meta2.find_firsts(byname='i1', byvalue=8).cfgimpl_get_children()
207     assert [conf1, conf2] == meta2.find_firsts(byname='i5', byvalue=2).cfgimpl_get_children()
208     raises(AttributeError, "meta2.find_firsts(byname='i1', byvalue=10)")
209     raises(AttributeError, "meta2.find_firsts(byname='not', byvalue=10)")
210     raises(AttributeError, "meta2.find_firsts(byname='i6')")
211     raises(ValueError, "meta2.set_value('od1.i6', 7, only_config=True, force_default=True)")
212     raises(ValueError, "meta2.set_value('od1.i6', 7, only_config=True, force_default_if_same=True)")
213     raises(ValueError, "meta2.set_value('od1.i6', 7, only_config=True, force_dont_change_value=True)")
214
215
216 def test_not_meta():
217     i1 = IntOption('i1', '')
218     od1 = OptionDescription('od1', '', [i1])
219     od2 = OptionDescription('od2', '', [od1])
220     conf1 = Config(od2, session_id='conf1')
221     conf2 = Config(od2, session_id='conf2')
222     conf3 = Config(od2)
223     try:
224         conf4 = Config(od2, session_id='conf2')
225     except ConflictError:
226         pass
227     else:
228         conf3, conf4
229         raises(ValueError, "GroupConfig(conf1)")
230         #same name
231         raises(ConflictError, "GroupConfig([conf2, conf4])")
232         grp = GroupConfig([conf1, conf2])
233         raises(ConfigError, 'grp.od1.i1')
234         conf1, conf2 = grp.cfgimpl_get_children()
235         errors = grp.set_value('od1.i1', 7)
236         assert len(errors) == 0
237         assert grp.conf1.od1.i1 == conf2.od1.i1 == 7
238         assert grp.conf1.getowner(grp.conf1.unwrap_from_path('od1.i1')) is grp.conf2.getowner(grp.conf2.unwrap_from_path('od1.i1')) is owners.user
239
240
241 def test_group_find_firsts():
242     i1 = IntOption('i1', '')
243     od1 = OptionDescription('od1', '', [i1])
244     od2 = OptionDescription('od2', '', [od1])
245     conf1 = Config(od2, session_id='conf1')
246     conf2 = Config(od2, session_id='conf2')
247     grp = GroupConfig([conf1, conf2])
248     assert str(grp) == """(conf1)
249 (conf2)
250 """
251     assert [conf1, conf2] == grp.find_firsts(byname='i1').cfgimpl_get_children()
252
253
254 def test_group_group():
255     i1 = IntOption('i1', '')
256     od1 = OptionDescription('od1', '', [i1])
257     od2 = OptionDescription('od2', '', [od1])
258     conf1 = Config(od2, session_id='conf9')
259     conf2 = Config(od2, session_id='conf10')
260     grp = GroupConfig([conf1, conf2], 'grp')
261     grp2 = GroupConfig([grp])
262     errors = grp2.set_value('od1.i1', 2)
263     assert grp2.grp.conf9.od1.i1 == 2
264     assert grp2.grp.conf9.getowner(i1) == owners.user
265     assert len(errors) == 0
266
267
268 def test_meta_path():
269     meta = make_metaconfig()
270     assert meta._impl_path is None
271     assert meta.od1._impl_path == 'od1'
272
273
274 def test_meta_unconsistent():
275     i1 = IntOption('i1', '')
276     i2 = IntOption('i2', '', default=1)
277     i3 = IntOption('i3', '')
278     i4 = IntOption('i4', '', default=2)
279     od1 = OptionDescription('od1', '', [i1, i2, i3, i4])
280     od2 = OptionDescription('od2', '', [od1])
281     od3 = OptionDescription('od3', '', [od1])
282     conf1 = Config(od2, session_id='conf5')
283     conf2 = Config(od2, session_id='conf6')
284     conf3 = Config(od2, session_id='conf7')
285     conf4 = Config(od3, session_id='conf8')
286     conf3, conf4
287     meta = MetaConfig([conf1, conf2])
288     meta.cfgimpl_get_settings().setowner(owners.meta)
289     raises(TypeError, 'MetaConfig("string")')
290     #same descr but conf1 already in meta
291     raises(ValueError, "MetaConfig([conf1, conf3])")
292     #not same descr
293     raises(ValueError, "MetaConfig([conf3, conf4])")
294     raises(ConfigError, "meta.conf5.read_only()")
295
296
297 def test_meta_master_slaves():
298     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True)
299     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',))
300     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
301     interface1.impl_set_group_type(groups.master)
302     conf1 = Config(interface1, session_id='conf1')
303     conf2 = Config(interface1, session_id='conf2')
304     meta = MetaConfig([conf1, conf2])
305     meta.read_only()
306     assert [conf1, conf2] == meta.find_firsts(byname='ip_admin_eth0').cfgimpl_get_children()
307     assert [conf1, conf2] == meta.find_firsts(byname='netmask_admin_eth0').cfgimpl_get_children()
308     meta.read_write()
309     raises(AttributeError, "meta.find_firsts(byname='netmask_admin_eth0')")
310     assert [conf1, conf2] == meta.find_firsts(byname='netmask_admin_eth0',
311                                               check_properties=None).cfgimpl_get_children()
312     meta.read_only()
313     assert [conf1, conf2] == meta.find_firsts(byname='netmask_admin_eth0').cfgimpl_get_children()
314
315
316 def test_meta_master_slaves_value():
317     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True)
318     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',))
319     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
320     interface1.impl_set_group_type(groups.master)
321     conf1 = Config(interface1, session_id='conf1')
322     conf2 = Config(interface1, session_id='conf2')
323     meta = MetaConfig([conf1, conf2])
324     meta.conf1.ip_admin_eth0 = ['192.168.1.1']
325     assert meta.conf1.netmask_admin_eth0 == [None]
326     del(meta.conf1.ip_admin_eth0)
327     assert meta.conf1.netmask_admin_eth0 == []
328     meta.ip_admin_eth0 = ['192.168.1.1']
329     assert meta.conf1.netmask_admin_eth0 == [None]
330     meta.netmask_admin_eth0 = ['255.255.255.0']
331     assert meta.conf1.netmask_admin_eth0 == ['255.255.255.0']
332     meta.netmask_admin_eth0 = ['255.255.0.0']
333     assert meta.conf1.netmask_admin_eth0 == ['255.255.0.0']
334     meta.conf1.ip_admin_eth0 = ['192.168.1.1']
335     assert meta.conf1.netmask_admin_eth0 == [None]
336
337
338 def test_meta_master_slaves_value_default():
339     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1'])
340     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True)
341     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
342     interface1.impl_set_group_type(groups.master)
343     conf1 = Config(interface1, session_id='conf1')
344     conf2 = Config(interface1, session_id='conf2')
345     meta = MetaConfig([conf1, conf2])
346     assert meta.conf1.netmask_admin_eth0 == [None]
347     meta.ip_admin_eth0 = ['192.168.1.1']
348     assert meta.conf1.netmask_admin_eth0 == [None]
349     meta.netmask_admin_eth0 = ['255.255.255.0']
350     assert meta.conf1.netmask_admin_eth0 == ['255.255.255.0']
351     meta.netmask_admin_eth0 = ['255.255.0.0']
352     assert meta.conf1.netmask_admin_eth0 == ['255.255.0.0']
353     meta.conf1.ip_admin_eth0 = ['192.168.1.1']
354     assert meta.conf1.netmask_admin_eth0 == [None]
355
356
357 def test_meta_master_slaves_owners():
358     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True)
359     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',))
360     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
361     interface1.impl_set_group_type(groups.master)
362     conf1 = Config(interface1, session_id='conf1')
363     conf2 = Config(interface1, session_id='conf2')
364     meta = MetaConfig([conf1, conf2])
365     meta.cfgimpl_get_settings().setowner(owners.meta)
366     assert meta.conf1.getowner(ip_admin_eth0) == owners.default
367     assert meta.conf1.getowner(netmask_admin_eth0) == owners.default
368     meta.conf1.ip_admin_eth0 = ['192.168.1.1']
369     assert meta.conf1.getowner(ip_admin_eth0) == owners.user
370     assert meta.conf1.getowner(netmask_admin_eth0) == owners.default
371     del(meta.conf1.ip_admin_eth0)
372     assert meta.conf1.getowner(ip_admin_eth0) == owners.default
373     assert meta.conf1.getowner(netmask_admin_eth0) == owners.default
374     meta.ip_admin_eth0 = ['192.168.1.1']
375     assert meta.conf1.getowner(ip_admin_eth0) == owners.meta
376     assert meta.conf1.getowner(netmask_admin_eth0) == owners.default
377     meta.netmask_admin_eth0 = ['255.255.255.0']
378     assert meta.conf1.getowner(ip_admin_eth0) == owners.meta
379     assert meta.conf1.getowner(netmask_admin_eth0, 0) == owners.meta
380     meta.netmask_admin_eth0 = ['255.255.0.0']
381     assert meta.conf1.getowner(ip_admin_eth0) == owners.meta
382     assert meta.conf1.getowner(netmask_admin_eth0, 0) == owners.meta
383     meta.conf1.ip_admin_eth0 = ['192.168.1.1']
384     assert meta.conf1.getowner(ip_admin_eth0) == owners.user
385     assert meta.conf1.getowner(netmask_admin_eth0, 0) == owners.default
386
387
388 def test_meta_force_default():
389     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True)
390     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',))
391     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
392     interface1.impl_set_group_type(groups.master)
393     conf1 = Config(interface1, session_id='conf1')
394     conf1.read_write()
395     conf2 = Config(interface1, session_id='conf2')
396     conf2.read_write()
397     meta = MetaConfig([conf1, conf2])
398     meta.read_write()
399     meta.cfgimpl_get_settings().setowner(owners.meta)
400     assert meta.ip_admin_eth0 == []
401     assert meta.conf1.ip_admin_eth0 == []
402     assert meta.conf2.ip_admin_eth0 == []
403     errors = meta.set_value('ip_admin_eth0', ['192.168.1.1'])
404     assert len(errors) == 0
405     assert meta.ip_admin_eth0 == ['192.168.1.1']
406     assert meta.conf1.ip_admin_eth0 == ['192.168.1.1']
407     assert meta.conf2.ip_admin_eth0 == ['192.168.1.1']
408     errors = meta.conf1.ip_admin_eth0 = ['192.168.1.2']
409     assert meta.ip_admin_eth0 == ['192.168.1.1']
410     assert meta.conf1.ip_admin_eth0 == ['192.168.1.2']
411     assert meta.conf2.ip_admin_eth0 == ['192.168.1.1']
412     errors = meta.set_value('ip_admin_eth0', ['192.168.1.3'])
413     assert len(errors) == 0
414     assert meta.ip_admin_eth0 == ['192.168.1.3']
415     assert meta.conf1.ip_admin_eth0 == ['192.168.1.2']
416     assert meta.conf2.ip_admin_eth0 == ['192.168.1.3']
417     errors = meta.set_value('ip_admin_eth0', ['192.168.1.4'], force_default=True)
418     assert len(errors) == 0
419     assert meta.ip_admin_eth0 == ['192.168.1.4']
420     assert meta.conf1.ip_admin_eth0 == ['192.168.1.4']
421     assert meta.conf2.ip_admin_eth0 == ['192.168.1.4']
422
423
424 def test_meta_force_dont_change_value():
425     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True)
426     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',))
427     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
428     interface1.impl_set_group_type(groups.master)
429     conf1 = Config(interface1, session_id='conf1')
430     conf1.read_write()
431     conf2 = Config(interface1, session_id='conf2')
432     conf2.read_write()
433     meta = MetaConfig([conf1, conf2])
434     meta.read_write()
435     meta.cfgimpl_get_settings().setowner(owners.meta)
436     assert meta.ip_admin_eth0 == []
437     assert meta.conf1.ip_admin_eth0 == []
438     assert meta.conf2.ip_admin_eth0 == []
439     meta.conf1.ip_admin_eth0 = ['192.168.1.4']
440     assert meta.conf1.ip_admin_eth0 == ['192.168.1.4']
441     assert meta.conf2.ip_admin_eth0 == []
442     assert conf1.getowner(ip_admin_eth0) is owners.user
443     assert conf2.getowner(ip_admin_eth0) is owners.default
444     errors = meta.set_value('ip_admin_eth0', ['192.168.1.4'], force_dont_change_value=True)
445     assert len(errors) == 0
446     assert meta.ip_admin_eth0 == ['192.168.1.4']
447     assert meta.conf1.ip_admin_eth0 == ['192.168.1.4']
448     assert meta.conf2.ip_admin_eth0 == []
449     assert conf1.getowner(ip_admin_eth0) is owners.user
450     assert conf2.getowner(ip_admin_eth0) is owners.user
451
452
453 def test_meta_force_default_if_same():
454     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True)
455     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',))
456     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
457     interface1.impl_set_group_type(groups.master)
458     conf1 = Config(interface1, session_id='conf1')
459     conf1.read_write()
460     conf2 = Config(interface1, session_id='conf2')
461     conf2.read_write()
462     meta = MetaConfig([conf1, conf2])
463     meta.read_write()
464     meta.cfgimpl_get_settings().setowner(owners.meta)
465     #
466     assert meta.ip_admin_eth0 == []
467     assert meta.conf1.ip_admin_eth0 == []
468     assert meta.conf2.ip_admin_eth0 == []
469     #
470     meta.conf1.ip_admin_eth0 = ['192.168.1.4']
471     assert meta.conf1.ip_admin_eth0 == ['192.168.1.4']
472     assert meta.conf2.ip_admin_eth0 == []
473     assert conf1.getowner(ip_admin_eth0) is owners.user
474     assert conf2.getowner(ip_admin_eth0) is owners.default
475     errors = meta.set_value('ip_admin_eth0', ['192.168.1.4'], force_default_if_same=True)
476     assert len(errors) == 0
477     assert meta.ip_admin_eth0 == ['192.168.1.4']
478     assert meta.conf1.ip_admin_eth0 == ['192.168.1.4']
479     assert meta.conf2.ip_admin_eth0 == ['192.168.1.4']
480     assert conf1.getowner(ip_admin_eth0) is owners.meta
481     assert conf2.getowner(ip_admin_eth0) is owners.meta
482     #
483     meta.conf1.ip_admin_eth0 = ['192.168.1.3']
484     assert meta.conf1.ip_admin_eth0 == ['192.168.1.3']
485     assert meta.conf2.ip_admin_eth0 == ['192.168.1.4']
486     assert conf1.getowner(ip_admin_eth0) is owners.user
487     assert conf2.getowner(ip_admin_eth0) is owners.meta
488     errors = meta.set_value('ip_admin_eth0', ['192.168.1.5'], force_default_if_same=True)
489     assert len(errors) == 0
490     assert meta.ip_admin_eth0 == ['192.168.1.5']
491     assert meta.conf1.ip_admin_eth0 == ['192.168.1.3']
492     assert meta.conf2.ip_admin_eth0 == ['192.168.1.5']
493     assert conf1.getowner(ip_admin_eth0) is owners.user
494     assert conf2.getowner(ip_admin_eth0) is owners.meta
495
496
497 def test_meta_force_default_if_same_and_dont_change():
498     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True)
499     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',))
500     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
501     interface1.impl_set_group_type(groups.master)
502     conf1 = Config(interface1, session_id='conf1')
503     conf1.read_write()
504     conf2 = Config(interface1, session_id='conf2')
505     conf2.read_write()
506     meta = MetaConfig([conf1, conf2])
507     meta.read_write()
508     meta.cfgimpl_get_settings().setowner(owners.meta)
509     #
510     assert meta.ip_admin_eth0 == []
511     assert meta.conf1.ip_admin_eth0 == []
512     assert meta.conf2.ip_admin_eth0 == []
513     #
514     meta.conf1.ip_admin_eth0 = ['192.168.1.4']
515     assert meta.conf1.ip_admin_eth0 == ['192.168.1.4']
516     assert meta.conf2.ip_admin_eth0 == []
517     assert conf1.getowner(ip_admin_eth0) is owners.user
518     assert conf2.getowner(ip_admin_eth0) is owners.default
519     errors = meta.set_value('ip_admin_eth0', ['192.168.1.4'], force_default_if_same=True, force_dont_change_value=True)
520     assert len(errors) == 0
521     assert meta.ip_admin_eth0 == ['192.168.1.4']
522     assert meta.conf1.ip_admin_eth0 == ['192.168.1.4']
523     assert meta.conf2.ip_admin_eth0 == []
524     assert conf1.getowner(ip_admin_eth0) is owners.meta
525     assert conf2.getowner(ip_admin_eth0) is owners.user
526     #
527     meta.conf1.ip_admin_eth0 = ['192.168.1.3']
528     assert meta.conf1.ip_admin_eth0 == ['192.168.1.3']
529     assert meta.conf2.ip_admin_eth0 == []
530     assert conf1.getowner(ip_admin_eth0) is owners.user
531     assert conf2.getowner(ip_admin_eth0) is owners.user
532     errors = meta.set_value('ip_admin_eth0', ['192.168.1.5'], force_default_if_same=True, force_dont_change_value=True)
533     assert len(errors) == 0
534     assert meta.ip_admin_eth0 == ['192.168.1.5']
535     assert meta.conf1.ip_admin_eth0 == ['192.168.1.3']
536     assert meta.conf2.ip_admin_eth0 == []
537     assert conf1.getowner(ip_admin_eth0) is owners.user
538     assert conf2.getowner(ip_admin_eth0) is owners.user
539
540
541 def test_meta_force_default_and_dont_change():
542     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True)
543     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',))
544     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
545     interface1.impl_set_group_type(groups.master)
546     conf1 = Config(interface1, session_id='conf1')
547     conf1.read_write()
548     conf2 = Config(interface1, session_id='conf2')
549     conf2.read_write()
550     meta = MetaConfig([conf1, conf2])
551     meta.read_write()
552     meta.cfgimpl_get_settings().setowner(owners.meta)
553     raises(ValueError, "meta.set_value('ip_admin_eth0', ['192.168.1.4'], force_default=True, force_dont_change_value=True)")
554
555
556 def test_meta_properties_meta():
557     ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1'])
558     netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, properties=('disabled',))
559     netmask_admin_eth0.impl_add_consistency('network_netmask', ip_admin_eth0)
560     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
561     interface1.impl_set_group_type(groups.master)
562     conf1 = Config(interface1, session_id='conf1')
563     conf1.read_write()
564     conf2 = Config(interface1, session_id='conf2')
565     conf2.read_write()
566     meta = MetaConfig([conf1, conf2])
567     meta.read_write()
568     assert conf1.make_dict() == {}
569
570
571 def test_meta_exception_meta():
572     ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1'])
573     netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, callback=raise_exception)
574     netmask_admin_eth0.impl_add_consistency('network_netmask', ip_admin_eth0)
575     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
576     interface1.impl_set_group_type(groups.master)
577     conf1 = Config(interface1, session_id='conf1')
578     conf1.read_write()
579     conf2 = Config(interface1, session_id='conf2')
580     conf2.read_write()
581     meta = MetaConfig([conf1, conf2])
582     meta.read_write()
583     raises(Exception, "conf1.make_dict()")
584
585
586 def test_meta_callback():
587     val1 = StrOption('val1', "", 'val')
588     val2 = StrOption('val2', "", callback=return_value, callback_params={'': ((val1, False),)})
589     val3 = StrOption('val3', "", callback=return_value, callback_params={'': ('yes',)})
590     val4 = StrOption('val4', "", callback=return_value, callback_params={'value': ((val1, False),)})
591     val5 = StrOption('val5', "", callback=return_value, callback_params={'value': ('yes',)})
592     maconfig = OptionDescription('rootconfig', '', [val1, val2, val3, val4, val5])
593     cfg = Config(maconfig, session_id='cfg')
594     meta = MetaConfig([cfg])
595     meta.read_write()
596     assert meta.cfg.make_dict() == {'val3': 'yes', 'val2': 'val', 'val1': 'val', 'val5': 'yes', 'val4': 'val'}
597     meta.cfg.val1 = 'new'
598     assert meta.cfg.make_dict() == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new'}
599     del(meta.cfg.val1)
600     meta.val1 = 'new'
601     assert meta.cfg.make_dict() == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new'}
602     #del(meta.val1)
603     meta.cfg.val4 = 'new1'
604     assert meta.cfg.make_dict() == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new1'}
605     del(meta.cfg.val4)
606     meta.val4 = 'new1'
607     assert meta.cfg.make_dict() == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new1'}
608     del(meta.val4)
609
610
611 def test_meta_callback_slave():
612     val = StrOption('val', "", default='val')
613     val1 = StrOption('val1', "", multi=True, callback=return_value, callback_params={'': ((val, False),)})
614     val3 = StrOption('val2', "", multi=True, callback=return_value, callback_params={'': ((val1, False),)})
615     val4 = StrOption('val3', "", multi=True, callback=return_value, callback_params={'': ((val1, False),)})
616     interface1 = OptionDescription('val1', '', [val1, val3, val4])
617     interface1.impl_set_group_type(groups.master)
618     maconfig = OptionDescription('rootconfig', '', [val, interface1])
619     cfg = Config(maconfig, session_id='cfg')
620     meta = MetaConfig([cfg])
621     meta.read_write()
622     assert meta.cfg.make_dict() == {'val1.val2': ['val'], 'val1.val1': ['val'], 'val1.val3': ['val'], 'val': 'val'}
623     meta.cfg.val = 'val1'
624     assert meta.cfg.make_dict() == {'val1.val2': ['val1'], 'val1.val1': ['val1'], 'val1.val3': ['val1'], 'val': 'val1'}
625     del(meta.cfg.val)
626     meta.val = 'val1'
627     assert meta.cfg.make_dict() == {'val1.val2': ['val1'], 'val1.val1': ['val1'], 'val1.val3': ['val1'], 'val': 'val1'}
628     del(meta.val)
629     meta.cfg.val1.val2 = ['val2']
630     assert meta.cfg.make_dict() == {'val1.val2': ['val2'], 'val1.val1': ['val'], 'val1.val3': ['val'], 'val': 'val'}
631     del(meta.cfg.val1.val2)
632     assert meta.cfg.make_dict() == {'val1.val2': ['val'], 'val1.val1': ['val'], 'val1.val3': ['val'], 'val': 'val'}
633     meta.val1.val2 = ['val2']
634     assert meta.cfg.make_dict() == {'val1.val2': ['val2'], 'val1.val1': ['val'], 'val1.val3': ['val'], 'val': 'val'}
635     meta.cfg.val1.val3 = ['val6']
636     assert meta.cfg.make_dict() == {'val1.val2': ['val2'], 'val1.val1': ['val'], 'val1.val3': ['val6'], 'val': 'val'}
637     del(meta.val1.val2)
638     del(meta.cfg.val1.val3)
639     meta.cfg.val1.val1 = ['val3']
640     assert meta.cfg.make_dict() == {'val1.val2': ['val3'], 'val1.val1': ['val3'], 'val1.val3': ['val3'], 'val': 'val'}
641     del(meta.cfg.val1.val1)
642     assert meta.cfg.make_dict() == {'val1.val2': ['val'], 'val1.val1': ['val'], 'val1.val3': ['val'], 'val': 'val'}
643     meta.val1.val1 = ['val3']
644     assert meta.cfg.make_dict() == {'val1.val2': ['val3'], 'val1.val1': ['val3'], 'val1.val3': ['val3'], 'val': 'val'}
645     meta.cfg.val1.val2 = ['val2']
646     assert meta.cfg.make_dict() == {'val1.val2': ['val2'], 'val1.val1': ['val3'], 'val1.val3': ['val3'], 'val': 'val'}
647     meta.cfg.val1.val1.append('rah')
648     assert meta.cfg.make_dict() == {'val1.val2': ['val2', 'rah'], 'val1.val1': ['val3', 'rah'], 'val1.val3': ['val3', 'rah'], 'val': 'val'}
649     meta.val1.val1 = ['val4']
650     assert meta.cfg.make_dict() == {'val1.val2': ['val2', 'rah'], 'val1.val1': ['val3', 'rah'], 'val1.val3': ['val3', 'rah'], 'val': 'val'}
651
652
653 def test_meta_properties_meta_set_value():
654     ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1'])
655     netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, properties=('disabled',))
656     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
657     conf1 = Config(interface1, session_id='conf20')
658     conf2 = Config(interface1, session_id='conf21')
659     meta = MetaConfig([conf1, conf2])
660     meta.read_write()
661     assert conf1.make_dict() == {'ip_admin_eth0': ['192.168.1.1']}
662     ret = meta.set_value('netmask_admin_eth0', ['255.255.255.255'], only_config=True)
663     assert len(ret) == 2
664     assert isinstance(ret[0], PropertiesOptionError)
665     assert isinstance(ret[1], PropertiesOptionError)
666     ret = meta.set_value('netmask_admin_eth0', ['255.255.255.255'], force_default=True)
667     assert len(ret) == 1
668     assert isinstance(ret[0], PropertiesOptionError)
669     ret = meta.set_value('netmask_admin_eth0', ['255.255.255.255'], force_dont_change_value=True)
670     assert len(ret) == 3
671     assert isinstance(ret[0], PropertiesOptionError)
672     assert isinstance(ret[1], PropertiesOptionError)
673     assert isinstance(ret[2], PropertiesOptionError)
674     ret = meta.set_value('netmask_admin_eth0', ['255.255.255.255'], force_default_if_same=True)
675     assert len(ret) == 1
676     assert isinstance(ret[0], PropertiesOptionError)
677     ret = meta.set_value('ip_admin_eth0', '255.255.255.255', only_config=True)
678     assert len(ret) == 2
679     assert isinstance(ret[0], ValueError)
680     assert isinstance(ret[1], ValueError)
681     ret = meta.set_value('ip_admin_eth0', '255.255.255.255', force_default=True)
682     assert len(ret) == 1
683     assert isinstance(ret[0], ValueError)
684     ret = meta.set_value('ip_admin_eth0', '255.255.255.255', force_dont_change_value=True)
685     assert len(ret) == 1
686     assert isinstance(ret[0], ValueError)
687     ret = meta.set_value('ip_admin_eth0', '255.255.255.255', force_default_if_same=True)
688     assert len(ret) == 1
689     assert isinstance(ret[0], ValueError)
690
691
692 def test_meta_reset():
693     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True)
694     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',))
695     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
696     interface1.impl_set_group_type(groups.master)
697     conf22 = Config(interface1, session_id='conf22')
698     conf22.read_write()
699     conf23 = Config(interface1, session_id='conf23')
700     conf23.read_write()
701     meta = MetaConfig([conf22, conf23])
702     meta.read_write()
703     meta.cfgimpl_get_settings().setowner(owners.meta)
704     assert meta.ip_admin_eth0 == []
705     assert meta.conf22.ip_admin_eth0 == []
706     assert meta.conf23.ip_admin_eth0 == []
707     errors = meta.set_value('ip_admin_eth0', ['192.168.1.1'])
708     assert len(errors) == 0
709     assert meta.ip_admin_eth0 == ['192.168.1.1']
710     assert meta.conf22.ip_admin_eth0 == ['192.168.1.1']
711     assert meta.conf23.ip_admin_eth0 == ['192.168.1.1']
712     meta.conf22.ip_admin_eth0 = ['192.168.1.2']
713     assert meta.ip_admin_eth0 == ['192.168.1.1']
714     assert meta.conf22.ip_admin_eth0 == ['192.168.1.2']
715     assert meta.conf23.ip_admin_eth0 == ['192.168.1.1']
716     meta.reset('ip_admin_eth0')
717     assert meta.ip_admin_eth0 == []
718     assert meta.conf22.ip_admin_eth0 == []
719     assert meta.conf23.ip_admin_eth0 == []