Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / tests / functional / plugins / test_details_plugin.py @ d227db89

History | View | Annotate | Download (9.21 KB)

1
# -*- coding: utf-8 -*-
2
# Copyright (C) 2006-2011 CS-SI
3
# License: GNU GPL v2 <http://www.gnu.org/licenses/gpl-2.0.html>
4

    
5
"""
6
Teste le formulaire donnant les liens vers les outils extérieurs
7
et les données de l'historique.
8
"""
9
from nose.tools import assert_true, assert_equal
10
from datetime import datetime
11
import transaction
12

    
13
from vigiboard.tests import TestController
14
from vigilo.models.session import DBSession
15
from vigilo.models.tables import SupItemGroup, User, UserGroup, \
16
                            Permission, DataPermission, StateName, \
17
                            LowLevelService, Event, CorrEvent, Host
18

    
19
def insert_deps(return_service):
20
    """
21
    Insère les dépendances nécessaires aux tests.
22

23
    @param return_service: Indique si les événements générés
24
        concernent un hôte (False) ou un service de bas niveau (True).
25
    @type return_service: C{bool}
26
    @return: Renvoie un tuple avec le groupe d'hôte créé,
27
        l'identifiant du L{CorrEvent} généré et enfin,
28
        l'identifiant de l'L{Event} généré.
29
    @rtype: C{tuple}
30
    """
31
    timestamp = datetime.now()
32

    
33
    hostgroup = SupItemGroup(name=u'foo', parent=None)
34
    DBSession.add(hostgroup)
35

    
36
    host = Host(
37
        name=u'bar',
38
        description=u'',
39
        hosttpl=u'',
40
        address=u'127.0.0.1',
41
        snmpport=42,
42
        snmpcommunity=u'public',
43
        snmpversion=u'3',
44
        weight=42,
45
    )
46
    DBSession.add(host)
47
    DBSession.flush()
48

    
49
    hostgroup.supitems.append(host)
50
    DBSession.flush()
51

    
52
    servicegroup = SupItemGroup(name=u'bar', parent=None)
53
    DBSession.add(servicegroup)
54

    
55
    service = LowLevelService(
56
        host=host,
57
        command=u'',
58
        weight=42,
59
        servicename=u'baz',
60
    )
61
    DBSession.add(service)
62
    DBSession.flush()
63

    
64
    servicegroup.supitems.append(service)
65
    DBSession.flush()
66

    
67
    event = Event(
68
        timestamp=timestamp,
69
        current_state=StateName.statename_to_value(u'WARNING'),
70
        message=u'Hello world',
71
    )
72
    if return_service:
73
        event.supitem = service
74
    else:
75
        event.supitem = host
76
    DBSession.add(event)
77
    DBSession.flush()
78

    
79
    correvent = CorrEvent(
80
        impact=42,
81
        priority=42,
82
        trouble_ticket=None,
83
        ack=CorrEvent.ACK_NONE,
84
        occurrence=42,
85
        timestamp_active=timestamp,
86
        cause=event,
87
    )
88
    correvent.events.append(event)
89
    DBSession.add(correvent)
90
    DBSession.flush()
91

    
92
    usergroup = UserGroup.by_group_name(u'users_with_access')
93
    DBSession.add(DataPermission(
94
        usergroup=usergroup,
95
        group=hostgroup,
96
        access=u'r',
97
    ))
98
    DBSession.flush()
99

    
100
    transaction.commit()
101
    correvent = DBSession.query(CorrEvent).first()
102
    event = DBSession.query(Event).first()
103

    
104
    return (hostgroup, correvent.idcorrevent, event.idevent)
105

    
106
class TestDetailsPlugin(TestController):
107
    """Teste le dialogue pour l'accès aux historiques."""
108
    def setUp(self):
109
        super(TestDetailsPlugin, self).setUp()
110
        perm = Permission.by_permission_name(u'vigiboard-access')
111

    
112
        user = User(
113
            user_name=u'access',
114
            fullname=u'',
115
            email=u'user.has@access',
116
        )
117
        usergroup = UserGroup(group_name=u'users_with_access')
118
        usergroup.permissions.append(perm)
119
        user.usergroups.append(usergroup)
120
        DBSession.add(user)
121
        DBSession.add(usergroup)
122
        DBSession.flush()
123

    
124
        user = User(
125
            user_name=u'no_access',
126
            fullname=u'',
127
            email=u'user.has.no@access',
128
        )
129
        usergroup = UserGroup(group_name=u'users_without_access')
130
        usergroup.permissions.append(perm)
131
        user.usergroups.append(usergroup)
132
        DBSession.add(user)
133
        DBSession.add(usergroup)
134
        DBSession.flush()
135

    
136
        transaction.commit()
137

    
138
    def test_details_plugin_LLS_alert_when_allowed(self):
139
        """Dialogue des détails avec un LLS et les bons droits."""
140
        hostgroup, idcorrevent, idcause = insert_deps(True)
141

    
142
        response = self.app.post('/plugin_json', {
143
                'idcorrevent': idcorrevent,
144
                'plugin_name': 'details',
145
            }, extra_environ={'REMOTE_USER': 'access'})
146
        json = response.json
147

    
148
        # Le contenu de "eventdetails" varie facilement.
149
        # On le teste séparément.
150
        json.pop('eventdetails', None)
151
        assert_true('eventdetails' in response.json)
