Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / tests / functional / test_history_table.py @ 011743be

History | View | Annotate | Download (7.34 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
Vérifie que la page qui affiche l'historique des actions sur un événement
8
brut fonctionne correctement.
9
"""
10
11
from nose.tools import assert_true, assert_equal
12
from datetime import datetime
13
import transaction
14
15 e7e3d45e Francois POIROTTE
from vigilo.models.session import DBSession
16 9a05a743 Francois POIROTTE
from vigilo.models.demo import functions
17 8b2edebe Aurelien BOMPARD
from vigilo.models.tables import EventHistory, Permission, UserGroup, \
18
                            SupItemGroup, Permission, DataPermission, User
19 072f2a16 Francois POIROTTE
from vigiboard.tests import TestController
20
21
def populate_DB():
22
    """ Peuple la base de données. """
23
    # On ajoute un groupe d'hôtes et un groupe de services.
24 03059edd Francois POIROTTE
    supitemmanagers = SupItemGroup(name=u'managersgroup', parent=None)
25 0bd9c069 Francois POIROTTE
    DBSession.add(supitemmanagers)
26
    DBSession.flush()
27 072f2a16 Francois POIROTTE
28 60d02e7f Francois POIROTTE
    usergroup = UserGroup.by_group_name(u'users_with_access')
29
    DBSession.add(DataPermission(
30
        group=supitemmanagers,
31
        usergroup=usergroup,
32
        access=u'r',
33
    ))
34 072f2a16 Francois POIROTTE
    DBSession.flush()
35
36
    # On crée un hôte de test, et on l'ajoute au groupe d'hôtes.
37 9a05a743 Francois POIROTTE
    managerhost = functions.add_host(u'managerhost')
38 24d74687 Francois POIROTTE
    supitemmanagers.supitems.append(managerhost)
39 072f2a16 Francois POIROTTE
    DBSession.flush()
40
41
    # On crée un services de bas niveau, et on l'ajoute au groupe de services.
42 9a05a743 Francois POIROTTE
    managerservice = functions.add_lowlevelservice(
43
        managerhost, u'managerservice')
44 24d74687 Francois POIROTTE
    supitemmanagers.supitems.append(managerservice)
45 072f2a16 Francois POIROTTE
    DBSession.flush()
46 03059edd Francois POIROTTE
47 072f2a16 Francois POIROTTE
    return (managerhost, managerservice)
48
49
def add_correvent_caused_by(supitem):
50
    """
51 03059edd Francois POIROTTE
    Ajoute dans la base de données un évènement corrélé causé
52 072f2a16 Francois POIROTTE
    par un incident survenu sur l'item passé en paramètre.
53
    Génère un historique pour les tests.
54
    """
55
56 9a05a743 Francois POIROTTE
    # Ajout d'un événement et de ses entrées dans l'historique.
57
    event = functions.add_event(supitem, u'WARNING', u'foo')
58 072f2a16 Francois POIROTTE
    DBSession.add(EventHistory(
59
        type_action=u'Nagios update state',
60 03059edd Francois POIROTTE
        idevent=event.idevent,
61 1c5486c7 Francois POIROTTE
        timestamp=datetime.utcnow()))
62 072f2a16 Francois POIROTTE
    DBSession.add(EventHistory(
63
        type_action=u'Acknowlegement change state',
64 03059edd Francois POIROTTE
        idevent=event.idevent,
65 1c5486c7 Francois POIROTTE
        timestamp=datetime.utcnow()))
66 072f2a16 Francois POIROTTE
    DBSession.flush()
67
68 8b2edebe Aurelien BOMPARD
    functions.add_correvent([event])
69 072f2a16 Francois POIROTTE
    return event.idevent
70 03059edd Francois POIROTTE
71 072f2a16 Francois POIROTTE
72
class TestHistoryTable(TestController):
73
    """
74 0c8b0e15 Francois POIROTTE
    Teste la table qui affiche l'historique des actions
75
    sur un événement brut.
76 072f2a16 Francois POIROTTE
    """
77 60d02e7f Francois POIROTTE
    def setUp(self):
78
        super(TestHistoryTable, self).setUp()
79
        perm = Permission.by_permission_name(u'vigiboard-access')
80
81
        user = User(
82
            user_name=u'access',
83
            fullname=u'',
84
            email=u'user.has@access',
85
        )
86 03059edd Francois POIROTTE
        usergroup = UserGroup(group_name=u'users_with_access')
87 60d02e7f Francois POIROTTE
        usergroup.permissions.append(perm)
88
        user.usergroups.append(usergroup)
89
        DBSession.add(user)
90
        DBSession.add(usergroup)
91
        DBSession.flush()
92
93
        user = User(
94
            user_name=u'limited_access',
95
            fullname=u'',
96
            email=u'user.has.no@access',
97
        )
98 03059edd Francois POIROTTE
        usergroup = UserGroup(group_name=u'users_with_limited_access')
99 60d02e7f Francois POIROTTE
        usergroup.permissions.append(perm)
100
        user.usergroups.append(usergroup)
101
        DBSession.add(user)
102
        DBSession.add(usergroup)
103
        DBSession.flush()
104
105 072f2a16 Francois POIROTTE
106
    def test_cause_host_history(self):
107
        """Historique de la cause d'un événement corrélé sur un hôte."""
108
109
        # On peuple la BDD avec un hôte, un service de bas niveau,
110
        # et un groupe d'hôtes et de services associés à ces items.
111 8b2edebe Aurelien BOMPARD
        (managerhost, _managerservice) = populate_DB()
112 03059edd Francois POIROTTE
113 072f2a16 Francois POIROTTE
        # On ajoute un évènement corrélé causé par l'hôte
114
        idevent = add_correvent_caused_by(managerhost)
115
        transaction.commit()
116
117
        # L'utilisateur n'est pas authentifié.
118
        # On s'attend à ce qu'une erreur 401 soit renvoyée,
119
        # demandant à l'utilisateur de s'authentifier.
120
        response = self.app.get(
121
            '/event/%d' % idevent,
122
            status = 401)
123
124
        # L'utilisateur N'A PAS les bonnes permissions.
125 60d02e7f Francois POIROTTE
        environ = {'REMOTE_USER': 'limited_access'}
126 03059edd Francois POIROTTE
127 072f2a16 Francois POIROTTE
        # On s'attend à ce qu'une erreur 302 soit renvoyée, et à
128
        # ce qu'un message d'erreur précise à l'utilisateur qu'il
129
        # n'a pas accès aux informations concernant cet évènement.
130
        response = self.app.get(
131
            '/event/%d' % idevent,
132 03059edd Francois POIROTTE
            status = 302,
133 072f2a16 Francois POIROTTE
            extra_environ = environ)
134
135
        # On suit la redirection.
136
        response = response.follow(status = 200, extra_environ = environ)
137
        assert_true(len(response.lxml.xpath(
138
            '//div[@id="flash"]/div[@class="error"]')))
139
140
        # L'utilisateur a les bonnes permissions.
141 60d02e7f Francois POIROTTE
        environ = {'REMOTE_USER': 'access'}
142 03059edd Francois POIROTTE
143 072f2a16 Francois POIROTTE
        # On s'attend à ce que le statut de la requête soit 200.
144
        response = self.app.get(
145
            '/event/%d' % idevent,
146 03059edd Francois POIROTTE
            status = 200,
147 072f2a16 Francois POIROTTE
            extra_environ = environ)
148
149
        # Il doit y avoir 2 lignes de résultats.
150 9211ef65 Francois POIROTTE
        # NB: la requête XPath est approchante, car XPath 1.0 ne permet pas
151
        # de rechercher directement une valeur dans une liste. Elle devrait
152
        # néanmoins suffire pour les besoins des tests.
153 df25ac35 Francois POIROTTE
        rows = response.lxml.xpath(
154
            '//table[contains(@class, "vigitable")]/tbody/tr')
155 072f2a16 Francois POIROTTE
        assert_equal(len(rows), 2)
156
157
    def test_cause_service_history(self):
158
        """Historique de la cause d'un événement corrélé sur un LLS."""
159
160
        # On peuple la BDD avec un hôte, un service de bas niveau,
161
        # et un groupe d'hôtes et de services associés à ces items.
162 8b2edebe Aurelien BOMPARD
        (_managerhost, managerservice) = populate_DB()
163 03059edd Francois POIROTTE
164 072f2a16 Francois POIROTTE
        # On ajoute un évènement corrélé causé par le service
165
        idevent = add_correvent_caused_by(managerservice)
166 03059edd Francois POIROTTE
167 072f2a16 Francois POIROTTE
        transaction.commit()
168
169
        # L'utilisateur n'est pas authentifié.
170
        # On s'attend à ce qu'une erreur 401 soit renvoyée,
171
        # demandant à l'utilisateur de s'authentifier.
172
        response = self.app.get(
173
            '/event/%d' % idevent,
174
            status = 401)
175
176
        # L'utilisateur N'A PAS les bonnes permissions.
177 60d02e7f Francois POIROTTE
        environ = {'REMOTE_USER': 'limited_access'}
178 03059edd Francois POIROTTE
179 072f2a16 Francois POIROTTE
        # On s'attend à ce qu'une erreur 302 soit renvoyée, et à
180
        # ce qu'un message d'erreur précise à l'utilisateur qu'il
181
        # n'a pas accès aux informations concernant cet évènement.
182
        response = self.app.get(
183
            '/event/%d' % idevent,
184 03059edd Francois POIROTTE
            status = 302,
185 072f2a16 Francois POIROTTE
            extra_environ = environ)
186
187
        # On suit la redirection.
188
        response = response.follow(status = 200, extra_environ = environ)
189
        assert_true(len(response.lxml.xpath(
190
            '//div[@id="flash"]/div[@class="error"]')))
191
192
        # L'utilisateur a les bonnes permissions.
193 60d02e7f Francois POIROTTE
        environ = {'REMOTE_USER': 'access'}
194 03059edd Francois POIROTTE
195 072f2a16 Francois POIROTTE
        # On s'attend à ce que le statut de la requête soit 200.
196
        response = self.app.get(
197
            '/event/%d' % idevent,
198 03059edd Francois POIROTTE
            status = 200,
199 072f2a16 Francois POIROTTE
            extra_environ = environ)
200
201
        # Il doit y avoir 2 lignes de résultats.
202 9211ef65 Francois POIROTTE
        # NB: la requête XPath est approchante, car XPath 1.0 ne permet pas
203
        # de rechercher directement une valeur dans une liste. Elle devrait
204
        # néanmoins suffire pour les besoins des tests.
205 df25ac35 Francois POIROTTE
        rows = response.lxml.xpath(
206
            '//table[contains(@class,"vigitable")]/tbody/tr')
207 072f2a16 Francois POIROTTE
        assert_equal(len(rows), 2)