python 3.5 support
[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
10
11 owners.addowner('meta')
12
13
14 def raise_exception():
15     raise Exception('test')
16
17
18 def make_description():
19     i1 = IntOption('i1', '')
20     i2 = IntOption('i2', '', default=1)
21     i3 = IntOption('i3', '')
22     i4 = IntOption('i4', '', default=2)
23     i5 = IntOption('i5', '', default=[2], multi=True)
24     i6 = IntOption('i6', '', properties=('disabled',))
25     od1 = OptionDescription('od1', '', [i1, i2, i3, i4, i5, i6])
26     od2 = OptionDescription('od2', '', [od1])
27     conf1 = Config(od2, name='conf1')
28     conf2 = Config(od2, name='conf2')
29     conf1.read_write()
30     conf2.read_write()
31     meta = MetaConfig([conf1, conf2], name='meta')
32     meta.cfgimpl_get_settings().setowner(owners.meta)
33     return meta
34
35
36 #FIXME ne pas mettre 2 meta dans une config
37 #FIXME ne pas mettre 2 OD differents dans un meta
38 #FIXME serialization
39 def test_none():
40     meta = make_description()
41     conf1, conf2 = meta.cfgimpl_get_children()
42     assert conf1.od1.i3 is conf2.od1.i3 is None
43     assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.default
44     meta.od1.i3 = 3
45     assert conf1.od1.i3 == conf2.od1.i3 == 3
46     assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.meta
47     meta.od1.i3 = 3
48     conf1.od1.i3 = 2
49     assert conf1.od1.i3 == 2
50     assert conf2.od1.i3 == 3
51     assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is owners.user
52     assert conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.meta
53     meta.od1.i3 = 4
54     assert conf1.od1.i3 == 2
55     assert conf2.od1.i3 == 4
56     assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is owners.user
57     assert conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.meta
58     del(meta.od1.i3)
59     assert conf1.od1.i3 == 2
60     assert conf2.od1.i3 is None
61     assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is owners.user
62     assert conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.default
63     del(conf1.od1.i3)
64     assert conf1.od1.i3 is conf2.od1.i3 is None
65     assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.default
66
67
68 def test_default():
69     meta = make_description()
70     conf1, conf2 = meta.cfgimpl_get_children()
71     assert conf1.od1.i2 == conf2.od1.i2 == 1
72     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
73     meta.od1.i2 = 3
74     assert conf1.od1.i2 == conf2.od1.i2 == 3
75     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
76     meta.od1.i2 = 3
77     conf1.od1.i2 = 2
78     assert conf1.od1.i2 == 2
79     assert conf2.od1.i2 == 3
80     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is owners.user
81     assert conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
82     meta.od1.i2 = 4
83     assert conf1.od1.i2 == 2
84     assert conf2.od1.i2 == 4
85     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is owners.user
86     assert conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
87     del(meta.od1.i2)
88     assert conf1.od1.i2 == 2
89     assert conf2.od1.i2 == 1
90     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is owners.user
91     assert conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
92     del(conf1.od1.i2)
93     assert conf1.od1.i2 == conf2.od1.i2 == 1
94     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
95
96
97 def test_contexts():
98     meta = make_description()
99     conf1, conf2 = meta.cfgimpl_get_children()
100     assert conf1.od1.i2 == conf2.od1.i2 == 1
101     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
102     meta.set_value('od1.i2', 6, only_config=True)
103     assert meta.od1.i2 == 1
104     assert conf1.od1.i2 == conf2.od1.i2 == 6
105     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.user
106
107
108 def test_find():
109     meta = make_description()
110     i2 = meta.unwrap_from_path('od1.i2')
111     assert [i2] == meta.find(byname='i2')
112     assert i2 == meta.find_first(byname='i2')
113     assert meta.make_dict() == {'od1.i4': 2, 'od1.i1': None, 'od1.i3': None,
114                                 'od1.i2': 1, 'od1.i5': [2], 'od1.i6': None}
115
116
117 def test_group_error():
118     raises(ValueError, "GroupConfig('str')")
119     raises(ValueError, "GroupConfig(['str'])")
120
121
122 def test_meta_meta():
123     meta1 = make_description()
124     meta2 = MetaConfig([meta1])
125     meta2.cfgimpl_get_settings().setowner(owners.meta)
126     conf1, conf2 = meta1.cfgimpl_get_children()
127     assert conf1.od1.i2 == conf2.od1.i2 == 1
128     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
129     meta2.od1.i2 = 3
130     assert conf1.od1.i2 == conf2.od1.i2 == 3
131     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
132     meta2.od1.i2 = 3
133     conf1.od1.i2 = 2
134     assert conf1.od1.i2 == 2
135     assert conf2.od1.i2 == 3
136     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is owners.user
137     assert conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
138     meta2.od1.i2 = 4
139     assert conf1.od1.i2 == 2
140     assert conf2.od1.i2 == 4
141     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is owners.user
142     assert conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
143     del(meta2.od1.i2)
144     assert conf1.od1.i2 == 2
145     assert conf2.od1.i2 == 1
146     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is owners.user
147     assert conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
148     del(conf1.od1.i2)
149     assert conf1.od1.i2 == conf2.od1.i2 == 1
150     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
151     meta1.od1.i2 = 6
152     assert conf1.od1.i2 == conf2.od1.i2 == 6
153     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
154
155
156 def test_meta_meta_set():
157     meta1 = make_description()
158     meta2 = MetaConfig([meta1])
159     meta2.cfgimpl_get_settings().setowner(owners.meta)
160     conf1, conf2 = meta1.cfgimpl_get_children()
161     meta2.set_value('od1.i1', 7, only_config=True)
162     meta2.set_value('od1.i6', 7, only_config=True)
163     assert conf1.od1.i1 == conf2.od1.i1 == 7
164     assert conf1.getowner(conf1.unwrap_from_path('od1.i1')) is conf2.getowner(conf2.unwrap_from_path('od1.i1')) is owners.user
165     assert [conf1, conf2] == meta2.find_firsts(byname='i1', byvalue=7).cfgimpl_get_children()
166     conf1.od1.i1 = 8
167     assert [conf1, conf2] == meta2.find_firsts(byname='i1').cfgimpl_get_children()
168     assert [conf2] == meta2.find_firsts(byname='i1', byvalue=7).cfgimpl_get_children()
169     assert [conf1] == meta2.find_firsts(byname='i1', byvalue=8).cfgimpl_get_children()
170     assert [conf1, conf2] == meta2.find_firsts(byname='i5', byvalue=2).cfgimpl_get_children()
171     raises(AttributeError, "meta2.find_firsts(byname='i1', byvalue=10)")
172     raises(AttributeError, "meta2.find_firsts(byname='not', byvalue=10)")
173     raises(AttributeError, "meta2.find_firsts(byname='i6')")
174     raises(ValueError, "meta2.set_value('od1.i6', 7, only_config=True, force_default=True)")
175     raises(ValueError, "meta2.set_value('od1.i6', 7, only_config=True, force_default_if_same=True)")
176     raises(ValueError, "meta2.set_value('od1.i6', 7, only_config=True, force_dont_change_value=True)")
177
178
179 def test_not_meta():
180     i1 = IntOption('i1', '')
181     od1 = OptionDescription('od1', '', [i1])
182     od2 = OptionDescription('od2', '', [od1])
183     conf1 = Config(od2, name='conf1')
184     conf2 = Config(od2, name='conf2')
185     conf3 = Config(od2)
186     conf4 = Config(od2, name='conf2')
187     conf3, conf4
188     raises(ValueError, "GroupConfig(conf1)")
189     #same name
190     raises(ConflictError, "GroupConfig([conf2, conf4])")
191     grp = GroupConfig([conf1, conf2])
192     raises(ConfigError, 'grp.od1.i1')
193     conf1, conf2 = grp.cfgimpl_get_children()
194     grp.set_value('od1.i1', 7)
195     assert grp.conf1.od1.i1 == conf2.od1.i1 == 7
196     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
197
198
199 def test_group_find_firsts():
200     i1 = IntOption('i1', '')
201     od1 = OptionDescription('od1', '', [i1])
202     od2 = OptionDescription('od2', '', [od1])
203     conf1 = Config(od2, name='conf1')
204     conf2 = Config(od2, name='conf2')
205     grp = GroupConfig([conf1, conf2])
206     assert [conf1, conf2] == grp.find_firsts(byname='i1').cfgimpl_get_children()
207
208
209 def test_group_group():
210     i1 = IntOption('i1', '')
211     od1 = OptionDescription('od1', '', [i1])
212     od2 = OptionDescription('od2', '', [od1])
213     conf1 = Config(od2, name='conf1')
214     conf2 = Config(od2, name='conf2')
215     grp = GroupConfig([conf1, conf2])
216     raises(ValueError, "GroupConfig([grp])")
217     grp = GroupConfig([conf1, conf2], 'grp')
218     grp2 = GroupConfig([grp])
219     grp2.set_value('od1.i1', 2)
220     assert grp2.grp.conf1.od1.i1 == 2
221     assert grp2.grp.conf1.getowner(i1) == owners.user
222
223
224 def test_meta_path():
225     meta = make_description()
226     assert meta._impl_path is None
227     assert meta.od1._impl_path == 'od1'
228
229
230 def test_meta_unconsistent():
231     i1 = IntOption('i1', '')
232     i2 = IntOption('i2', '', default=1)
233     i3 = IntOption('i3', '')
234     i4 = IntOption('i4', '', default=2)
235     od1 = OptionDescription('od1', '', [i1, i2, i3, i4])
236     od2 = OptionDescription('od2', '', [od1])
237     od3 = OptionDescription('od3', '', [od1])
238     conf1 = Config(od2, name='conf1')
239     conf2 = Config(od2, name='conf2')
240     conf3 = Config(od2, name='conf3')
241     conf4 = Config(od3, name='conf4')
242     conf3, conf4
243     meta = MetaConfig([conf1, conf2])
244     meta.cfgimpl_get_settings().setowner(owners.meta)
245     raises(TypeError, 'MetaConfig("string")')
246     #same descr but conf1 already in meta
247     raises(ValueError, "MetaConfig([conf1, conf3])")
248     #not same descr
249     raises(ValueError, "MetaConfig([conf3, conf4])")
250
251
252 def test_meta_master_slaves():
253     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True)
254     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',))
255     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
256     interface1.impl_set_group_type(groups.master)
257     conf1 = Config(interface1, name='conf1')
258     conf2 = Config(interface1, name='conf2')
259     meta = MetaConfig([conf1, conf2])
260     meta.conf1.read_only()
261     meta.conf2.read_only()
262     assert [conf1, conf2] == meta.find_firsts(byname='netmask_admin_eth0').cfgimpl_get_children()
263     meta.conf1.read_write()
264     meta.conf2.read_only()
265     assert [conf2] == meta.find_firsts(byname='netmask_admin_eth0').cfgimpl_get_children()
266     meta.conf2.read_write()
267     raises(AttributeError, "meta.find_firsts(byname='netmask_admin_eth0')")
268     assert [conf1, conf2] == meta.find_firsts(byname='netmask_admin_eth0',
269                                               check_properties=None).cfgimpl_get_children()
270     meta.conf1.read_only()
271     meta.conf2.read_only()
272     meta.read_write()
273     assert [conf1, conf2] == meta.find_firsts(byname='netmask_admin_eth0').cfgimpl_get_children()
274
275
276 def test_meta_master_slaves_value():
277     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True)
278     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',))
279     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
280     interface1.impl_set_group_type(groups.master)
281     conf1 = Config(interface1, name='conf1')
282     conf2 = Config(interface1, name='conf2')
283     meta = MetaConfig([conf1, conf2])
284     meta.conf1.ip_admin_eth0 = ['192.168.1.1']
285     assert meta.conf1.netmask_admin_eth0 == [None]
286     del(meta.conf1.ip_admin_eth0)
287     assert meta.conf1.netmask_admin_eth0 == []
288     meta.ip_admin_eth0 = ['192.168.1.1']
289     assert meta.conf1.netmask_admin_eth0 == [None]
290     meta.netmask_admin_eth0 = ['255.255.255.0']
291     assert meta.conf1.netmask_admin_eth0 == ['255.255.255.0']
292     meta.netmask_admin_eth0 = ['255.255.0.0']
293     assert meta.conf1.netmask_admin_eth0 == ['255.255.0.0']
294     meta.conf1.ip_admin_eth0 = ['192.168.1.1']
295     assert meta.conf1.netmask_admin_eth0 == [None]
296
297
298 def test_meta_master_slaves_value_default():
299     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1'])
300     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True)
301     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
302     interface1.impl_set_group_type(groups.master)
303     conf1 = Config(interface1, name='conf1')
304     conf2 = Config(interface1, name='conf2')
305     meta = MetaConfig([conf1, conf2])
306     assert meta.conf1.netmask_admin_eth0 == [None]
307     meta.ip_admin_eth0 = ['192.168.1.1']
308     assert meta.conf1.netmask_admin_eth0 == [None]
309     meta.netmask_admin_eth0 = ['255.255.255.0']
310     assert meta.conf1.netmask_admin_eth0 == ['255.255.255.0']
311     meta.netmask_admin_eth0 = ['255.255.0.0']
312     assert meta.conf1.netmask_admin_eth0 == ['255.255.0.0']
313     meta.conf1.ip_admin_eth0 = ['192.168.1.1']
314     assert meta.conf1.netmask_admin_eth0 == [None]
315
316
317 def test_meta_master_slaves_owners():
318     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True)
319     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',))
320     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
321     interface1.impl_set_group_type(groups.master)
322     conf1 = Config(interface1, name='conf1')
323     conf2 = Config(interface1, name='conf2')
324     meta = MetaConfig([conf1, conf2])
325     meta.cfgimpl_get_settings().setowner(owners.meta)
326     assert meta.conf1.getowner(ip_admin_eth0) == owners.default
327     assert meta.conf1.getowner(netmask_admin_eth0) == owners.default
328     meta.conf1.ip_admin_eth0 = ['192.168.1.1']
329     assert meta.conf1.getowner(ip_admin_eth0) == owners.user
330     assert meta.conf1.getowner(netmask_admin_eth0) == owners.default
331     del(meta.conf1.ip_admin_eth0)
332     assert meta.conf1.getowner(ip_admin_eth0) == owners.default
333     assert meta.conf1.getowner(netmask_admin_eth0) == owners.default
334     meta.ip_admin_eth0 = ['192.168.1.1']
335     assert meta.conf1.getowner(ip_admin_eth0) == owners.meta
336     assert meta.conf1.getowner(netmask_admin_eth0) == owners.default
337     meta.netmask_admin_eth0 = ['255.255.255.0']
338     assert meta.conf1.getowner(ip_admin_eth0) == owners.meta
339     assert meta.conf1.getowner(netmask_admin_eth0, 0) == owners.meta
340     meta.netmask_admin_eth0 = ['255.255.0.0']
341     assert meta.conf1.getowner(ip_admin_eth0) == owners.meta
342     assert meta.conf1.getowner(netmask_admin_eth0, 0) == owners.meta
343     meta.conf1.ip_admin_eth0 = ['192.168.1.1']
344     assert meta.conf1.getowner(ip_admin_eth0) == owners.user
345     assert meta.conf1.getowner(netmask_admin_eth0, 0) == owners.default
346
347
348 def test_meta_force_default():
349     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True)
350     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',))
351     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
352     interface1.impl_set_group_type(groups.master)
353     conf1 = Config(interface1, name='conf1')
354     conf1.read_write()
355     conf2 = Config(interface1, name='conf2')
356     conf2.read_write()
357     meta = MetaConfig([conf1, conf2])
358     meta.read_write()
359     meta.cfgimpl_get_settings().setowner(owners.meta)
360     assert meta.ip_admin_eth0 == []
361     assert meta.conf1.ip_admin_eth0 == []
362     assert meta.conf2.ip_admin_eth0 == []
363     meta.set_value('ip_admin_eth0', ['192.168.1.1'])
364     assert meta.ip_admin_eth0 == ['192.168.1.1']
365     assert meta.conf1.ip_admin_eth0 == ['192.168.1.1']
366     assert meta.conf2.ip_admin_eth0 == ['192.168.1.1']
367     meta.conf1.ip_admin_eth0 = ['192.168.1.2']
368     assert meta.ip_admin_eth0 == ['192.168.1.1']
369     assert meta.conf1.ip_admin_eth0 == ['192.168.1.2']
370     assert meta.conf2.ip_admin_eth0 == ['192.168.1.1']
371     meta.set_value('ip_admin_eth0', ['192.168.1.3'])
372     assert meta.ip_admin_eth0 == ['192.168.1.3']
373     assert meta.conf1.ip_admin_eth0 == ['192.168.1.2']
374     assert meta.conf2.ip_admin_eth0 == ['192.168.1.3']
375     meta.set_value('ip_admin_eth0', ['192.168.1.4'], force_default=True)
376     assert meta.ip_admin_eth0 == ['192.168.1.4']
377     assert meta.conf1.ip_admin_eth0 == ['192.168.1.4']
378     assert meta.conf2.ip_admin_eth0 == ['192.168.1.4']
379
380
381 def test_meta_force_dont_change_value():
382     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True)
383     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',))
384     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
385     interface1.impl_set_group_type(groups.master)
386     conf1 = Config(interface1, name='conf1')
387     conf1.read_write()
388     conf2 = Config(interface1, name='conf2')
389     conf2.read_write()
390     meta = MetaConfig([conf1, conf2])
391     meta.read_write()
392     meta.cfgimpl_get_settings().setowner(owners.meta)
393     assert meta.ip_admin_eth0 == []
394     assert meta.conf1.ip_admin_eth0 == []
395     assert meta.conf2.ip_admin_eth0 == []
396     meta.conf1.ip_admin_eth0 = ['192.168.1.4']
397     assert meta.conf1.ip_admin_eth0 == ['192.168.1.4']
398     assert meta.conf2.ip_admin_eth0 == []
399     assert conf1.getowner(ip_admin_eth0) is owners.user
400     assert conf2.getowner(ip_admin_eth0) is owners.default
401     meta.set_value('ip_admin_eth0', ['192.168.1.4'], force_dont_change_value=True)
402     assert meta.ip_admin_eth0 == ['192.168.1.4']
403     assert meta.conf1.ip_admin_eth0 == ['192.168.1.4']
404     assert meta.conf2.ip_admin_eth0 == []
405     assert conf1.getowner(ip_admin_eth0) is owners.user
406     assert conf2.getowner(ip_admin_eth0) is owners.user
407
408
409 def test_meta_force_default_if_same():
410     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True)
411     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',))
412     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
413     interface1.impl_set_group_type(groups.master)
414     conf1 = Config(interface1, name='conf1')
415     conf1.read_write()
416     conf2 = Config(interface1, name='conf2')
417     conf2.read_write()
418     meta = MetaConfig([conf1, conf2])
419     meta.read_write()
420     meta.cfgimpl_get_settings().setowner(owners.meta)
421     #
422     assert meta.ip_admin_eth0 == []
423     assert meta.conf1.ip_admin_eth0 == []
424     assert meta.conf2.ip_admin_eth0 == []
425     #
426     meta.conf1.ip_admin_eth0 = ['192.168.1.4']
427     assert meta.conf1.ip_admin_eth0 == ['192.168.1.4']
428     assert meta.conf2.ip_admin_eth0 == []
429     assert conf1.getowner(ip_admin_eth0) is owners.user
430     assert conf2.getowner(ip_admin_eth0) is owners.default
431     meta.set_value('ip_admin_eth0', ['192.168.1.4'], force_default_if_same=True)
432     assert meta.ip_admin_eth0 == ['192.168.1.4']
433     assert meta.conf1.ip_admin_eth0 == ['192.168.1.4']
434     assert meta.conf2.ip_admin_eth0 == ['192.168.1.4']
435     assert conf1.getowner(ip_admin_eth0) is owners.meta
436     assert conf2.getowner(ip_admin_eth0) is owners.meta
437     #
438     meta.conf1.ip_admin_eth0 = ['192.168.1.3']
439     assert meta.conf1.ip_admin_eth0 == ['192.168.1.3']
440     assert meta.conf2.ip_admin_eth0 == ['192.168.1.4']
441     assert conf1.getowner(ip_admin_eth0) is owners.user
442     assert conf2.getowner(ip_admin_eth0) is owners.meta
443     meta.set_value('ip_admin_eth0', ['192.168.1.5'], force_default_if_same=True)
444     assert meta.ip_admin_eth0 == ['192.168.1.5']
445     assert meta.conf1.ip_admin_eth0 == ['192.168.1.3']
446     assert meta.conf2.ip_admin_eth0 == ['192.168.1.5']
447     assert conf1.getowner(ip_admin_eth0) is owners.user
448     assert conf2.getowner(ip_admin_eth0) is owners.meta
449
450
451 def test_meta_force_default_if_same_and_dont_change():
452     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True)
453     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',))
454     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
455     interface1.impl_set_group_type(groups.master)
456     conf1 = Config(interface1, name='conf1')
457     conf1.read_write()
458     conf2 = Config(interface1, name='conf2')
459     conf2.read_write()
460     meta = MetaConfig([conf1, conf2])
461     meta.read_write()
462     meta.cfgimpl_get_settings().setowner(owners.meta)
463     #
464     assert meta.ip_admin_eth0 == []
465     assert meta.conf1.ip_admin_eth0 == []
466     assert meta.conf2.ip_admin_eth0 == []
467     #
468     meta.conf1.ip_admin_eth0 = ['192.168.1.4']
469     assert meta.conf1.ip_admin_eth0 == ['192.168.1.4']
470     assert meta.conf2.ip_admin_eth0 == []
471     assert conf1.getowner(ip_admin_eth0) is owners.user
472     assert conf2.getowner(ip_admin_eth0) is owners.default
473     meta.set_value('ip_admin_eth0', ['192.168.1.4'], force_default_if_same=True, force_dont_change_value=True)
474     assert meta.ip_admin_eth0 == ['192.168.1.4']
475     assert meta.conf1.ip_admin_eth0 == ['192.168.1.4']
476     assert meta.conf2.ip_admin_eth0 == []
477     assert conf1.getowner(ip_admin_eth0) is owners.meta
478     assert conf2.getowner(ip_admin_eth0) is owners.user
479     #
480     meta.conf1.ip_admin_eth0 = ['192.168.1.3']
481     assert meta.conf1.ip_admin_eth0 == ['192.168.1.3']
482     assert meta.conf2.ip_admin_eth0 == []
483     assert conf1.getowner(ip_admin_eth0) is owners.user
484     assert conf2.getowner(ip_admin_eth0) is owners.user
485     meta.set_value('ip_admin_eth0', ['192.168.1.5'], force_default_if_same=True, force_dont_change_value=True)
486     assert meta.ip_admin_eth0 == ['192.168.1.5']
487     assert meta.conf1.ip_admin_eth0 == ['192.168.1.3']
488     assert meta.conf2.ip_admin_eth0 == []
489     assert conf1.getowner(ip_admin_eth0) is owners.user
490     assert conf2.getowner(ip_admin_eth0) is owners.user
491
492
493 def test_meta_force_default_and_dont_change():
494     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip", multi=True)
495     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "mask", multi=True, properties=('hidden',))
496     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
497     interface1.impl_set_group_type(groups.master)
498     conf1 = Config(interface1, name='conf1')
499     conf1.read_write()
500     conf2 = Config(interface1, name='conf2')
501     conf2.read_write()
502     meta = MetaConfig([conf1, conf2])
503     meta.read_write()
504     meta.cfgimpl_get_settings().setowner(owners.meta)
505     raises(ValueError, "meta.set_value('ip_admin_eth0', ['192.168.1.4'], force_default=True, force_dont_change_value=True)")
506
507
508 def test_meta_properties_meta():
509     ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1'])
510     netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, properties=('disabled',))
511     netmask_admin_eth0.impl_add_consistency('network_netmask', ip_admin_eth0)
512     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
513     interface1.impl_set_group_type(groups.master)
514     conf1 = Config(interface1, name='conf1')
515     conf1.read_write()
516     conf2 = Config(interface1, name='conf2')
517     conf2.read_write()
518     meta = MetaConfig([conf1, conf2])
519     meta.read_write()
520     assert conf1.make_dict() == {}
521
522
523 def test_meta_exception_meta():
524     ip_admin_eth0 = NetworkOption('ip_admin_eth0', "ip", multi=True, default=['192.168.1.1'])
525     netmask_admin_eth0 = NetmaskOption('netmask_admin_eth0', "mask", multi=True, callback=raise_exception)
526     netmask_admin_eth0.impl_add_consistency('network_netmask', ip_admin_eth0)
527     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
528     interface1.impl_set_group_type(groups.master)
529     conf1 = Config(interface1, name='conf1')
530     conf1.read_write()
531     conf2 = Config(interface1, name='conf2')
532     conf2.read_write()
533     meta = MetaConfig([conf1, conf2])
534     meta.read_write()
535     raises(Exception, "conf1.make_dict()")