152

    
153
        assert_equal(json, {
154
            "idcorrevent": idcorrevent,
155
            "idcause": idcause,
156
            "service": "baz",
157
            "peak_state": "WARNING",
158
            "current_state": "WARNING",
159
            "host": "bar",
160
            "initial_state": "WARNING"
161
        })
162

    
163
    def test_details_plugin_LLS_alert_when_manager(self):
164
        """Dialogue des détails avec un LLS en tant que manager."""
165
        hostgroup, idcorrevent, idcause = insert_deps(True)
166

    
167
        response = self.app.post('/plugin_json', {
168
                'idcorrevent': idcorrevent,
169
                'plugin_name': 'details',
170
            }, extra_environ={'REMOTE_USER': 'manager'})
171
        json = response.json
172

    
173
        # Le contenu de "eventdetails" varie facilement.
174
        # On le teste séparément.
175
        json.pop('eventdetails', None)
176
        assert_true('eventdetails' in response.json)
177

    
178
        assert_equal(json, {
179
            "idcorrevent": idcorrevent,
180
            "idcause": idcause,
181
            "service": "baz",
182
            "peak_state": "WARNING",
183
            "current_state": "WARNING",
184
            "host": "bar",
185
            "initial_state": "WARNING"
186
        })
187

    
188
    def test_details_plugin_host_alert_when_allowed(self):
189
        """Dialogue des détails avec un hôte et les bons droits."""
190
        hostgroup, idcorrevent, idcause = insert_deps(False)
191

    
192
        response = self.app.post('/plugin_json', {
193
                'idcorrevent': idcorrevent,
194
                'plugin_name': 'details',
195
            }, extra_environ={'REMOTE_USER': 'access'})
196
        json = response.json
197

    
198
        # Le contenu de "eventdetails" varie facilement.
199
        # On le teste séparément.
200
        json.pop('eventdetails', None)
201
        assert_true('eventdetails' in response.json)
202

    
203
        assert_equal(json, {
204
            "idcorrevent": idcorrevent,
205
            "idcause": idcause,
206
            "service": None,
207
            "peak_state": "WARNING",
208
            "current_state": "WARNING",
209
            "host": "bar",
210
            "initial_state": "WARNING"
211
        })
212

    
213
    def test_details_plugin_host_alert_when_manager(self):
214
        """Dialogue des détails avec un hôte en tant que manager."""
215
        hostgroup, idcorrevent, idcause = insert_deps(False)
216

    
217
        response = self.app.post('/plugin_json', {
218
                'idcorrevent': idcorrevent,
219
                'plugin_name': 'details',
220
            }, extra_environ={'REMOTE_USER': 'manager'})
221
        json = response.json
222

    
223
        # Le contenu de "eventdetails" varie facilement.
224
        # On le teste séparément.
225
        json.pop('eventdetails', None)
226
        assert_true('eventdetails' in response.json)
227

    
228
        assert_equal(json, {
229
            "idcorrevent": idcorrevent,
230
            "idcause": idcause,
231
            "service": None,
232
            "peak_state": "WARNING",
233
            "current_state": "WARNING",
234
            "host": "bar",
235
            "initial_state": "WARNING"
236
        })
237

    
238
    def test_details_plugin_LLS_when_forbidden(self):
239
        """Dialogue des détails avec un LLS et des droits insuffisants."""
240
        idcorrevent = insert_deps(True)[1]
241

    
242
        # Le contrôleur renvoie une erreur 404 (HTTPNotFound)
243
        # lorsque l'utilisateur n'a pas les permissions nécessaires sur
244
        # les données ou qu'aucun événement correspondant n'est trouvé.
245
        self.app.post('/plugin_json', {
246
                'idcorrevent': idcorrevent,
247
                'plugin_name': 'details',
248
            }, extra_environ={'REMOTE_USER': 'no_access'},
249
            status=404)
250

    
251
    def test_details_plugin_host_when_forbidden(self):
252
        """Dialogue des détails avec un hôte et des droits insuffisants."""
253
        idcorrevent = insert_deps(False)[1]
254

    
255
        # Le contrôleur renvoie une erreur 404 (HTTPNotFound)
256
        # lorsque l'utilisateur n'a pas les permissions nécessaires sur
257
        # les données ou qu'aucun événement correspondant n'est trouvé.
258
        self.app.post('/plugin_json', {
259
                'idcorrevent': idcorrevent,
260
                'plugin_name': 'details',
261
            }, extra_environ={'REMOTE_USER': 'no_access'},
262
            status=404)
263

    
264
    def test_details_plugin_LLS_anonymous(self):
265
        """Dialogue des détails avec un LLS et en anonyme."""
266
        idcorrevent = insert_deps(True)[1]
267

    
268
        # Le contrôleur renvoie une erreur 401 (HTTPUnauthorized)
269
        # lorsque l'utilisateur n'est pas authentifié.
270
        self.app.post('/plugin_json', {
271
                'idcorrevent': idcorrevent,
272
                'plugin_name': 'details',
273
            }, status=401)
274

    
275
    def test_details_plugin_host_anonymous(self):
276
        """Dialogue des détails avec un hôte et en anonyme."""
277
        idcorrevent = insert_deps(False)[1]
278

    
279
        # Le contrôleur renvoie une erreur 401 (HTTPUnauthorized)
280
        # lorsque l'utilisateur n'est pas authentifié.
281
        self.app.post('/plugin_json', {
282
                'idcorrevent': idcorrevent,
283
                'plugin_name': 'details',
284
            }, status=401)