Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / tests / functional / test_history_tables.py @ 5dbfa80d

History | View | Annotate | Download (11.4 KB)

1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Test du tableau d'événements de Vigiboard
5
"""
6

    
7
from nose.tools import assert_true, assert_equal
8
from datetime import datetime
9
import transaction
10

    
11
from vigilo.models.configure import DBSession
12
from vigilo.models import Event, EventHistory, CorrEvent, \
13
                            Permission, StateName, \
14
                            Host, HostGroup, LowLevelService, ServiceGroup
15
from vigiboard.tests import TestController
16

    
17
def populate_DB():
18
    """ Peuple la base de données. """
19

    
20
    # On ajoute des noms d'états.
21
    DBSession.add(StateName(statename = u'OK', order = 0))
22
    DBSession.add(StateName(statename = u'WARNING', order = 2))
23
    DBSession.flush()
24
    transaction.commit()
25

    
26
    # On ajoute un groupe d'hôtes et un groupe de services.
27
    hostmanagers = HostGroup(name = u'managersgroup')
28
    DBSession.add(hostmanagers)
29
    servicemanagers = ServiceGroup(name = u'managersgroup')
30
    DBSession.add(servicemanagers)
31
    DBSession.flush()
32

    
33
    # On ajoute la permission 'manage' à ces deux groupes.
34
    manage_perm = Permission.by_permission_name(u'manage')
35
    hostmanagers.permissions.append(manage_perm)
36
    servicemanagers.permissions.append(manage_perm)
37
    DBSession.flush()
38

    
39
    # On crée un hôte de test, et on l'ajoute au groupe d'hôtes.
40
    managerhost = Host(
41
        name = u'managerhost',      
42
        checkhostcmd = u'halt',
43
        snmpcommunity = u'public',
44
        hosttpl = u'/dev/null',
45
        mainip = u'192.168.1.1',
46
        snmpport = 42,
47
        weight = 42,
48
    )
49
    DBSession.add(managerhost)
50
    hostmanagers.hosts.append(managerhost)
51
    DBSession.flush()
52

    
53
    # On crée un services de bas niveau, et on l'ajoute au groupe de services.
54
    managerservice = LowLevelService(
55
        host = managerhost,
56
        servicename = u'managerservice',
57
        command = u'halt',
58
        op_dep = u'+',
59
        weight = 42,
60
    )
61
    DBSession.add(managerservice)
62
    servicemanagers.services.append(managerservice)
63
    DBSession.flush()
64
    
65
    return (managerhost, managerservice)
66

    
67
def add_correvent_caused_by(supitem, 
68
        correvent_status=u"None", event_status=u"WARNING"):
69
    """
70
    Ajoute dans la base de données un évènement corrélé causé 
71
    par un incident survenu sur l'item passé en paramètre.
72
    Génère un historique pour les tests.
73
    """
74

    
75
    # Ajout d'un événement
76
    event = Event(
77
        supitem = supitem, 
78
        message = u'foo',
79
        current_state = StateName.statename_to_value(event_status),
80
    )
81
    DBSession.add(event)
82
    DBSession.flush()
83

    
84
    # Ajout des historiques
85
    DBSession.add(EventHistory(
86
        type_action=u'Nagios update state',
87
        idevent=event.idevent, 
88
        timestamp=datetime.now()))
89
    DBSession.add(EventHistory(
90
        type_action=u'Acknowledgement change state',
91
        idevent=event.idevent, 
92
        timestamp=datetime.now()))
93
    DBSession.flush()
94

    
95
    # Ajout d'un événement corrélé
96
    aggregate = CorrEvent(
97
        idcause = event.idevent, 
98
        timestamp_active = datetime.now(),
99
        priority = 1,
100
        status = correvent_status)
101
    aggregate.events.append(event)
102
    DBSession.add(aggregate)
103
    DBSession.flush()
104
    
105
    return aggregate.idcorrevent
106
    
107

    
108
class TestEventTable(TestController):
109
    """
110
    Test des historiques de Vigiboard.
111
    """
112

    
113
    def test_host_event_history(self):
114
        """
115
        Test de l'affichage du tableau d'historique
116
        d'un évènement corrélé causé par un hôte.
