Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (7.34 KB)

1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
# Copyright (C) 2006-2020 CS GROUP - France
4
# License: GNU GPL v2 <http://www.gnu.org/licenses/gpl-2.0.html>
5

    
6
"""
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
from vigilo.models.session import DBSession
16
from vigilo.models.demo import functions
17
from vigilo.models.tables import EventHistory, Permission, UserGroup, \
18
                            SupItemGroup, Permission, DataPermission, User
19
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
    supitemmanagers = SupItemGroup(name=u'managersgroup', parent=None)
25
    DBSession.add(supitemmanagers)
26
    DBSession.flush()
27

    
28
    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
    DBSession.flush()
35

    
36
    # On crée un hôte de test, et on l'ajoute au groupe d'hôtes.
37
    managerhost = functions.add_host(u'managerhost')
38
    supitemmanagers.supitems.append(managerhost)
39
    DBSession.flush()
40

    
41
    # On crée un services de bas niveau, et on l'ajoute au groupe de services.
42
    managerservice = functions.add_lowlevelservice(
43
        managerhost, u'managerservice')
44
    supitemmanagers.supitems.append(managerservice)
45
    DBSession.flush()
46

    
47
    return (managerhost, managerservice)
48

    
49
def add_correvent_caused_by(supitem):
50
    """
51
    Ajoute dans la base de données un évènement corrélé causé
52
    par un incident survenu sur l'item passé en paramètre.
53
    Génère un historique pour les tests.
54
    """
55

    
56
    # Ajout d'un événement et de ses entrées dans l'historique.
57
    event = functions.add_event(supitem, u'WARNING', u'foo')
58
    DBSession.add(EventHistory(
59
        type_action=u'Nagios update state',
60
        idevent=event.idevent,
61
        timestamp=datetime.utcnow()))
62
    DBSession.add(EventHistory(
63
        type_action=u'Acknowlegement change state',
64
        idevent=event.idevent,
65
        timestamp=datetime.utcnow()))
66
    DBSession.flush()
67

    
68
    functions.add_correvent([event])
69
    return event.idevent
70

    
71

    
72
class TestHistoryTable(TestController):
73
    """
74
    Teste la table qui affiche l'historique des actions
75
    sur un événement brut.
76
    """
77
    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
        usergroup = UserGroup(group_name=u'users_with_access')
87
        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
        usergroup = UserGroup(group_name=u'users_with_limited_access')
99
        usergroup.permissions.append(perm)
100
        user.usergroups.append(usergroup)
101
        DBSession.add(user)
102
        DBSession.add(usergroup)
103
        DBSession.flush()
104

    
105

    
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
        (managerhost, _managerservice) = populate_DB()
112

    
113
        # 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
        environ = {'REMOTE_USER': 'limited_access'}
126

    
127
        # 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
            status = 302,
133
            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
        environ = {'REMOTE_USER': 'access'}
142

    
143
        # On s'attend à ce que le statut de la requête soit 200.
144
        response = self.app.get(
145
            '/event/%d' % idevent,
146
            status = 200,
147
            extra_environ = environ)
148

    
149
        # Il doit y avoir 2 lignes de résultats.
150
        # 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
        rows = response.lxml.xpath(
154
            '//table[contains(@class, "vigitable")]/tbody/tr')
155
        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
        (_managerhost, managerservice) = populate_DB()
163

    
164
        # On ajoute un évènement corrélé causé par le service
165
        idevent = add_correvent_caused_by(managerservice)
166

    
167
        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
        environ = {'REMOTE_USER': 'limited_access'}
178

    
179
        # 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
            status = 302,
185
            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
        environ = {'REMOTE_USER': 'access'}
194

    
195
        # On s'attend à ce que le statut de la requête soit 200.
196
        response = self.app.get(
197
            '/event/%d' % idevent,
198
            status = 200,
199
            extra_environ = environ)
200

    
201
        # Il doit y avoir 2 lignes de résultats.
202
        # 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
        rows = response.lxml.xpath(
206
            '//table[contains(@class,"vigitable")]/tbody/tr')
207
        assert_equal(len(rows), 2)