* to "reset" a value, now you just have to delete it
[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
8 from py.test import raises
9
10
11 def make_description():
12     numero_etab = StrOption('numero_etab', "identifiant de l'établissement")
13     nom_machine = StrOption('nom_machine', "nom de la machine", default="eoleng")
14     nombre_interfaces = IntOption('nombre_interfaces', "nombre d'interfaces à activer",
15                                   default=1)
16     activer_proxy_client = BoolOption('activer_proxy_client', "utiliser un proxy",
17                                       default=False)
18     mode_conteneur_actif = BoolOption('mode_conteneur_actif', "le serveur est en mode conteneur",
19                                       default=False)
20     adresse_serveur_ntp = StrOption('serveur_ntp', "adresse serveur ntp", multi=True)
21     time_zone = ChoiceOption('time_zone', 'fuseau horaire du serveur',
22                              ('Paris', 'Londres'), 'Paris')
23
24     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé")
25     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau")
26
27     master = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
28     interface1 = OptionDescription('interface1', '', [master])
29     interface1.set_group_type(groups.family)
30
31     general = OptionDescription('general', '', [numero_etab, nom_machine,
32                                 nombre_interfaces, activer_proxy_client,
33                                 mode_conteneur_actif, adresse_serveur_ntp,
34                                 time_zone])
35     general.set_group_type(groups.family)
36     creole = OptionDescription('creole', 'first tiramisu configuration', [general, interface1])
37     descr = OptionDescription('baseconfig', 'baseconifgdescr', [creole])
38     return descr
39
40
41 def test_base_config():
42     descr = make_description()
43     config = Config(descr)
44     assert config.creole.general.activer_proxy_client is False
45     assert config.creole.general.nom_machine == "eoleng"
46     assert config.find_first(byname='nom_machine', type_='value') == "eoleng"
47     result = {'general.numero_etab': None, 'general.nombre_interfaces': 1,
48               'general.serveur_ntp': [], 'interface1.ip_admin_eth0.ip_admin_eth0': None,
49               'general.mode_conteneur_actif': False, 'general.time_zone': 'Paris',
50               'interface1.ip_admin_eth0.netmask_admin_eth0': None, 'general.nom_machine':
51               'eoleng', 'general.activer_proxy_client': False}
52     assert config.creole.make_dict() == result
53     result = {'serveur_ntp': [], 'mode_conteneur_actif': False,
54               'ip_admin_eth0': None, 'time_zone': 'Paris', 'numero_etab': None,
55               'netmask_admin_eth0': None, 'nom_machine': 'eoleng', 'activer_proxy_client':
56               False, 'nombre_interfaces': 1}
57     assert config.creole.make_dict(flatten=True) == result
58
59
60 def test_get_group_type():
61     descr = make_description()
62     config = Config(descr)
63     grp = config.unwrap_from_path('creole.general')
64     assert grp.get_group_type() == groups.family
65     assert grp.get_group_type() == 'family'
66     assert isinstance(grp.get_group_type(), groups.GroupType)
67     raises(TypeError, 'grp.set_group_type(groups.default)')
68
69
70 def test_iter_on_groups():
71     descr = make_description()
72     config = Config(descr)
73     result = list(config.creole.iter_groups(group_type=groups.family))
74     group_names = [res[0] for res in result]
75     assert group_names == ['general', 'interface1']
76
77
78 def test_iter_on_empty_group():
79     config = Config(OptionDescription("name", "descr", []))
80     result = list(config.iter_groups())
81     assert result == []
82     for i in config.iter_groups():
83         pass
84     for i in config:
85         pass
86     assert [] == list(config)
87
88
89 def test_groups_with_master():
90     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
91     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
92     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
93     interface1.set_group_type(groups.master)
94     assert interface1.get_group_type() == groups.master
95
96
97 def test_groups_with_master_in_config():
98     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
99     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
100     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
101     interface1.set_group_type(groups.master)
102     Config(interface1)
103     assert interface1.get_group_type() == groups.master
104
105
106 def test_allowed_groups():
107     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
108     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
109     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
110     raises(ValueError, "interface1.set_group_type('toto')")
111
112
113 def test_master_not_valid_name():
114     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
115     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
116     invalid_group = OptionDescription('interface1', '', [ip_admin_eth0, netmask_admin_eth0])
117     raises(ValueError, "invalid_group.set_group_type(groups.master)")
118
119
120 def test_sub_group_in_master_group():
121     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
122     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
123     subgroup = OptionDescription("subgroup", '', [])
124     invalid_group = OptionDescription('ip_admin_eth0', '', [subgroup, ip_admin_eth0, netmask_admin_eth0])
125     raises(ValueError, "invalid_group.set_group_type(groups.master)")
126
127
128 def test_group_always_has_multis():
129     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
130     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau")
131     group = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
132     raises(ValueError, "group.set_group_type(groups.master)")
133
134
135 #____________________________________________________________
136 def test_values_with_master_and_slaves():
137     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
138     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
139     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
140     interface1.set_group_type(groups.master)
141     maconfig = OptionDescription('toto', '', [interface1])
142     cfg = Config(maconfig)
143     opt = cfg.unwrap_from_path("ip_admin_eth0.ip_admin_eth0")
144     owner = cfg._cfgimpl_context._cfgimpl_settings.getowner()
145     assert interface1.get_group_type() == groups.master
146     assert cfg.cfgimpl_get_values().getowner(opt) == owners.default
147     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
148     assert  cfg.ip_admin_eth0.ip_admin_eth0 == ["192.168.230.145"]
149     assert cfg.cfgimpl_get_values().getowner(opt) == owner
150
151
152 def test_reset_values_with_master_and_slaves():
153     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
154     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
155     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
156     interface1.set_group_type(groups.master)
157     maconfig = OptionDescription('toto', '', [interface1])
158     cfg = Config(maconfig)
159     opt = cfg.unwrap_from_path("ip_admin_eth0.ip_admin_eth0")
160     owner = cfg._cfgimpl_context._cfgimpl_settings.getowner()
161     assert interface1.get_group_type() == groups.master
162     assert cfg.cfgimpl_get_values().getowner(opt) == owners.default
163     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
164     assert cfg.cfgimpl_get_values().getowner(opt) == owner
165     del(cfg.ip_admin_eth0.ip_admin_eth0)
166     assert cfg.cfgimpl_get_values().getowner(opt) == owners.default
167     assert  cfg.ip_admin_eth0.ip_admin_eth0 == []