Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / tests / functional / plugins / test_details_plugin_maps.py @ 011743be

History | View | Annotate | Download (11.1 KB)

1 dc005588 Francois POIROTTE
# -*- coding: utf-8 -*-
2 011743be Francois POIROTTE
# Copyright (C) 2006-2020 CS GROUP - France
3 dc005588 Francois POIROTTE
# License: GNU GPL v2 <http://www.gnu.org/licenses/gpl-2.0.html>
4
5
"""
6
Teste la partie "Cartes" du formulaire contenant les détails
7
pour un événement corrélé.
8
"""
9 0dff1e21 Francois POIROTTE
from __future__ import print_function
10 dc005588 Francois POIROTTE
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.demo import functions
16 02c4a1e7 Francois POIROTTE
from vigilo.models import tables
17 dc005588 Francois POIROTTE
18
class TestDetailsPluginMapsHostLimited(TestController):
19
    """
20
    Teste l'affichage des cartes dans le module de détails
21
    lorsqu'une limite à été réglée pour l'affichage.
22
    """
23
    application_under_test = 'limited_maps'
24
    # Seules les 2 premières cartes doivent figurer.
25 02c4a1e7 Francois POIROTTE
    # La 1ère correspond à la limite, la seconde permet
26 dc005588 Francois POIROTTE
    # de détecter qu'il y avait plus de cartes que la limite.
27 a4ffe87d Francois POIROTTE
    manager = [[1, 'M1'], [2, 'M2']]
28 dc005588 Francois POIROTTE
    # L'utilisateur avec droits étendus voit
29
    # la même chose que le manager (2 cartes).
30 a4ffe87d Francois POIROTTE
    unrestricted = manager[:]
31 dc005588 Francois POIROTTE
    # L'utilisateur avec droits restreints ne voit
32
    # qu'une seule carte : "M2".
33 a4ffe87d Francois POIROTTE
    restricted = [[2, 'M2']]
34 02c4a1e7 Francois POIROTTE
    supitem_class = tables.Host
35 dc005588 Francois POIROTTE
36
    def shortDescription(self, *args, **kwargs):
37
        """Description courte du test en cours d'exécution."""
38
        res = TestController.shortDescription(*args, **kwargs)
39
        return "%s (limited + host)" % (res, )
40
41
    def setUp(self):
42
        """Initialisation avant chaque test."""
43
        super(TestDetailsPluginMapsHostLimited, self).setUp()
44
        # On fait manuellement ce que l'initialisation de VigiMap ferait
45
        # (car on est dans les tests de VigiBoard, pas ceux de VigiMap).
46
        root = functions.add_mapgroup(u'Root')
47 02c4a1e7 Francois POIROTTE
        DBSession.add(tables.Permission(permission_name=u'vigimap-access'))
48 dc005588 Francois POIROTTE
49 0dff1e21 Francois POIROTTE
        print("Creation hote, service et cartes")
50 dc005588 Francois POIROTTE
        host = functions.add_host(u'localhost éçà')
51
        functions.add_lowlevelservice(host, u'lls éçà')
52
        sig = functions.add_supitemgroup(u'supitemgroup éçà')
53
        functions.add_host2group(host, sig)
54
        mg = functions.add_mapgroup(u'éçà', root)
55
        m1 = functions.add_map(u'M1', root)
56
        # La seconde carte appartient à "/Root/éçà"
57
        # et permet de tester les accès indirects.
58
        m2 = functions.add_map(u'M2', mg)
59
        m3 = functions.add_map(u'M3', root)
60
61
        # On ajoute l'hôte 2 fois sur M1 pour vérifier
62
        # l'absense de doublons dans les liens.
63 0dff1e21 Francois POIROTTE
        print("Preparation cartes")
64 dc005588 Francois POIROTTE
        functions.add_node_host(host, 'h1', m1)
65
        functions.add_node_host(host, 'h2', m1)
66
        functions.add_node_host(host, 'h', m2)
67
        functions.add_node_host(host, 'h', m3)
68
69
        # Création de quelques utilisateurs.
70 0dff1e21 Francois POIROTTE
        print("Creation des comptes utilisateurs et reglages permissions")
71 dc005588 Francois POIROTTE
        functions.add_user(u'restricted', u're@strict.ed',
72
                           u'restricted', u'restricted',
73
                           u'restricted')
74
        functions.add_user(u'unrestricted', u'unre@strict.ed',
75
                           u'unrestricted', u'unrestricted',
76
                           u'unrestricted')
77
        functions.add_user(u'no_rights', u'no_r@igh.ts',
78
                           u'no_rights', u'no_rights',
79
                           u'no_rights')
80
        # Les 3 utilisateurs ont accès à VigiBoard.
81
        functions.add_usergroup_permission(u'no_rights', u'vigiboard-access')
