Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / tests / functional / test_vigiboardrequest.py @ 5d20c2c5

History | View | Annotate | Download (9.44 KB)

1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Tests portant sur la classe VigiboardRequest.
5
"""
6

    
7
from nose.tools import assert_true
8
from datetime import datetime
9
import tg
10
import transaction
11

    
12
from vigilo.models.configure import DBSession
13
from vigilo.models import Event, EventHistory, CorrEvent, \
14
                            Permission, User, StateName, \
15
                            Host, HostGroup, LowLevelService, ServiceGroup
16
from vigiboard.tests import TestController
17
from vigiboard.controllers.vigiboardrequest import VigiboardRequest
18
from vigiboard.controllers.vigiboard_plugin.tests import MonPlugin
19

    
20

    
21
class TestVigiboardRequest(TestController):
22
    """Test de la classe Vigiboard Request"""
23

    
24
    def setUp(self):
25
        """Création de données pour le test."""
26
        super(TestVigiboardRequest, self).setUp()
27

    
28
        # Les noms d'états.
29
        DBSession.add(StateName(statename=u'OK', order=0))
30
        DBSession.add(StateName(statename=u'WARNING', order=2))
31
        DBSession.flush()
32
        transaction.commit()
33

    
34
        # On peuple la base de données.
35

    
36
        # Les groupes et leurs dépendances
37
        self.hosteditors = HostGroup(name=u'editorsgroup')
38
        DBSession.add(self.hosteditors)
39
        self.hostmanagers = HostGroup(name=u'managersgroup',
40
            parent=self.hosteditors)
41
        DBSession.add(self.hostmanagers)
42
        self.serviceeditors = ServiceGroup(name=u'editorsgroup')
43
        DBSession.add(self.serviceeditors)
44
        self.servicemanagers = ServiceGroup(name=u'managersgroup',
45
            parent=self.serviceeditors)
46
        DBSession.add(self.servicemanagers)
47
        DBSession.flush()
48

    
49
        manage_perm = Permission.by_permission_name(u'manage')
50
        edit_perm = Permission.by_permission_name(u'edit')
51

    
52
        self.hostmanagers.permissions.append(manage_perm)
53
        self.hosteditors.permissions.append(edit_perm)
54
        self.servicemanagers.permissions.append(manage_perm)
55
        self.serviceeditors.permissions.append(edit_perm)
56
        DBSession.flush()
57

    
58
        # Création des hôtes de test.
59
        host_template = {
60
            'checkhostcmd': u'halt',
61
            'snmpcommunity': u'public',
62
            'hosttpl': u'/dev/null',
63
            'mainip': u'192.168.1.1',
64
            'snmpport': 42,
65
            'weight': 42,
66
        }
67

    
68
        managerhost = Host(name=u'managerhost', **host_template)
69
        editorhost = Host(name=u'editorhost', **host_template)
70
        DBSession.add(managerhost)
71
        DBSession.add(editorhost)
72

    
73
        # Création des services techniques de test.
74
        service_template = {
75
            'command': u'halt',
76
            'op_dep': u'+',
77
            'weight': 42,
78
        }
79

    
80
        service1 = LowLevelService(
81
            host=managerhost,
82
            servicename=u'managerservice',
83
            **service_template
84
        )
85

    
86
        service2 = LowLevelService(
87
            host=editorhost,
88
            servicename=u'managerservice',
89
            **service_template
90
        )
91

    
92
        service3 = LowLevelService(
93
            host=managerhost,
94
            servicename=u'editorservice',
95
            **service_template
96
        )
97

    
98
        service4 = LowLevelService(
99
            host=editorhost,
100
            servicename=u'editorservice',
101
            **service_template
102
        )
103

    
104
        DBSession.add(service1)
105
        DBSession.add(service2)
106
        DBSession.add(service3)
107
        DBSession.add(service4)
108
        DBSession.flush()
109

    
110
        # Affectation des hôtes/services aux groupes.
111
        self.hosteditors.hosts.append(editorhost)
112
        self.hostmanagers.hosts.append(managerhost)
113
        self.servicemanagers.services.append(service1)
114
        self.servicemanagers.services.append(service2)
115
        self.serviceeditors.services.append(service3)
116
        self.serviceeditors.services.append(service4)
117
        DBSession.flush()
118

    
119
        # Les événements eux-mêmes
120
        event_template = {
121
            'message': u'foo',
122
            'current_state': StateName.statename_to_value(u'WARNING'),
123
        }
124

    
125
        event1 = Event(supitem=service1, **event_template)
126
        event2 = Event(supitem=service2, **event_template)
127
        event3 = Event(supitem=service3, **event_template)
128
        event4 = Event(supitem=service4, **event_template)
129

    
130
        DBSession.add(event1)
131
        DBSession.add(event2)
132
        DBSession.add(event3)
133
        DBSession.add(event4)
134
        DBSession.flush()
135

    
136

    
137
        # Les historiques
138
        DBSession.add(EventHistory(type_action=u'Nagios update state',
139
            idevent=event1.idevent, timestamp=datetime.now()))
140
        DBSession.add(EventHistory(type_action=u'Acknowledgement change state',
141
            idevent=event1.idevent, timestamp=datetime.now()))
142
        DBSession.add(EventHistory(type_action=u'Nagios update state',
143
            idevent=event2.idevent, timestamp=datetime.now()))
144
        DBSession.add(EventHistory(type_action=u'Acknowledgement change state',
145
            idevent=event2.idevent, timestamp=datetime.now()))
146
        DBSession.add(EventHistory(type_action=u'Nagios update state',
147
            idevent=event3.idevent, timestamp=datetime.now()))
148
        DBSession.add(EventHistory(type_action=u'Acknowledgement change state',
149
            idevent=event3.idevent, timestamp=datetime.now()))
150
        DBSession.add(EventHistory(type_action=u'Nagios update state',
151
            idevent=event4.idevent, timestamp=datetime.now()))
152
        DBSession.add(EventHistory(type_action=u'Acknowledgement change state',
153
            idevent=event4.idevent, timestamp=datetime.now()))
154
        DBSession.flush()
155

    
156
        # Les événements corrélés
157
        aggregate_template = {
158
            'timestamp_active': datetime.now(),
159
            'priority': 1,
160
            'status': u'None',
161
        }
162
        self.aggregate1 = CorrEvent(
163
            idcause=event1.idevent, **aggregate_template)
164
        self.aggregate2 = CorrEvent(
165
            idcause=event4.idevent, **aggregate_template)
166

    
167
        self.aggregate1.events.append(event1)
168
        self.aggregate1.events.append(event3)
169
        self.aggregate2.events.append(event4)
170
        self.aggregate2.events.append(event2)
171
        DBSession.add(self.aggregate1)
172
        DBSession.add(self.aggregate2)
173
        DBSession.flush()
174
        transaction.commit()
175

    
176
    def tearDown(self):
177
        """Destruction des données temporaires du test."""
178
        # This operation is only necessary for DBMS which are
179
        # really strict about table locks, such as PostgreSQL.
180
        # For our tests, we use an (in-memory) SQLite database,
181
        # so we're unaffected. This is done only for completeness.
182
        TestController.tearDown(self)
183

    
184

    
185
    def test_request_creation(self):
186
        """Génération d'une requête avec plugin et permissions."""
