Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / tests / functional / test_correvents_table.py @ b42cc707

History | View | Annotate | Download (8.16 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, CorrEvent, \
13
                            Permission, StateName, \
14
                            Host, HostGroup, LowLevelService
15
from vigiboard.tests import TestController
16

    
17
def populate_DB():
18
    """ Peuple la base de données. """
19
    # On ajoute les groupes et leurs dépendances
20
    hosteditors = HostGroup(name=u'editorsgroup')
21
    DBSession.add(hosteditors)
22
    hostmanagers = HostGroup(name=u'managersgroup', parent=hosteditors)
23
    DBSession.add(hostmanagers)
24
    DBSession.flush()
25

    
26
    manage_perm = Permission.by_permission_name(u'manage')
27
    edit_perm = Permission.by_permission_name(u'edit')
28

    
29
    hostmanagers.permissions.append(manage_perm)
30
    hosteditors.permissions.append(edit_perm)
31
    DBSession.flush()
32

    
33
    # Création des hôtes de test.
34
    host_template = {
35
        'checkhostcmd': u'halt',
36
        'snmpcommunity': u'public',
37
        'hosttpl': u'/dev/null',
38
        'mainip': u'192.168.1.1',
39
        'snmpport': 42,
40
        'weight': 42,
41
    }
42

    
43
    managerhost = Host(name=u'managerhost', **host_template)
44
    editorhost = Host(name=u'editorhost', **host_template)
45
    DBSession.add(managerhost)
46
    DBSession.add(editorhost)
47

    
48
    # Affectation des hôtes aux groupes.
49
    hosteditors.hosts.append(editorhost)
50
    hostmanagers.hosts.append(managerhost)
51
    DBSession.flush()
52

    
53
    # Création des services techniques de test.
54
    service_template = {
55
        'command': u'halt',
56
        'op_dep': u'+',
57
        'weight': 42,
58
    }
59

    
60
    service1 = LowLevelService(
61
        host=managerhost,
62
        servicename=u'managerservice',
63
        **service_template
64
    )
65

    
66
    service2 = LowLevelService(
67
        host=editorhost,
68
        servicename=u'managerservice',
69
        **service_template
70
    )
71

    
72
    service3 = LowLevelService(
73
        host=managerhost,
74
        servicename=u'editorservice',
75
        **service_template
76
    )
77

    
78
    service4 = LowLevelService(
79
        host=editorhost,
80
        servicename=u'editorservice',
81
        **service_template
82
    )
83

    
84
    DBSession.add(service1)
85
    DBSession.add(service2)
86
    DBSession.add(service3)
87
    DBSession.add(service4)
88
    DBSession.flush()
89

    
90
    # Ajout des événements eux-mêmes
91
    event_template = {
92
        'message': u'foo',
93
        'current_state': StateName.statename_to_value(u'WARNING'),
94
        'timestamp': datetime.now(),
95
    }
96

    
97
    event1 = Event(supitem=service1, **event_template)
98
    event2 = Event(supitem=service2, **event_template)
99
    event3 = Event(supitem=service3, **event_template)
100
    event4 = Event(supitem=service4, **event_template)
101
    event5 = Event(supitem=editorhost, **event_template)
102
    event6 = Event(supitem=managerhost, **event_template)
103

    
104
    DBSession.add(event1)
105
    DBSession.add(event2)
106
    DBSession.add(event3)
107
    DBSession.add(event4)
108
    DBSession.add(event5)
109
    DBSession.add(event6)
110
    DBSession.flush()
111

    
112
    # Ajout des événements corrélés
113
    aggregate_template = {
114
        'timestamp_active': datetime.now(),
115
        'priority': 1,
116
        'status': u'None',
117
    }
118

    
119
    aggregate1 = CorrEvent(
120
        idcause=event1.idevent, **aggregate_template)
121
    aggregate2 = CorrEvent(
122
        idcause=event4.idevent, **aggregate_template)
123
    aggregate3 = CorrEvent(
124
        idcause=event5.idevent, **aggregate_template)
125
    aggregate4 = CorrEvent(
126
        idcause=event6.idevent, **aggregate_template)
127

    
128
    aggregate1.events.append(event1)
129
    aggregate1.events.append(event3)
130
    aggregate2.events.append(event4)
131
    aggregate2.events.append(event2)
132
    aggregate3.events.append(event5)
133
    aggregate4.events.append(event6)
134
    DBSession.add(aggregate1)
135
    DBSession.add(aggregate2)
136
    DBSession.add(aggregate3)
137
    DBSession.add(aggregate4)
138

    
139
    DBSession.flush()
140
    transaction.commit()
141

    
142
class TestEventTable(TestController):
143
    """
144
    Test du tableau d'événements de Vigiboard
145
    """
146

    
147
    def test_homepage(self):
148
        """
149
        Tableau des événements (page d'accueil).
150
        """
151
        populate_DB()
152

    
153
        # L'utilisateur n'est pas authentifié.
154
        response = self.app.get('/', status=401)
155

    
156
        # L'utilisateur est authentifié avec des permissions réduites.
157
        environ = {'REMOTE_USER': 'editor'}
158
        response = self.app.get('/', extra_environ=environ)
159

    
160
        # Il doit y avoir 2 lignes de résultats.
161
        rows = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr')
162
        print "There are %d rows in the result set" % len(rows)
163
        assert_equal(len(rows), 2)
164

    
165
        # Il doit y avoir plusieurs colonnes dans la ligne de résultats.
166
        cols = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr/td')
167
        print "There are %d columns in the result set" % len(cols)
168
        assert_true(len(cols) > 1)
169

    
170
        # L'utilisateur est authentifié avec des permissions plus étendues.
171
        environ = {'REMOTE_USER': 'manager'}
172
        response = self.app.get('/', extra_environ=environ)
173

    
174
        # Il doit y avoir 4 lignes de résultats.
175
        rows = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr')
176
        print "There are %d rows in the result set" % len(rows)
177
        assert_equal(len(rows), 4)
178

    
179
        # Il doit y avoir plusieurs colonnes dans la ligne de résultats.
180
        cols = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr/td')
181
        print "There are %d columns in the result set" % len(cols)
182
        assert_true(len(cols) > 1)
183

    
184
    def test_correvents_table_for_LLS(self):
185
        """
186
        Tableau des événements corrélés pour un service de bas niveau.
187
        """
188
        populate_DB()
189
        url = '/item/1/%s/%s' % ('managerhost', 'managerservice')
190

    
191
        # L'utilisateur n'est pas authentifié.
192
        response = self.app.get(url, status=401)
193

    
194
        # L'utilisateur dispose de permissions restreintes.
195
        # Il n'a pas accès aux événements corrélés sur le service donné.
196
        # Donc, on s'attend à être redirigé avec un message d'erreur.
197
        environ = {'REMOTE_USER': 'editor'}
198
        response = self.app.get(url, extra_environ=environ, status=302)
199
        response = response.follow(status = 200, extra_environ = environ)
200
        assert_true(len(response.lxml.xpath(
201
            '//div[@id="flash"]/div[@class="error"]')))
202

    
203
        # L'utilisateur dispose de permissions plus étendues.
204
        # Il doit avoir accès à l'historique.
205
        # Ici, il n'y a qu'un seul événement corrélé pour ce service.
206
        environ = {'REMOTE_USER': 'manager'}
207
        response = self.app.get(url, extra_environ=environ, status=200)
208

    
209
        # Il doit y avoir 1 ligne de résultats.
210
        rows = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr')
211
        print "There are %d rows in the result set" % len(rows)
212
        assert_equal(len(rows), 1)
213

    
214
    def test_correvents_table_for_host(self):
215
        """
216
        Tableau des événements corrélés pour un hôte.
217
        """
218
        populate_DB()
219
        url = '/item/1/%s/' % ('managerhost', )
220

    
221
        # L'utilisateur n'est pas authentifié.
222
        response = self.app.get(url, status=401)
223

    
224
        # L'utilisateur dispose de permissions restreintes.
225
        # Il n'a pas accès aux événements corrélés sur le service donné.
226
        # Donc, on s'attend à être redirigé avec un message d'erreur.
227
        environ = {'REMOTE_USER': 'editor'}
228
        response = self.app.get(url, extra_environ=environ, status=302)
229
        response = response.follow(status = 200, extra_environ = environ)
230
        assert_true(len(response.lxml.xpath(
231
            '//div[@id="flash"]/div[@class="error"]')))
232

    
233
        # L'utilisateur dispose de permissions plus étendues.
234
        # Il doit avoir accès à l'historique.
235
        # Ici, il n'y a qu'un seul événement corrélé pour ce service.
236
        environ = {'REMOTE_USER': 'manager'}
237
        response = self.app.get(url, extra_environ=environ, status=200)
238

    
239
        # Il doit y avoir 1 ligne de résultats.
240
        rows = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr')
241
        print "There are %d rows in the result set" % len(rows)
242
        assert_equal(len(rows), 1)
243