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