82
        functions.add_usergroup_permission(u'restricted', u'vigiboard-access')
83
        functions.add_usergroup_permission(u'unrestricted', u'vigiboard-access')
84
        # Mais seuls "restricted" et "unrestricted" ont accès à VigiMap.
85
        functions.add_usergroup_permission(u'restricted', u'vigimap-access')
86
        functions.add_usergroup_permission(u'unrestricted', u'vigimap-access')
87
        # Ils voient tous les trois les événements dans VigiBoard...
88
        functions.add_supitemgrouppermission(sig, 'no_rights')
89
        functions.add_supitemgrouppermission(sig, 'restricted')
90
        functions.add_supitemgrouppermission(sig, 'unrestricted')
91
        # ... mais "restricted" ne peut voir que "M2" ...
92
        functions.add_MapGroupPermission(mg, 'restricted')
93
        # ... tandis que "unrestricted" voit les 3 cartes (par héritage).
94
        functions.add_MapGroupPermission(root, 'unrestricted')
95
96
        DBSession.flush()
97
        transaction.commit()
98
99
    def tearDown(self):
100
        """Nettoyage après chaque test."""
101
        transaction.abort()
102
        DBSession.expunge_all()
103
        super(TestDetailsPluginMapsHostLimited, self).tearDown()
104
105
    def _insert_dep(self):
106
        """Insertion de l'événement corrélé de test."""
107 0dff1e21 Francois POIROTTE
        print("Insertion evenement correle")
108 1c5486c7 Francois POIROTTE
        timestamp = datetime.utcnow()
109 dc005588 Francois POIROTTE
        supitem = DBSession.query(self.supitem_class).one()
110 02c4a1e7 Francois POIROTTE
        if isinstance(supitem, tables.Host):
111 dc005588 Francois POIROTTE
            event = functions.add_event(supitem, u'DOWN', u'', timestamp)
112
        else: # Sinon, il s'agit d'un LowLevelService.
113
            event = functions.add_event(supitem, u'CRITICAL', u'', timestamp)
114
        functions.add_correvent([event], timestamp=timestamp)
115
        DBSession.flush()
116
        transaction.commit()
117 02c4a1e7 Francois POIROTTE
        correvent = DBSession.query(tables.CorrEvent.idcorrevent).one()
118 dc005588 Francois POIROTTE
        return correvent.idcorrevent
119
120
    def test_maps_links_anonymous(self):
121
        """Cartes dans dialogue détails en tant qu'anonyme."""
122
        idcorrevent = self._insert_dep()
123
        # 401 : Unauthorized car l'utilisateur doit s'authentifier
124
        # pour pouvoir accéder à la boîte de dialogue.
125
        self.app.post('/plugin_json', {
126
                'idcorrevent': idcorrevent,
127
                'plugin_name': 'details',
128
            }, extra_environ={}, status=401)
129
130
    def test_maps_links_manager(self):
131
        """Cartes dans dialogue détails en tant que manager."""
132
        idcorrevent = self._insert_dep()
133
        response = self.app.post('/plugin_json', {
134
                'idcorrevent': idcorrevent,
135
                'plugin_name': 'details',
136
            }, extra_environ={'REMOTE_USER': 'manager'})
137
        # Le manager a toujours accès à tout, la seule limite possible
138
        # est celle imposée par l'option "max_maps" dans la configuration.
139
        self.assertEquals(response.json['maps'], self.manager)
140
141
    def test_maps_links_no_rights(self):
142
        """Cartes dans dialogue détails sans droits."""
143
        idcorrevent = self._insert_dep()
144
        response = self.app.post('/plugin_json', {
145
                'idcorrevent': idcorrevent,
146
                'plugin_name': 'details',
147
            }, extra_environ={'REMOTE_USER': 'no_rights'})
148
        # L'utilisateur n'a pas accès à VigiMap, donc il ne doit pas voir
149
        # les cartes, même s'il a accès à VigiBoard par ailleurs.
150 a4ffe87d Francois POIROTTE
        self.assertEquals(response.json['maps'], [])
151 dc005588 Francois POIROTTE
152
    def test_maps_links_restricted(self):
153
        """Cartes dans dialogue détails avec droits restreints."""
154
        idcorrevent = self._insert_dep()
155
        response = self.app.post('/plugin_json', {
156
                'idcorrevent': idcorrevent,
157
                'plugin_name': 'details',
158
            }, extra_environ={'REMOTE_USER': 'restricted'})
159
        # L'utilisateur ne doit voir que les cartes pour lesquelles
160
        # il a été autorisé.
161
        self.assertEquals(response.json['maps'], self.restricted)
162
163
    def test_maps_links_unrestricted(self):
164
        """Cartes dans dialogue détails avec droits étendus."""
165
        idcorrevent = self._insert_dep()
