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
# -*- coding: utf-8 -*-
2
# Copyright (C) 2006-2020 CS GROUP - France
3
# 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
from __future__ import print_function
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.demo import functions
16
from vigilo.models import tables
17

    
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
    # La 1ère correspond à la limite, la seconde permet
26
    # de détecter qu'il y avait plus de cartes que la limite.
27
    manager = [[1, 'M1'], [2, 'M2']]
28
    # L'utilisateur avec droits étendus voit
29
    # la même chose que le manager (2 cartes).
30
    unrestricted = manager[:]
31
    # L'utilisateur avec droits restreints ne voit
32
    # qu'une seule carte : "M2".
33
    restricted = [[2, 'M2']]
34
    supitem_class = tables.Host
35

    
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
        DBSession.add(tables.Permission(permission_name=u'vigimap-access'))
48

    
49
        print("Creation hote, service et cartes")
50
        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
        print("Preparation cartes")
64
        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
        print("Creation des comptes utilisateurs et reglages permissions")
71
        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
        print("Insertion evenement correle")
108
        timestamp = datetime.utcnow()
109
        supitem = DBSession.query(self.supitem_class).one()
110
        if isinstance(supitem, tables.Host):
111
            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
        correvent = DBSession.query(tables.CorrEvent.idcorrevent).one()
118
        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
        self.assertEquals(response.json['maps'], [])
151

    
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
    manager = []
185
    unrestricted = []
186
    restricted = []
187

    
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
    manager = [[1, 'M1'], [2, 'M2'], [3, 'M3']]
204
    # L'utilisateur avec droits étendus voit
205
    # la même chose que le manager (3 cartes).
206
    unrestricted = manager[:]
207
    # L'utilisateur avec droits restreints ne voit pas 'M2'.
208
    restricted = [[2, 'M2']]
209

    
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
    supitem_class = tables.LowLevelService
222

    
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
    supitem_class = tables.LowLevelService
237

    
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
    supitem_class = tables.LowLevelService
252

    
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, )