vigiboard / vigiboard / tests / functional / plugins / test_details_plugin_maps.py @ dc005588
History | View | Annotate | Download (11.1 KB)
1 |
# -*- 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, ) |