187

    
188
        # On indique qui on est et on requête l'index pour obtenir
189
        # toutes les variables de sessions
190
        environ = {'REMOTE_USER': 'editor'}
191
        response = self.app.get('/', extra_environ=environ)
192
        tg.request = response.request
193

    
194
        # Derrière, VigiboardRequest doit charger le plugin de tests tout seul
195
        tg.config['vigiboard_plugins'] = [['tests', 'MonPlugin']]
196
        vigi_req = VigiboardRequest(User.by_user_name(u'editor'))
197
        vigi_req.add_table(
198
            CorrEvent,
199
            vigi_req.items.c.hostname,
200
            vigi_req.items.c.servicename,
201
        )
202
        vigi_req.add_join((Event, CorrEvent.idcause == Event.idevent))
203
        vigi_req.add_join((vigi_req.items, 
204
            Event.idsupitem == vigi_req.items.c.idsupitem))
205

    
206
        # On effectue les tests suivants :
207
        #   le nombre de lignes (historique et événements) doivent
208
        #       correspondre (vérification des droits imposés par les groupes)
209
        #   le plugin fonctionne correctement
210

    
211
        num_rows = vigi_req.num_rows()
212
        assert_true(num_rows == 1, 
213
            msg = "One history should be available for " +
214
            "the user 'editor' but there are %d" % num_rows)
215

    
216
        vigi_req.format_events(0, 10)
217
        vigi_req.format_history()
218
        assert_true(len(vigi_req.events) == 1 + 1,
219
            msg = "One history should be available for the user " +
220
            "'editor' but there are %d" % (len(vigi_req.events) - 1))
221
#        assert_true(vigi_req.events[1][6][0][0] != 'Error', 
222
#                    msg = "Plugins execution or events formatting problem") 
223

    
224
        # On recommence les tests précédents avec l'utilisateur
225
        # manager (plus de droits)
226

    
227
        environ = {'REMOTE_USER': 'manager'}
228
        response = self.app.get('/', extra_environ=environ)
229
        tg.request = response.request
230

    
231
        vigi_req = VigiboardRequest(User.by_user_name(u'manager'))
232
        vigi_req.add_table(
233
            CorrEvent,
234
            vigi_req.items.c.hostname,
235
            vigi_req.items.c.servicename,
236
        )
237
        vigi_req.add_join((Event, CorrEvent.idcause == Event.idevent))
238
        vigi_req.add_join((vigi_req.items, 
239
            Event.idsupitem == vigi_req.items.c.idsupitem))
240
        vigi_req.add_plugin(MonPlugin)
241

    
242
        num_rows = vigi_req.num_rows()
243
        assert_true(num_rows == 2, 
244
            msg = "2 histories should be available for " +
245
            "the user 'manager' but there are %d" % num_rows)
246
        vigi_req.format_events(0, 10)
247
        vigi_req.format_history()
248
        assert_true(len(vigi_req.events) == 2 + 1, 
249
            msg = "2 histories should be available for the user " +
250
            "'manager' but there are %d" % (len(vigi_req.events) - 1))
251
#        assert_true(vigi_req.events[1][6][0][0] != 'Error', 
252
#                    msg = "Plugins execution or events formatting problem") 
253