117
        """
118

    
119
        # On peuple la BDD avec un hôte, un service de bas niveau,
120
        # et un groupe d'hôtes et de services associés à ces items.
121
        (managerhost, managerservice) = populate_DB()
122
        
123
        # On ajoute un évènement corrélé causé par l'hôte
124
        aggregate_id = add_correvent_caused_by(managerhost)
125
        
126
        transaction.commit()
127
        
128
        ### 1er cas : L'utilisateur utilisé pour
129
        # se connecter à Vigiboard est 'editor'.
130
        environ = {'REMOTE_USER': 'editor'}
131
        
132
        # On s'attend à ce qu'une erreur 302 soit renvoyée, et à
133
        # ce qu'un message d'erreur précise à l'utilisateur qu'il
134
        # n'a pas accès aux informations concernant cet évènement.
135
        response = self.app.get(
136
            '/event?idcorrevent=' + str(aggregate_id),
137
            status = 302, 
138
            extra_environ = environ)
139
        
140
        response = self.app.get(
141
            '/', 
142
            status = 200, 
143
            extra_environ = environ)
144
        assert_true(response.lxml.xpath(
145
            '//div[@id="flash"]/div[@class="error"]'))
146

    
147
        ### 2nd cas : L'utilisateur utilisé pour
148
        # se connecter à Vigiboard est 'manager'.
149
        environ = {'REMOTE_USER': 'manager'}
150
        
151
        # On s'attend à ce que le statut de la requête soit 200.
152
        response = self.app.get(
153
            '/event?idcorrevent=' + str(aggregate_id),
154
            status = 200, 
155
            extra_environ = environ)
156

    
157
        # Il doit y avoir 2 lignes de résultats.
158
        rows = response.lxml.xpath('//table[@class="history_table"]/tbody/tr')
159
        assert_equal(len(rows), 2)
160

    
161
    def test_service_event_history(self):
162
        """
163
        Test de l'affichage du tableau d'historique d'un
164
        évènement corrélé causé par un service de bas niveau.
165
        """
166

    
167
        # On peuple la BDD avec un hôte, un service de bas niveau,
168
        # et un groupe d'hôtes et de services associés à ces items.
169
        (managerhost, managerservice) = populate_DB()
170
        
171
        # On ajoute un évènement corrélé causé par le service
172
        aggregate_id = add_correvent_caused_by(managerservice)
173
        
174
        transaction.commit()
175
        
176
        ### 1er cas : L'utilisateur utilisé pour
177
        # se connecter à Vigiboard est 'editor'.
178
        environ = {'REMOTE_USER': 'editor'}
179
        
180
        # On s'attend à ce qu'une erreur 302 soit renvoyée, et à
181
        # ce qu'un message d'erreur précise à l'utilisateur qu'il
182
        # n'a pas accès aux informations concernant cet évènement.
183
        response = self.app.get(
184
            '/event?idcorrevent=' + str(aggregate_id),
185
            status = 302, 
186
            extra_environ = environ)
187
        
188
        response = self.app.get(
189
            '/', 
190
            status = 200, 
191
            extra_environ = environ)
192
        assert_true(response.lxml.xpath(
193
            '//div[@id="flash"]/div[@class="error"]'))
194

    
195
        ### 2nd cas : L'utilisateur utilisé pour
196
        # se connecter à Vigiboard est 'manager'.
197
        environ = {'REMOTE_USER': 'manager'}
198
        
199
        # On s'attend à ce que le statut de la requête soit 200.
200
        response = self.app.get(
201
            '/event?idcorrevent=' + str(aggregate_id),
202
            status = 200, 
203
            extra_environ = environ)
204

    
205
        # Il doit y avoir 2 lignes de résultats.
206
        rows = response.lxml.xpath('//table[@class="history_table"]/tbody/tr')
207
        assert_equal(len(rows), 2)
208

    
209
    def test_host_history(self):
210
        """
211
        Test de l'affichage du tableau d'historique
212
        des évènements corrélé d'un hôte donné.
