Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / tests / functional / test_correvents_table.py @ 6f6efdcd

History | View | Annotate | Download (9.28 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.session import DBSession
12
from vigilo.models.tables import Event, CorrEvent, DataPermission, \
13
                            Permission, StateName, Host, \
14
                            LowLevelService, User, UserGroup, Permission
15
from vigilo.models.demo.functions import *
16
from vigiboard.tests import TestController
17

    
18
def populate_DB():
19
    """ Peuple la base de données. """
20
    # On ajoute les groupes et leurs dépendances
21
    hostmanagers = add_supitemgroup(name=u'managersgroup')
22
    hosteditors = add_supitemgroup(name=u'editorsgroup')
23

    
24
    usergroup = UserGroup.by_group_name(u'users_with_access')
25
    DBSession.add(DataPermission(
26
        group=hostmanagers,
27
        usergroup=usergroup,
28
        access=u'r',
29
    ))
30
    DBSession.add(DataPermission(
31
        group=hosteditors,
32
        usergroup=usergroup,
33
        access=u'r',
34
    ))
35

    
36
    usergroup = UserGroup.by_group_name(u'users_with_limited_access')
37
    DBSession.add(DataPermission(
38
        group=hosteditors,
39
        usergroup=usergroup,
40
        access=u'r',
41
    ))
42
    DBSession.flush()
43

    
44
    # Création des hôtes de test.
45
    host_template = {
46
        'checkhostcmd': u'halt',
47
        'snmpcommunity': u'public',
48
        'hosttpl': u'/dev/null',
49
        'address': u'192.168.1.1',
50
        'snmpport': 42,
51
        'weight': 42,
52
    }
53

    
54
    managerhost = Host(name=u'managerhost', **host_template)
55
    editorhost = Host(name=u'editorhost', **host_template)
56
    DBSession.add(managerhost)
57
    DBSession.add(editorhost)
58

    
59
    # Affectation des hôtes aux groupes.
60
    hosteditors.supitems.append(editorhost)
61
    hostmanagers.supitems.append(managerhost)
62
    DBSession.flush()
63

    
64
    # Création des services techniques de test.
65
    service_template = {
66
        'command': u'halt',
67
        'weight': 42,
68
    }
69

    
70
    service1 = LowLevelService(
71
        host=managerhost,
72
        servicename=u'managerservice',
73
        **service_template
74
    )
75

    
76
    service2 = LowLevelService(
77
        host=editorhost,
78
        servicename=u'managerservice',
79
        **service_template
80
    )
81

    
82
    service3 = LowLevelService(
83
        host=managerhost,
84
        servicename=u'editorservice',
85
        **service_template
86
    )
87

    
88
    service4 = LowLevelService(
89
        host=editorhost,
90
        servicename=u'editorservice',
91
        **service_template
92
    )
93

    
94
    DBSession.add(service1)
95
    DBSession.add(service2)
96
    DBSession.add(service3)
97
    DBSession.add(service4)
98
    DBSession.flush()
99

    
100
    # Ajout des événements eux-mêmes
101
    event_template = {
102
        'message': u'foo',
103
        'current_state': StateName.statename_to_value(u'WARNING'),
104
        'timestamp': datetime.now(),
105
    }
106

    
107
    event1 = Event(supitem=service1, **event_template)
108
    event2 = Event(supitem=service2, **event_template)
109
    event3 = Event(supitem=service3, **event_template)
110
    event4 = Event(supitem=service4, **event_template)
111
    event5 = Event(supitem=editorhost, **event_template)
112
    event6 = Event(supitem=managerhost, **event_template)
113

    
114
    DBSession.add(event1)
115
    DBSession.add(event2)
116
    DBSession.add(event3)
117
    DBSession.add(event4)
118
    DBSession.add(event5)
119
    DBSession.add(event6)
120
    DBSession.flush()
121

    
122
    # Ajout des événements corrélés
123
    aggregate_template = {
124
        'timestamp_active': datetime.now(),
125
        'priority': 1,
126
        'status': u'None',
127
    }
128

    
129
    aggregate1 = CorrEvent(
130
        idcause=event1.idevent, **aggregate_template)
131
    aggregate2 = CorrEvent(
132
        idcause=event4.idevent, **aggregate_template)
133
    aggregate3 = CorrEvent(
134
        idcause=event5.idevent, **aggregate_template)
135
    aggregate4 = CorrEvent(
136
        idcause=event6.idevent, **aggregate_template)
137

    
138
    aggregate1.events.append(event1)
139
    aggregate1.events.append(event3)
140
    aggregate2.events.append(event4)
141
    aggregate2.events.append(event2)
142
    aggregate3.events.append(event5)
143
    aggregate4.events.append(event6)
144
    DBSession.add(aggregate1)
145
    DBSession.add(aggregate2)
146
    DBSession.add(aggregate3)
147
    DBSession.add(aggregate4)
148

    
149
    DBSession.flush()
150
    transaction.commit()
151

    
152
class TestEventTable(TestController):
153
    """
154
    Test du tableau d'événements de Vigiboard
155
    """
156
    def setUp(self):
157
        super(TestEventTable, self).setUp()
158
        perm = Permission.by_permission_name(u'vigiboard-access')
159

    
160
        user = User(
161
            user_name=u'access',
162
            fullname=u'',
163
            email=u'user.has@access',
164
        )
165
        usergroup = UserGroup(
166
            group_name=u'users_with_access',
167
        )
168
        usergroup.permissions.append(perm)
169
        user.usergroups.append(usergroup)
170
        DBSession.add(user)
171
        DBSession.add(usergroup)
172
        DBSession.flush()
173

    
174
        user = User(
175
            user_name=u'limited_access',
176
            fullname=u'',
177
            email=u'user.has.no@access',
178
        )
179
        usergroup = UserGroup(
180
            group_name=u'users_with_limited_access',
181
        )
182
        usergroup.permissions.append(perm)
183
        user.usergroups.append(usergroup)
184
        DBSession.add(user)
185
        DBSession.add(usergroup)
186
        DBSession.flush()
187

    
188
        populate_DB()
189

    
190

    
191
    def test_homepage(self):
192
        """
193
        Tableau des événements (page d'accueil).
194
        """
195
        # L'utilisateur n'est pas authentifié.
196
        response = self.app.get('/', status=401)
197

    
198
        # L'utilisateur est authentifié avec des permissions réduites.
199
        environ = {'REMOTE_USER': 'limited_access'}
200
        response = self.app.get('/', extra_environ=environ)
201

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

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

    
212
        # L'utilisateur est authentifié avec des permissions plus étendues.
213
        environ = {'REMOTE_USER': 'access'}
214
        response = self.app.get('/', extra_environ=environ)
215

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

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

    
226
    def test_correvents_table_for_LLS(self):
227
        """
228
        Tableau des événements corrélés pour un service de bas niveau.
229
        """
230
        url = '/item/1/%s/%s' % ('managerhost', 'managerservice')
231

    
232
        # L'utilisateur n'est pas authentifié.
233
        response = self.app.get(url, status=401)
234

    
235
        # L'utilisateur dispose de permissions restreintes.
236
        # Il n'a pas accès aux événements corrélés sur le service donné.
237
        # Donc, on s'attend à être redirigé avec un message d'erreur.
238
        environ = {'REMOTE_USER': 'limited_access'}
239
        response = self.app.get(url, extra_environ=environ, status=302)
240
        response = response.follow(status = 200, extra_environ = environ)
241
        assert_true(len(response.lxml.xpath(
242
            '//div[@id="flash"]/div[@class="error"]')))
243

    
244
        # L'utilisateur dispose de permissions plus étendues.
245
        # Il doit avoir accès à l'historique.
246
        # Ici, il n'y a qu'un seul événement corrélé pour ce service.
247
        environ = {'REMOTE_USER': 'access'}
248
        response = self.app.get(url, extra_environ=environ, status=200)
249

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

    
255
    def test_correvents_table_for_host(self):
256
        """
257
        Tableau des événements corrélés pour un hôte.
258
        """
259
        url = '/item/1/%s/' % ('managerhost', )
260

    
261
        # L'utilisateur n'est pas authentifié.
262
        response = self.app.get(url, status=401)
263

    
264
        # L'utilisateur dispose de permissions restreintes.
265
        # Il n'a pas accès aux événements corrélés sur le service donné.
266
        # Donc, on s'attend à être redirigé avec un message d'erreur.
267
        environ = {'REMOTE_USER': 'limited_access'}
268
        response = self.app.get(url, extra_environ=environ, status=302)
269
        response = response.follow(status = 200, extra_environ = environ)
270
        assert_true(len(response.lxml.xpath(
271
            '//div[@id="flash"]/div[@class="error"]')))
272

    
273
        # L'utilisateur dispose de permissions plus étendues.
274
        # Il doit avoir accès à l'historique.
275
        # Ici, il n'y a qu'un seul événement corrélé pour ce service.
276
        environ = {'REMOTE_USER': 'access'}
277
        response = self.app.get(url, extra_environ=environ, status=200)
278

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