vigiboard / vigiboard / tests / functional / test_raw_events_table.py @ 011743be
History | View | Annotate | Download (9.55 KB)
1 | 072f2a16 | Francois POIROTTE | # -*- coding: utf-8 -*-
|
---|---|---|---|
2 | # vim:set expandtab tabstop=4 shiftwidth=4:
|
||
3 | 011743be | Francois POIROTTE | # Copyright (C) 2006-2020 CS GROUP - France
|
4 | b373a5de | Aurelien BOMPARD | # License: GNU GPL v2 <http://www.gnu.org/licenses/gpl-2.0.html>
|
5 | |||
6 | 072f2a16 | Francois POIROTTE | """
|
7 | Test du tableau d'événements de Vigiboard
|
||
8 | """
|
||
9 | |||
10 | from nose.tools import assert_true, assert_equal |
||
11 | from datetime import datetime |
||
12 | import transaction |
||
13 | |||
14 | e7e3d45e | Francois POIROTTE | from vigilo.models.session import DBSession |
15 | 9a05a743 | Francois POIROTTE | from vigilo.models.demo import functions |
16 | 8b2edebe | Aurelien BOMPARD | from vigilo.models.tables import EventHistory, CorrEvent, User, \ |
17 | Permission, Host, UserGroup, \ |
||
18 | SupItemGroup, DataPermission |
||
19 | 072f2a16 | Francois POIROTTE | from vigiboard.tests import TestController |
20 | |||
21 | 60d02e7f | Francois POIROTTE | def populate_accounts(): |
22 | 08495a93 | Francois POIROTTE | perm = Permission.by_permission_name(u'vigiboard-access')
|
23 | |||
24 | user = User( |
||
25 | user_name=u'access',
|
||
26 | fullname=u'',
|
||
27 | email=u'user.has@access',
|
||
28 | ) |
||
29 | 03059edd | Francois POIROTTE | usergroup = UserGroup(group_name=u'users_with_access')
|
30 | 08495a93 | Francois POIROTTE | usergroup.permissions.append(perm) |
31 | user.usergroups.append(usergroup) |
||
32 | DBSession.add(user) |
||
33 | DBSession.add(usergroup) |
||
34 | DBSession.flush() |
||
35 | |||
36 | user = User( |
||
37 | user_name=u'limited_access',
|
||
38 | fullname=u'',
|
||
39 | email=u'user.has.no@access',
|
||
40 | ) |
||
41 | 03059edd | Francois POIROTTE | usergroup = UserGroup(group_name=u'users_with_limited_access')
|
42 | 08495a93 | Francois POIROTTE | usergroup.permissions.append(perm) |
43 | user.usergroups.append(usergroup) |
||
44 | DBSession.add(user) |
||
45 | DBSession.add(usergroup) |
||
46 | DBSession.flush() |
||
47 | transaction.commit() |
||
48 | 60d02e7f | Francois POIROTTE | |
49 | 0c8b0e15 | Francois POIROTTE | def populate_DB(caused_by_service): |
50 | 072f2a16 | Francois POIROTTE | """ Peuple la base de données. """
|
51 | # On ajoute un groupe d'hôtes et un groupe de services.
|
||
52 | 03059edd | Francois POIROTTE | supitemmanagers = SupItemGroup(name = u'managersgroup', parent=None) |
53 | 0bd9c069 | Francois POIROTTE | DBSession.add(supitemmanagers) |
54 | DBSession.flush() |
||
55 | 24d74687 | Francois POIROTTE | |
56 | 60d02e7f | Francois POIROTTE | usergroup = UserGroup.by_group_name(u'users_with_access')
|
57 | DBSession.add(DataPermission( |
||
58 | group=supitemmanagers, |
||
59 | usergroup=usergroup, |
||
60 | access=u'r',
|
||
61 | )) |
||
62 | 072f2a16 | Francois POIROTTE | DBSession.flush() |
63 | |||
64 | 9a05a743 | Francois POIROTTE | # On crée un hôte de test et on l'ajoute au groupe d'hôtes.
|
65 | managerhost = functions.add_host(u'managerhost')
|
||
66 | 24d74687 | Francois POIROTTE | supitemmanagers.supitems.append(managerhost) |
67 | 072f2a16 | Francois POIROTTE | DBSession.flush() |
68 | |||
69 | 9a05a743 | Francois POIROTTE | # On crée un services de bas niveau et on l'ajoute au groupe de services.
|
70 | managerservice = functions.add_lowlevelservice( |
||
71 | managerhost, u'managerservice')
|
||
72 | 24d74687 | Francois POIROTTE | supitemmanagers.supitems.append(managerservice) |
73 | 072f2a16 | Francois POIROTTE | DBSession.flush() |
74 | |||
75 | 0c8b0e15 | Francois POIROTTE | if caused_by_service:
|
76 | 9a05a743 | Francois POIROTTE | event = functions.add_event(managerservice, u'WARNING', u'foo') |
77 | 0c8b0e15 | Francois POIROTTE | else:
|
78 | 9a05a743 | Francois POIROTTE | event = functions.add_event(managerhost, u'WARNING', u'foo') |
79 | 072f2a16 | Francois POIROTTE | |
80 | # Ajout des historiques
|
||
81 | DBSession.add(EventHistory( |
||
82 | type_action=u'Nagios update state',
|
||
83 | 08495a93 | Francois POIROTTE | idevent=event.idevent, |
84 | 1c5486c7 | Francois POIROTTE | timestamp=datetime.utcnow())) |
85 | 072f2a16 | Francois POIROTTE | DBSession.add(EventHistory( |
86 | type_action=u'Acknowlegement change state',
|
||
87 | 08495a93 | Francois POIROTTE | idevent=event.idevent, |
88 | 1c5486c7 | Francois POIROTTE | timestamp=datetime.utcnow())) |
89 | 072f2a16 | Francois POIROTTE | DBSession.flush() |
90 | |||
91 | # Ajout d'un événement corrélé
|
||
92 | 9a05a743 | Francois POIROTTE | aggregate = functions.add_correvent([event]) |
93 | 0c8b0e15 | Francois POIROTTE | return aggregate.idcorrevent
|
94 | 072f2a16 | Francois POIROTTE | |
95 | 0c8b0e15 | Francois POIROTTE | def add_masked_event(idcorrevent): |
96 | df25ac35 | Francois POIROTTE | """Ajoute un événement masqué à un événement corrélé."""
|
97 | 0c8b0e15 | Francois POIROTTE | transaction.begin() |
98 | 24d74687 | Francois POIROTTE | hostmanagers = SupItemGroup.by_group_name(u'managersgroup')
|
99 | 0c8b0e15 | Francois POIROTTE | nb_hosts = DBSession.query(Host).count() |
100 | |||
101 | 9a05a743 | Francois POIROTTE | masked_host = functions.add_host(u'masked host #%d' % nb_hosts)
|
102 | 24d74687 | Francois POIROTTE | hostmanagers.supitems.append(masked_host) |
103 | 0c8b0e15 | Francois POIROTTE | DBSession.flush() |
104 | |||
105 | 9a05a743 | Francois POIROTTE | event = functions.add_event(masked_host, u'CRITICAL',
|
106 | u'masked event #%d' % nb_hosts)
|
||
107 | 0c8b0e15 | Francois POIROTTE | |
108 | aggregate = DBSession.query(CorrEvent).filter( |
||
109 | CorrEvent.idcorrevent == idcorrevent).one() |
||
110 | aggregate.events.append(event) |
||
111 | DBSession.add(aggregate) |
||
112 | DBSession.flush() |
||
113 | transaction.commit() |
||
114 | 072f2a16 | Francois POIROTTE | |
115 | |||
116 | 0c8b0e15 | Francois POIROTTE | class TestRawEventsTableAnonymousLLS(TestController): |
117 | """
|
||
118 | Teste l'affichage des événements bruts masqués par un agrégat.
|
||
119 | Dans ces tests, l'utilisateur n'est pas authentifié et l'agrégat
|
||
120 | a été causé par un LLS.
|
||
121 | """
|
||
122 | test_service = True
|
||
123 | 072f2a16 | Francois POIROTTE | |
124 | 60d02e7f | Francois POIROTTE | def setUp(self): |
125 | super(TestRawEventsTableAnonymousLLS, self).setUp() |
||
126 | populate_accounts() |
||
127 | |||
128 | 0c8b0e15 | Francois POIROTTE | def test_table(self): |
129 | """Événements masqués d'un agrégat sur un LLS en anonyme."""
|
||
130 | 072f2a16 | Francois POIROTTE | # On peuple la BDD avec un hôte, un service de bas niveau,
|
131 | # et un groupe d'hôtes et de services associés à ces items.
|
||
132 | 0c8b0e15 | Francois POIROTTE | idcorrevent = populate_DB(self.test_service)
|
133 | 072f2a16 | Francois POIROTTE | transaction.commit() |
134 | |||
135 | # L'utilisateur n'est pas authentifié.
|
||
136 | # On s'attend à ce qu'une erreur 401 soit renvoyée,
|
||
137 | # demandant à l'utilisateur de s'authentifier.
|
||
138 | 8b2edebe | Aurelien BOMPARD | self.app.get(
|
139 | 0c8b0e15 | Francois POIROTTE | '/masked_events/%d' % idcorrevent,
|
140 | 072f2a16 | Francois POIROTTE | status = 401)
|
141 | |||
142 | 0c8b0e15 | Francois POIROTTE | class TestRawEventsTableAnonymousHost(TestRawEventsTableAnonymousLLS): |
143 | """Idem que TestRawEventsTableAnonymousLLS mais avec un hôte."""
|
||
144 | test_service = False
|
||
145 | |||
146 | def test_table(self): |
||
147 | """Événements masqués d'un agrégat sur un hôte en anonyme."""
|
||
148 | super(TestRawEventsTableAnonymousHost, self).test_table() |
||
149 | |||
150 | |||
151 | class TestRawEventsTableWithoutPermsLLS(TestController): |
||
152 | """
|
||
153 | Teste l'affichage des événements bruts masqués par un agrégat.
|
||
154 | Dans ces tests, l'utilisateur n'a pas les bonnes permissions
|
||
155 | et l'agrégat a été causé par un LLS.
|
||
156 | """
|
||
157 | test_service = True
|
||
158 | |||
159 | 60d02e7f | Francois POIROTTE | def setUp(self): |
160 | super(TestRawEventsTableWithoutPermsLLS, self).setUp() |
||
161 | populate_accounts() |
||
162 | |||
163 | 0c8b0e15 | Francois POIROTTE | def test_table(self): |
164 | """Événements masqués d'un agrégat sur un LLS sans permissions."""
|
||
165 | # On peuple la BDD avec un hôte, un service de bas niveau,
|
||
166 | # et un groupe d'hôtes et de services associés à ces items.
|
||
167 | idcorrevent = populate_DB(self.test_service)
|
||
168 | transaction.commit() |
||
169 | |||
170 | 60d02e7f | Francois POIROTTE | environ = {'REMOTE_USER': 'limited_access'} |
171 | 0c8b0e15 | Francois POIROTTE | |
172 | 072f2a16 | Francois POIROTTE | # On s'attend à ce qu'une erreur 302 soit renvoyée, et à
|
173 | # ce qu'un message d'erreur précise à l'utilisateur qu'il
|
||
174 | # n'a pas accès aux informations concernant cet évènement.
|
||
175 | response = self.app.get(
|
||
176 | 0c8b0e15 | Francois POIROTTE | '/masked_events/%d' % idcorrevent,
|
177 | 08495a93 | Francois POIROTTE | status = 302,
|
178 | 072f2a16 | Francois POIROTTE | extra_environ = environ) |
179 | response = response.follow(status = 200, extra_environ = environ)
|
||
180 | assert_true(len(response.lxml.xpath(
|
||
181 | '//div[@id="flash"]/div[@class="error"]')))
|
||
182 | |||
183 | 0c8b0e15 | Francois POIROTTE | # L'erreur 302 peut venir de l'absence de permissions
|
184 | # ou bien simplement de l'absence d'événements masqués.
|
||
185 | # Pour vérifier qu'il s'agit bien d'un problème de permissions,
|
||
186 | # on ajoute un événement masqué. On doit à nouveau obtenir
|
||
187 | # une erreur 302.
|
||
188 | add_masked_event(idcorrevent) |
||
189 | 072f2a16 | Francois POIROTTE | response = self.app.get(
|
190 | 0c8b0e15 | Francois POIROTTE | '/masked_events/%d' % idcorrevent,
|
191 | 08495a93 | Francois POIROTTE | status = 302,
|
192 | 072f2a16 | Francois POIROTTE | extra_environ = environ) |
193 | 0c8b0e15 | Francois POIROTTE | response = response.follow(status = 200, extra_environ = environ)
|
194 | assert_true(len(response.lxml.xpath(
|
||
195 | '//div[@id="flash"]/div[@class="error"]')))
|
||
196 | 072f2a16 | Francois POIROTTE | |
197 | 0c8b0e15 | Francois POIROTTE | class TestRawEventsTableWithoutPermsHost(TestRawEventsTableWithoutPermsLLS): |
198 | """Idem que TestRawEventsTableWithoutPermsLLS mais avec un hôte."""
|
||
199 | test_service = False
|
||
200 | 072f2a16 | Francois POIROTTE | |
201 | 0c8b0e15 | Francois POIROTTE | def test_table(self): |
202 | """Événements masqués d'un agrégat sur un hôte sans permissions."""
|
||
203 | super(TestRawEventsTableWithoutPermsHost, self).test_table() |
||
204 | 072f2a16 | Francois POIROTTE | |
205 | 0c8b0e15 | Francois POIROTTE | class TestRawEventsTableWithPermsLLS(TestController): |
206 | """
|
||
207 | Teste l'affichage d'une table des événements bruts
|
||
208 | rattachés à un agrégat, hormis la cause de cet agrégat.
|
||
209 | """
|
||
210 | test_service = True
|
||
211 | |||
212 | 60d02e7f | Francois POIROTTE | def setUp(self): |
213 | super(TestRawEventsTableWithPermsLLS, self).setUp() |
||
214 | populate_accounts() |
||
215 | |||
216 | 0c8b0e15 | Francois POIROTTE | def test_table(self): |
217 | """Événements masqués d'un agrégat sur un LLS avec permissions."""
|
||
218 | 072f2a16 | Francois POIROTTE | # On peuple la BDD avec un hôte, un service de bas niveau,
|
219 | # et un groupe d'hôtes et de services associés à ces items.
|
||
220 | 0c8b0e15 | Francois POIROTTE | idcorrevent = populate_DB(True)
|
221 | 072f2a16 | Francois POIROTTE | transaction.commit() |
222 | |||
223 | 60d02e7f | Francois POIROTTE | environ = {'REMOTE_USER': 'access'} |
224 | 072f2a16 | Francois POIROTTE | |
225 | # On s'attend à ce qu'une erreur 302 soit renvoyée, et à
|
||
226 | # ce qu'un message d'erreur précise à l'utilisateur qu'il
|
||
227 | # n'a pas accès aux informations concernant cet évènement.
|
||
228 | response = self.app.get(
|
||
229 | 0c8b0e15 | Francois POIROTTE | '/masked_events/%d' % idcorrevent,
|
230 | status = 302,
|
||
231 | 072f2a16 | Francois POIROTTE | extra_environ = environ) |
232 | response = response.follow(status = 200, extra_environ = environ)
|
||
233 | assert_true(len(response.lxml.xpath(
|
||
234 | '//div[@id="flash"]/div[@class="error"]')))
|
||
235 | |||
236 | 0c8b0e15 | Francois POIROTTE | # L'erreur 302 peut venir de l'absence de permissions
|
237 | # ou bien simplement de l'absence d'événements masqués.
|
||
238 | # Pour vérifier qu'il s'agit bien d'un problème de permissions,
|
||
239 | # on ajoute un événement masqué. On doit avoir accès à exactement
|
||
240 | # 1 événement masqué à présent.
|
||
241 | add_masked_event(idcorrevent) |
||
242 | 072f2a16 | Francois POIROTTE | response = self.app.get(
|
243 | 0c8b0e15 | Francois POIROTTE | '/masked_events/%d' % idcorrevent,
|
244 | status = 200,
|
||
245 | 072f2a16 | Francois POIROTTE | extra_environ = environ) |
246 | |||
247 | 9211ef65 | Francois POIROTTE | # On s'attend à trouver exactement 1 événement masqué.
|
248 | # NB: la requête XPath est approchante, car XPath 1.0 ne permet pas
|
||
249 | # de rechercher directement une valeur dans une liste. Elle devrait
|
||
250 | # néanmoins suffire pour les besoins des tests.
|
||
251 | df25ac35 | Francois POIROTTE | rows = response.lxml.xpath( |
252 | '//table[contains(@class, "vigitable")]/tbody/tr')
|
||
253 | 0c8b0e15 | Francois POIROTTE | assert_equal(len(rows), 1) |
254 | |||
255 | class TestRawEventsTableWithPermsHost(TestRawEventsTableWithPermsLLS): |
||
256 | """Idem que TestRawEventsTableWithPermsLLS mais avec un hôte."""
|
||
257 | test_service = False
|
||
258 | |||
259 | def test_table(self): |
||
260 | """Événements masqués d'un agrégat sur un hôte avec permissions."""
|
||
261 | super(TestRawEventsTableWithPermsHost, self).test_table() |