Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

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()