vigiboard / vigiboard / tests / functional / plugins / test_details_plugin_maps.py @ 8c198622
History | View | Annotate | Download (11.1 KB)
1 |
# -*- coding: utf-8 -*-
|
---|---|
2 |
# Copyright (C) 2006-2019 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 __future__ import print_function |
10 |
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 |
from vigilo.models import tables |
17 |
|
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 |
# La 1ère correspond à la limite, la seconde permet
|
26 |
# de détecter qu'il y avait plus de cartes que la limite.
|
27 |
manager = [[1, 'M1'], [2, 'M2']] |
28 |
# L'utilisateur avec droits étendus voit
|
29 |
# la même chose que le manager (2 cartes).
|
30 |
unrestricted = manager[:] |
31 |
# L'utilisateur avec droits restreints ne voit
|
32 |
# qu'une seule carte : "M2".
|
33 |
restricted = [[2, 'M2']] |
34 |
supitem_class = tables.Host |
35 |
|
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 |
DBSession.add(tables.Permission(permission_name=u'vigimap-access'))
|
48 |
|
49 |
print("Creation hote, service et cartes")
|
50 |
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 |
print("Preparation cartes")
|
64 |
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 |
print("Creation des comptes utilisateurs et reglages permissions")
|
71 |
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 |
print("Insertion evenement correle")
|
108 |
timestamp = datetime.now() |
109 |
supitem = DBSession.query(self.supitem_class).one()
|
110 |
if isinstance(supitem, tables.Host): |
111 |
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 |
correvent = DBSession.query(tables.CorrEvent.idcorrevent).one() |
118 |
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 |
self.assertEquals(response.json['maps'], []) |
151 |
|
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 |
manager = [] |
185 |
unrestricted = [] |
186 |
restricted = [] |
187 |
|
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 |
manager = [[1, 'M1'], [2, 'M2'], [3, 'M3']] |
204 |
# L'utilisateur avec droits étendus voit
|
205 |
# la même chose que le manager (3 cartes).
|
206 |
unrestricted = manager[:] |
207 |
# L'utilisateur avec droits restreints ne voit pas 'M2'.
|
208 |
restricted = [[2, 'M2']] |
209 |
|
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 |
supitem_class = tables.LowLevelService |
222 |
|
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 |
supitem_class = tables.LowLevelService |
237 |
|
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 |
supitem_class = tables.LowLevelService |
252 |
|
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, ) |