* config herite from BaseInformation class
[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
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     adresse_serveur_ntp = StrOption('serveur_ntp', "adresse serveur ntp", multi=True)
22     time_zone = ChoiceOption('time_zone', 'fuseau horaire du serveur',
23                              ('Paris', 'Londres'), 'Paris')
24
25     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé")
26     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau")
27
28     master = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
29     interface1 = OptionDescription('interface1', '', [master])
30     interface1.impl_set_group_type(groups.family)
31
32     general = OptionDescription('general', '', [numero_etab, nom_machine,
33                                 nombre_interfaces, activer_proxy_client,
34                                 mode_conteneur_actif, adresse_serveur_ntp,
35                                 time_zone])
36     general.impl_set_group_type(groups.family)
37     creole = OptionDescription('creole', 'first tiramisu configuration', [general, interface1])
38     descr = OptionDescription('baseconfig', 'baseconifgdescr', [creole])
39     return descr
40
41
42 def test_base_config():
43     descr = make_description()
44     config = Config(descr)
45     assert config.creole.general.activer_proxy_client is False
46     assert config.creole.general.nom_machine == "eoleng"
47     assert config.find_first(byname='nom_machine', type_='value') == "eoleng"
48     result = {'general.numero_etab': None, 'general.nombre_interfaces': 1,
49               'general.serveur_ntp': [], 'interface1.ip_admin_eth0.ip_admin_eth0': None,
50               'general.mode_conteneur_actif': False, 'general.time_zone': 'Paris',
51               'interface1.ip_admin_eth0.netmask_admin_eth0': None, 'general.nom_machine':
52               'eoleng', 'general.activer_proxy_client': False}
53     assert config.creole.make_dict() == result
54     result = {'serveur_ntp': [], 'mode_conteneur_actif': False,
55               'ip_admin_eth0': None, 'time_zone': 'Paris', 'numero_etab': None,
56               'netmask_admin_eth0': None, 'nom_machine': 'eoleng', 'activer_proxy_client':
57               False, 'nombre_interfaces': 1}
58     assert config.creole.make_dict(flatten=True) == result
59
60
61 def test_make_dict_filter():
62     descr = make_description()
63     config = Config(descr)
64     result = {'general.numero_etab': None, 'general.nombre_interfaces': 1,
65               'general.serveur_ntp': [], 'general.mode_conteneur_actif': False,
66               'general.time_zone': 'Paris', 'general.nom_machine': 'eoleng',
67               'general.activer_proxy_client': False}
68     assert config.creole.make_dict(withoption='numero_etab') == result
69     raises(AttributeError, "config.creole.make_dict(withoption='numero_etab', withvalue='toto')")
70     assert config.creole.make_dict(withoption='numero_etab', withvalue=None) == result
71
72
73 def test_get_group_type():
74     descr = make_description()
75     config = Config(descr)
76     grp = config.unwrap_from_path('creole.general')
77     assert grp.impl_get_group_type() == groups.family
78     assert grp.impl_get_group_type() == 'family'
79     assert isinstance(grp.impl_get_group_type(), groups.GroupType)
80     raises(TypeError, 'grp.impl_set_group_type(groups.default)')
81
82
83 def test_iter_on_groups():
84     descr = make_description()
85     config = Config(descr)
86     result = list(config.creole.iter_groups(group_type=groups.family))
87     group_names = [res[0] for res in result]
88     assert group_names == ['general', 'interface1']
89
90
91 def test_iter_on_empty_group():
92     config = Config(OptionDescription("name", "descr", []))
93     result = list(config.iter_groups())
94     assert result == []
95     for i in config.iter_groups():
96         pass
97     for i in config:
98         pass
99     assert [] == list(config)
100
101
102 def test_groups_with_master():
103     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
104     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
105     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
106     interface1.impl_set_group_type(groups.master)
107     assert interface1.impl_get_group_type() == groups.master
108
109
110 def test_groups_with_master_in_config():
111     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
112     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
113     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
114     interface1.impl_set_group_type(groups.master)
115     Config(interface1)
116     assert interface1.impl_get_group_type() == groups.master
117
118
119 def test_allowed_groups():
120     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
121     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
122     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
123     raises(ValueError, "interface1.impl_set_group_type('toto')")
124
125
126 def test_master_not_valid_name():
127     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
128     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
129     invalid_group = OptionDescription('interface1', '', [ip_admin_eth0, netmask_admin_eth0])
130     raises(ValueError, "invalid_group.impl_set_group_type(groups.master)")
131
132
133 def test_sub_group_in_master_group():
134     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
135     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
136     subgroup = OptionDescription("subgroup", '', [])
137     invalid_group = OptionDescription('ip_admin_eth0', '', [subgroup, ip_admin_eth0, netmask_admin_eth0])
138     raises(ValueError, "invalid_group.impl_set_group_type(groups.master)")
139
140
141 def test_group_always_has_multis():
142     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
143     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau")
144     group = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
145     raises(ValueError, "group.impl_set_group_type(groups.master)")
146
147
148 #____________________________________________________________
149 def test_values_with_master_and_slaves():
150     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
151     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
152     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
153     interface1.impl_set_group_type(groups.master)
154     maconfig = OptionDescription('toto', '', [interface1])
155     cfg = Config(maconfig)
156     owner = cfg.cfgimpl_get_settings().getowner()
157     assert interface1.impl_get_group_type() == groups.master
158     assert cfg.getowner("ip_admin_eth0.ip_admin_eth0") == owners.default
159     assert cfg.getowner("ip_admin_eth0.netmask_admin_eth0") == owners.default
160     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
161     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
162     assert cfg.ip_admin_eth0.ip_admin_eth0 == ["192.168.230.145"]
163     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [None]
164     assert cfg.getowner("ip_admin_eth0.ip_admin_eth0") == owner
165     assert cfg.getowner("ip_admin_eth0.netmask_admin_eth0") == owners.default
166
167
168 def test_reset_values_with_master_and_slaves():
169     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
170     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
171     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
172     interface1.impl_set_group_type(groups.master)
173     maconfig = OptionDescription('toto', '', [interface1])
174     cfg = Config(maconfig)
175     owner = cfg.cfgimpl_get_settings().getowner()
176     assert interface1.impl_get_group_type() == groups.master
177     assert cfg.getowner("ip_admin_eth0.ip_admin_eth0") == owners.default
178     assert cfg.getowner("ip_admin_eth0.netmask_admin_eth0") == owners.default
179     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
180     assert cfg.getowner("ip_admin_eth0.ip_admin_eth0") == owner
181     assert cfg.getowner("ip_admin_eth0.netmask_admin_eth0") == owners.default
182     del(cfg.ip_admin_eth0.ip_admin_eth0)
183     assert cfg.getowner("ip_admin_eth0.ip_admin_eth0") == owners.default
184     assert cfg.getowner("ip_admin_eth0.netmask_admin_eth0") == owners.default
185     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
186     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
187
188
189 def test_values_with_master_and_slaves_slave():
190     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
191     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
192     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
193     interface1.impl_set_group_type(groups.master)
194     maconfig = OptionDescription('toto', '', [interface1])
195     cfg = Config(maconfig)
196     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
197     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']")
198     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
199     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']
200     cfg.ip_admin_eth0.netmask_admin_eth0[0] = '255.255.255.0'
201     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']")
202     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = []")
203     del(cfg.ip_admin_eth0.netmask_admin_eth0)
204     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0']
205     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
206     assert cfg.ip_admin_eth0.netmask_admin_eth0 == ['255.255.255.0', None]
207     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']
208     raises(SlaveError, 'cfg.ip_admin_eth0.netmask_admin_eth0.pop(1)')
209
210
211 def test_values_with_master_and_slaves_master():
212     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
213     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
214     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
215     interface1.impl_set_group_type(groups.master)
216     maconfig = OptionDescription('toto', '', [interface1])
217     cfg = Config(maconfig)
218     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
219     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145"]
220     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145", "192.168.230.145"]
221     cfg.ip_admin_eth0.netmask_admin_eth0 = ['255.255.255.0', '255.255.255.0']
222     raises(SlaveError, 'cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145"]')
223     cfg.ip_admin_eth0.ip_admin_eth0.pop(1)
224     assert cfg.ip_admin_eth0.ip_admin_eth0 == ["192.168.230.145"]