vigiboard / vigiboard / tests / functional / plugins / test_details_plugin_maps.py @ dc005588
History | View | Annotate | Download (11.1 KB)
1 | dc005588 | Francois POIROTTE | # -*- coding: utf-8 -*-
|
---|---|---|---|
2 | # Copyright (C) 2006-2011 CS-SI
|
||
3 | # License: GNU GPL v2 <http://www.gnu.org/licenses/gpl-2.0.html>
|
||
4 | |||
5 | """
|
||
6 | Teste la partie "Cartes" du formulaire contenant les détails
|
||
7 | pour un événement corrélé.
|
||
8 | """
|
||
9 | from datetime import datetime |
||
10 | import transaction |
||
11 | |||
12 | from vigiboard.tests import TestController |
||
13 | from vigilo.models.session import DBSession |
||
14 | from vigilo.models.demo import functions |
||
15 | from vigilo.models.tables import Permission, CorrEvent, Host, LowLevelService |
||
16 | |||
17 | class TestDetailsPluginMapsHostLimited(TestController): |
||
18 | """
|
||
19 | Teste l'affichage des cartes dans le module de détails
|
||
20 | lorsqu'une limite à été réglée pour l'affichage.
|
||
21 | """
|
||
22 | application_under_test = 'limited_maps'
|
||
23 | # Seules les 2 premières cartes doivent figurer.
|
||
24 | # La 1ère correspond à la limite, la 2 seconde permet
|
||
25 | # de détecter qu'il y avait plus de cartes que la limite.
|
||
26 | manager = {'1': 'M1', '2': 'M2'} |
||
27 | # L'utilisateur avec droits étendus voit
|
||
28 | # la même chose que le manager (2 cartes).
|
||
29 | unrestricted = manager.copy() |
||
30 | # L'utilisateur avec droits restreints ne voit
|
||
31 | # qu'une seule carte : "M2".
|
||
32 | restricted = {'2': 'M2'} |
||
33 | supitem_class = Host |
||
34 | |||
35 | def shortDescription(self, *args, **kwargs): |
||
36 | """Description courte du test en cours d'exécution."""
|
||
37 | res = TestController.shortDescription(*args, **kwargs) |
||
38 | return "%s (limited + host)" % (res, ) |
||
39 | |||
40 | def setUp(self): |
||
41 | """Initialisation avant chaque test."""
|
||
42 | super(TestDetailsPluginMapsHostLimited, self).setUp() |
||
43 | # On fait manuellement ce que l'initialisation de VigiMap ferait
|
||
44 | # (car on est dans les tests de VigiBoard, pas ceux de VigiMap).
|
||
45 | root = functions.add_mapgroup(u'Root')
|
||
46 | DBSession.add(Permission(permission_name=u'vigimap-access'))
|
||
47 | |||
48 | print "Creation hote, service et cartes" |
||
49 | host = functions.add_host(u'localhost éçà')
|
||
50 | functions.add_lowlevelservice(host, u'lls éçà')
|
||
51 | sig = functions.add_supitemgroup(u'supitemgroup éçà')
|
||
52 | functions.add_host2group(host, sig) |
||
53 | mg = functions.add_mapgroup(u'éçà', root)
|
||
54 | m1 = functions.add_map(u'M1', root)
|
||
55 | # La seconde carte appartient à "/Root/éçà"
|
||
56 | # et permet de tester les accès indirects.
|
||
57 | m2 = functions.add_map(u'M2', mg)
|
||
58 | m3 = functions.add_map(u'M3', root)
|
||
59 | |||
60 | # On ajoute l'hôte 2 fois sur M1 pour vérifier
|
||
61 | # l'absense de doublons dans les liens.
|
||
62 | print "Preparation cartes" |
||
63 | functions.add_node_host(host, 'h1', m1)
|
||
64 | functions.add_node_host(host, 'h2', m1)
|
||
65 | functions.add_node_host(host, 'h', m2)
|
||
66 | functions.add_node_host(host, 'h', m3)
|
||
67 | |||
68 | # Création de quelques utilisateurs.
|
||
69 | print "Creation des comptes utilisateurs et reglages permissions" |
||
70 | functions.add_user(u'restricted', u're@strict.ed', |
||
71 | u'restricted', u'restricted', |
||
72 | u'restricted')
|
||
73 | functions.add_user(u'unrestricted', u'unre@strict.ed', |
||
74 | u'unrestricted', u'unrestricted', |
||
75 | u'unrestricted')
|
||
76 | functions.add_user(u'no_rights', u'no_r@igh.ts', |
||
77 | u'no_rights', u'no_rights', |
||
78 | u'no_rights')
|
||
79 | # Les 3 utilisateurs ont accès à VigiBoard.
|
||
80 | functions.add_usergroup_permission(u'no_rights', u'vigiboard-access') |
||
81 | functions.add_usergroup_permission(u'restricted', u'vigiboard-access') |
||
82 | functions.add_usergroup_permission(u'unrestricted', u'vigiboard-access') |
||
83 | # Mais seuls "restricted" et "unrestricted" ont accès à VigiMap.
|
||
84 | functions.add_usergroup_permission(u'restricted', u'vigimap-access') |
||
85 | functions.add_usergroup_permission(u'unrestricted', u'vigimap-access') |
||
86 | # Ils voient tous les trois les événements dans VigiBoard...
|
||
87 | functions.add_supitemgrouppermission(sig, 'no_rights')
|
||
88 | functions.add_supitemgrouppermission(sig, 'restricted')
|
||
89 | functions.add_supitemgrouppermission(sig, 'unrestricted')
|
||
90 | # ... mais "restricted" ne peut voir que "M2" ...
|
||
91 | functions.add_MapGroupPermission(mg, 'restricted')
|
||
92 | # ... tandis que "unrestricted" voit les 3 cartes (par héritage).
|
||
93 | functions.add_MapGroupPermission(root, 'unrestricted')
|
||
94 | |||
95 | DBSession.flush() |
||
96 | transaction.commit() |
||
97 | |||
98 | def tearDown(self): |
||
99 | """Nettoyage après chaque test."""
|
||
100 | transaction.abort() |
||
101 | DBSession.expunge_all() |
||
102 | super(TestDetailsPluginMapsHostLimited, self).tearDown() |
||
103 | |||
104 | def _insert_dep(self): |
||
105 | """Insertion de l'événement corrélé de test."""
|
||
106 | print "Insertion evenement correle" |
||
107 | timestamp = datetime.now() |
||
108 | supitem = DBSession.query(self.supitem_class).one()
|
||
109 | if isinstance(supitem, Host): |
||
110 | event = functions.add_event(supitem, u'DOWN', u'', timestamp) |
||
111 | else: # Sinon, il s'agit d'un LowLevelService. |
||
112 | event = functions.add_event(supitem, u'CRITICAL', u'', timestamp) |
||
113 | functions.add_correvent([event], timestamp=timestamp) |
||
114 | DBSession.flush() |
||
115 | transaction.commit() |
||
116 | correvent = DBSession.query(CorrEvent.idcorrevent).one() |
||
117 | return correvent.idcorrevent
|
||
118 | |||
119 | def test_maps_links_anonymous(self): |
||
120 | """Cartes dans dialogue détails en tant qu'anonyme."""
|
||
121 | idcorrevent = self._insert_dep()
|
||
122 | # 401 : Unauthorized car l'utilisateur doit s'authentifier
|
||
123 | # pour pouvoir accéder à la boîte de dialogue.
|
||
124 | self.app.post('/plugin_json', { |
||
125 | 'idcorrevent': idcorrevent,
|
||
126 | 'plugin_name': 'details', |
||
127 | }, extra_environ={}, status=401)
|
||
128 | |||
129 | def test_maps_links_manager(self): |
||
130 | """Cartes dans dialogue détails en tant que manager."""
|
||
131 | idcorrevent = self._insert_dep()
|
||
132 | response = self.app.post('/plugin_json', { |
||
133 | 'idcorrevent': idcorrevent,
|
||
134 | 'plugin_name': 'details', |
||
135 | }, extra_environ={'REMOTE_USER': 'manager'}) |
||
136 | # Le manager a toujours accès à tout, la seule limite possible
|
||
137 | # est celle imposée par l'option "max_maps" dans la configuration.
|
||
138 | self.assertEquals(response.json['maps'], self.manager) |
||
139 | |||
140 | def test_maps_links_no_rights(self): |
||
141 | """Cartes dans dialogue détails sans droits."""
|
||
142 | idcorrevent = self._insert_dep()
|
||
143 | response = self.app.post('/plugin_json', { |
||
144 | 'idcorrevent': idcorrevent,
|
||
145 | 'plugin_name': 'details', |
||
146 | }, extra_environ={'REMOTE_USER': 'no_rights'}) |
||
147 | # L'utilisateur n'a pas accès à VigiMap, donc il ne doit pas voir
|
||
148 | # les cartes, même s'il a accès à VigiBoard par ailleurs.
|
||
149 | self.assertEquals(response.json['maps'], {}) |
||
150 | |||
151 | def test_maps_links_restricted(self): |
||
152 | """Cartes dans dialogue détails avec droits restreints."""
|
||
153 | idcorrevent = self._insert_dep()
|
||
154 | response = self.app.post('/plugin_json', { |
||
155 | 'idcorrevent': idcorrevent,
|
||
156 | 'plugin_name': 'details', |
||
157 | }, extra_environ={'REMOTE_USER': 'restricted'}) |
||
158 | # L'utilisateur ne doit voir que les cartes pour lesquelles
|
||
159 | # il a été autorisé.
|
||
160 | self.assertEquals(response.json['maps'], self.restricted) |
||
161 | |||
162 | def test_maps_links_unrestricted(self): |
||
163 | """Cartes dans dialogue détails avec droits étendus."""
|
||
164 | idcorrevent = self._insert_dep()
|
||
165 | response = self.app.post('/plugin_json', { |
||
166 | 'idcorrevent': idcorrevent,
|
||
167 | 'plugin_name': 'details', |
||
168 | }, extra_environ={'REMOTE_USER': 'unrestricted'}) |
||
169 | # L'utilisateur ne doit voir que les cartes pour lesquelles
|
||
170 | # il a été autorisé (les mêmes que que "restricted" + "M2").
|
||
171 | self.assertEquals(response.json['maps'], self.unrestricted) |
||
172 | |||
173 | |||
174 | class TestDetailsPluginMapsHostDisabled(TestDetailsPluginMapsHostLimited): |
||
175 | """
|
||
176 | Teste la désactivation de l'affichage des cartes
|
||
177 | dans le module de détails.
|
||
178 | """
|
||
179 | application_under_test = 'disabled_maps'
|
||
180 | # La réponse ne doit contenir aucune carte,
|
||
181 | # quel que soit l'utilisateur qui interroge
|
||
182 | # VigiBoard (la fonctionnalité est désactivée).
|
||
183 | manager = {} |
||
184 | unrestricted = {} |
||
185 | restricted = {} |
||
186 | |||
187 | def shortDescription(self, *args, **kwargs): |
||
188 | """Description courte du test en cours d'exécution."""
|
||
189 | res = TestController.shortDescription(*args, **kwargs) |
||
190 | return "%s (disabled + host)" % (res, ) |
||
191 | |||
192 | |||
193 | class TestDetailsPluginMapsHostUnlimited(TestDetailsPluginMapsHostLimited): |
||
194 | """
|
||
195 | Teste l'affichage des cartes dans le module de détails
|
||
196 | lorsqu'il n'y a aucun limite.
|
||
197 | """
|
||
198 | application_under_test = 'unlimited_maps'
|
||
199 | # Le manager voit tout et en particulier les 3 cartes sur lesquelles
|
||
200 | # l'hôte apparaît. M1 ne doit apparaître qu'une seule fois
|
||
201 | # même si l'hôte est présent 2 fois sur la carte.
|
||
202 | manager = {'1': 'M1', '3': 'M3', '2': 'M2'} |
||
203 | # L'utilisateur avec droits étendus voit
|
||
204 | # la même chose que le manager (3 cartes).
|
||
205 | unrestricted = manager.copy() |
||
206 | # L'utilisateur avec droits restreints ne voit pas 'M2'.
|
||
207 | restricted = {'2': 'M2'} |
||
208 | |||
209 | def shortDescription(self, *args, **kwargs): |
||
210 | """Description courte du test en cours d'exécution."""
|
||
211 | res = TestController.shortDescription(*args, **kwargs) |
||
212 | return "%s (unlimited + host)" % (res, ) |
||
213 | |||
214 | class TestDetailsPluginMapsServiceLimited( |
||
215 | TestDetailsPluginMapsHostLimited): |
||
216 | """
|
||
217 | Idem que la classe mère mais teste un événement corrélé
|
||
218 | portant sur un service de l'hôte plutôt que sur l'hôte lui-même.
|
||
219 | """
|
||
220 | supitem_class = LowLevelService |
||
221 | |||
222 | def shortDescription(self, *args, **kwargs): |
||
223 | """Description courte du test en cours d'exécution."""
|
||
224 | # On court-circuite la hiérarchie de classes
|
||
225 | # pour appeler directement la méthode de nose/unittest.
|
||
226 | res = TestController.shortDescription(*args, **kwargs) |
||
227 | return "%s (limited + service)" % (res, ) |
||
228 | |||
229 | class TestDetailsPluginMapsServiceDisable( |
||
230 | TestDetailsPluginMapsHostDisabled): |
||
231 | """
|
||
232 | Idem que la classe mère mais teste un événement corrélé
|
||
233 | portant sur un service de l'hôte plutôt que sur l'hôte lui-même.
|
||
234 | """
|
||
235 | supitem_class = LowLevelService |
||
236 | |||
237 | def shortDescription(self, *args, **kwargs): |
||
238 | """Description courte du test en cours d'exécution."""
|
||
239 | # On court-circuite la hiérarchie de classes
|
||
240 | # pour appeler directement la méthode de nose/unittest.
|
||
241 | res = TestController.shortDescription(*args, **kwargs) |
||
242 | return "%s (disabled + service)" % (res, ) |
||
243 | |||
244 | class TestDetailsPluginMapsServiceUnlimited( |
||
245 | TestDetailsPluginMapsHostUnlimited): |
||
246 | """
|
||
247 | Idem que la classe mère mais teste un événement corrélé
|
||
248 | portant sur un service de l'hôte plutôt que sur l'hôte lui-même.
|
||
249 | """
|
||
250 | supitem_class = LowLevelService |
||
251 | |||
252 | def shortDescription(self, *args, **kwargs): |
||
253 | """Description courte du test en cours d'exécution."""
|
||
254 | # On court-circuite la hiérarchie de classes
|
||
255 | # pour appeler directement la méthode de nose/unittest.
|
||
256 | res = TestController.shortDescription(*args, **kwargs) |
||
257 | return "%s (unlimited + service)" % (res, ) |