166
        response = self.app.post('/plugin_json', {
167
                'idcorrevent': idcorrevent,
168
                'plugin_name': 'details',
169
            }, extra_environ={'REMOTE_USER': 'unrestricted'})
170
        # L'utilisateur ne doit voir que les cartes pour lesquelles
171
        # il a été autorisé (les mêmes que que "restricted" + "M2").
172
        self.assertEquals(response.json['maps'], self.unrestricted)
173
174
175
class TestDetailsPluginMapsHostDisabled(TestDetailsPluginMapsHostLimited):
176
    """
177
    Teste la désactivation de l'affichage des cartes
178
    dans le module de détails.
179
    """
180
    application_under_test = 'disabled_maps'
181
    # La réponse ne doit contenir aucune carte,
182
    # quel que soit l'utilisateur qui interroge
183
    # VigiBoard (la fonctionnalité est désactivée).
184 a4ffe87d Francois POIROTTE
    manager = []
185
    unrestricted = []
186
    restricted = []
187 dc005588 Francois POIROTTE
188
    def shortDescription(self, *args, **kwargs):
189
        """Description courte du test en cours d'exécution."""
190
        res = TestController.shortDescription(*args, **kwargs)
191
        return "%s (disabled + host)" % (res, )
192
193
194
class TestDetailsPluginMapsHostUnlimited(TestDetailsPluginMapsHostLimited):
195
    """
196
    Teste l'affichage des cartes dans le module de détails
197
    lorsqu'il n'y a aucun limite.
198
    """
199
    application_under_test = 'unlimited_maps'
200
    # Le manager voit tout et en particulier les 3 cartes sur lesquelles
201
    # l'hôte apparaît. M1 ne doit apparaître qu'une seule fois
202
    # même si l'hôte est présent 2 fois sur la carte.
203 a4ffe87d Francois POIROTTE
    manager = [[1, 'M1'], [2, 'M2'], [3, 'M3']]
204 dc005588 Francois POIROTTE
    # L'utilisateur avec droits étendus voit
205
    # la même chose que le manager (3 cartes).
206 a4ffe87d Francois POIROTTE
    unrestricted = manager[:]
207 dc005588 Francois POIROTTE
    # L'utilisateur avec droits restreints ne voit pas 'M2'.
208 a4ffe87d Francois POIROTTE
    restricted = [[2, 'M2']]
209 dc005588 Francois POIROTTE
210
    def shortDescription(self, *args, **kwargs):
211
        """Description courte du test en cours d'exécution."""
212
        res = TestController.shortDescription(*args, **kwargs)
213
        return "%s (unlimited + host)" % (res, )
214
215
class TestDetailsPluginMapsServiceLimited(
216
    TestDetailsPluginMapsHostLimited):
217
    """
218
    Idem que la classe mère mais teste un événement corrélé
219
    portant sur un service de l'hôte plutôt que sur l'hôte lui-même.
220
    """
221 02c4a1e7 Francois POIROTTE
    supitem_class = tables.LowLevelService
222 dc005588 Francois POIROTTE
223
    def shortDescription(self, *args, **kwargs):
224
        """Description courte du test en cours d'exécution."""
225
        # On court-circuite la hiérarchie de classes
226
        # pour appeler directement la méthode de nose/unittest.
227
        res = TestController.shortDescription(*args, **kwargs)
228
        return "%s (limited + service)" % (res, )
229
230
class TestDetailsPluginMapsServiceDisable(
231
    TestDetailsPluginMapsHostDisabled):
232
    """
233
    Idem que la classe mère mais teste un événement corrélé
234
    portant sur un service de l'hôte plutôt que sur l'hôte lui-même.
235
    """
236 02c4a1e7 Francois POIROTTE
    supitem_class = tables.LowLevelService
237 dc005588 Francois POIROTTE
238
    def shortDescription(self, *args, **kwargs):
239
        """Description courte du test en cours d'exécution."""
240
        # On court-circuite la hiérarchie de classes
241
        # pour appeler directement la méthode de nose/unittest.
242
        res = TestController.shortDescription(*args, **kwargs)
243
        return "%s (disabled + service)" % (res, )
244
245
class TestDetailsPluginMapsServiceUnlimited(
246
    TestDetailsPluginMapsHostUnlimited):
247
    """
248
    Idem que la classe mère mais teste un événement corrélé
249
    portant sur un service de l'hôte plutôt que sur l'hôte lui-même.
250
    """
251 02c4a1e7 Francois POIROTTE
    supitem_class = tables.LowLevelService
252 dc005588 Francois POIROTTE
253
    def shortDescription(self, *args, **kwargs):
254
        """Description courte du test en cours d'exécution."""
255
        # On court-circuite la hiérarchie de classes
256
        # pour appeler directement la méthode de nose/unittest.
257
        res = TestController.shortDescription(*args, **kwargs)
258
        return "%s (unlimited + service)" % (res, )