213
        """
214

    
215
        # On peuple la BDD avec un hôte, un service de bas niveau,
216
        # et un groupe d'hôtes et de services associés à ces items.
217
        (managerhost, managerservice) = populate_DB()
218
        
219
        # On ajoute deux évènements corrélés causés par l'hôte :
220
        # le premier encore ouvert, le second clos par un utilisateur.
221
        add_correvent_caused_by(managerhost)
222
        add_correvent_caused_by(managerhost, u"AAClosed", u"OK")
223
        
224
        transaction.commit()
225
        DBSession.add(managerhost)
226
        
227
        ### 1er cas : L'utilisateur utilisé pour
228
        # se connecter à Vigiboard est 'editor'.
229
        environ = {'REMOTE_USER': 'editor'}
230
        
231
        # On s'attend à ce qu'une erreur 302 soit renvoyée, et à
232
        # ce qu'un message d'erreur précise à l'utilisateur qu'il
233
        # n'a pas accès aux informations concernant cet évènement.
234
        response = self.app.get(
235
            '/host_service/' + managerhost.name,
236
            status = 302, 
237
            extra_environ = environ)
238
        
239
        response = self.app.get(
240
            '/', 
241
            status = 200, 
242
            extra_environ = environ)
243
        assert_true(response.lxml.xpath(
244
            '//div[@id="flash"]/div[@class="error"]'))
245

    
246
        ### 2nd cas : L'utilisateur utilisé pour
247
        # se connecter à Vigiboard est 'manager'.
248
        environ = {'REMOTE_USER': 'manager'}
249
        
250
        # On s'attend à ce que le statut de la requête soit 200.
251
        response = self.app.get(
252
            '/host_service/' + managerhost.name,
253
            status = 200, 
254
            extra_environ = environ)
255

    
256
        # Il doit y avoir 2 lignes d'évènements 
257
        # + 2 lignes contenant les tableaux d'historiques.
258
        rows = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr')
259
        assert_equal(len(rows), 2 + 2)
260
        # Et 4 lignes d'historiques dans les tableaux d'historiques.
261
        rows = response.lxml.xpath('//table[@class="history_table"]/tbody/tr')
262
        assert_equal(len(rows), 4)
263

    
264
    def test_service_history(self):
265
        """
266
        Test de l'affichage du tableau d'historique
267
        des évènements corrélé d'un service donné.
268
        """
269

    
270
        # On peuple la BDD avec un hôte, un service de bas niveau,
271
        # et un groupe d'hôtes et de services associés à ces items.
272
        (managerhost, managerservice) = populate_DB()
273
        
274
        # On ajoute deux évènements corrélés causés par le service :
275
        # le premier encore ouvert, le second clos par un utilisateur.
276
        add_correvent_caused_by(managerservice)
277
        add_correvent_caused_by(managerservice, u"AAClosed", u"OK")
278
        
279
        transaction.commit()
280
        DBSession.add(managerhost)
281
        DBSession.add(managerservice)
282
        
283
        ### 1er cas : L'utilisateur utilisé pour
284
        # se connecter à Vigiboard est 'editor'.
285
        environ = {'REMOTE_USER': 'editor'}
286
        
287
        # On s'attend à ce qu'une erreur 302 soit renvoyée, et à
288
        # ce qu'un message d'erreur précise à l'utilisateur qu'il
289
        # n'a pas accès aux informations concernant cet évènement.
290
        response = self.app.get(
291
            '/host_service/' + managerhost.name 
292
                                + '/' + managerservice.servicename,
293
            status = 302, 
294
            extra_environ = environ)
295
        
296
        response = self.app.get(
297
            '/', 
298
            status = 200, 
299
            extra_environ = environ)
300
        assert_true(response.lxml.xpath(
301
            '//div[@id="flash"]/div[@class="error"]'))
302

    
303
        ### 2nd cas : L'utilisateur utilisé pour
304
        # se connecter à Vigiboard est 'manager'.
305
        environ = {'REMOTE_USER': 'manager'}
306
        
307
        # On s'attend à ce que le statut de la requête soit 200.
308
        response = self.app.get(
309
            '/host_service/' + managerhost.name 
310
                                + '/' + managerservice.servicename,
311
            status = 200, 
312
            extra_environ = environ)
313

    
314
        # Il doit y avoir 2 lignes d'évènements 
315
        # + 2 lignes contenant les tableaux d'historiques.
316
        rows = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr')
317
        assert_equal(len(rows), 2 + 2)
318
        # Et 4 lignes d'historiques dans les tableaux d'historiques.
319
        rows = response.lxml.xpath('//table[@class="history_table"]/tbody/tr')
320
        assert_equal(len(rows), 4)
321