Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / tests / functional / plugins / test_details_plugin_maps.py @ dc005588

History | View | Annotate | Download (11.1 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 la partie "Cartes" du formulaire contenant les détails
7
pour un événement corrélé.
8
"""
9
from datetime import datetime
10
import transaction
11

    
12
from vigiboard.tests import TestController
13
from vigilo.models.session import DBSession
14
from vigilo.models.demo import functions
15
from vigilo.models.tables import Permission, CorrEvent, Host, LowLevelService
16

    
17
class TestDetailsPluginMapsHostLimited(TestController):
18
    """
19
    Teste l'affichage des cartes dans le module de détails
20
    lorsqu'une limite à été réglée pour l'affichage.
21
    """
22
    application_under_test = 'limited_maps'
23
    # Seules les 2 premières cartes doivent figurer.
24
    # La 1ère correspond à la limite, la 2 seconde permet
25
    # de détecter qu'il y avait plus de cartes que la limite.
26
    manager = {'1': 'M1', '2': 'M2'}
27
    # L'utilisateur avec droits étendus voit
28
    # la même chose que le manager (2 cartes).
29
    unrestricted = manager.copy()
30
    # L'utilisateur avec droits restreints ne voit
31
    # qu'une seule carte : "M2".
32
    restricted = {'2': 'M2'}
33
    supitem_class = Host
34

    
35
    def shortDescription(self, *args, **kwargs):
36
        """Description courte du test en cours d'exécution."""
37
        res = TestController.shortDescription(*args, **kwargs)
38
        return "%s (limited + host)" % (res, )
39

    
40
    def setUp(self):
41
        """Initialisation avant chaque test."""
42
        super(TestDetailsPluginMapsHostLimited, self).setUp()
43
        # On fait manuellement ce que l'initialisation de VigiMap ferait
44
        # (car on est dans les tests de VigiBoard, pas ceux de VigiMap).
45
        root = functions.add_mapgroup(u'Root')
46
        DBSession.add(Permission(permission_name=u'vigimap-access'))
47

    
48
        print "Creation hote, service et cartes"
49
        host = functions.add_host(u'localhost éçà')
50
        functions.add_lowlevelservice(host, u'lls éçà')
51
        sig = functions.add_supitemgroup(u'supitemgroup éçà')
52
        functions.add_host2group(host, sig)
53
        mg = functions.add_mapgroup(u'éçà', root)
54
        m1 = functions.add_map(u'M1', root)
55
        # La seconde carte appartient à "/Root/éçà"
56
        # et permet de tester les accès indirects.
57
        m2 = functions.add_map(u'M2', mg)
58
        m3 = functions.add_map(u'M3', root)
59

    
60
        # On ajoute l'hôte 2 fois sur M1 pour vérifier
61
        # l'absense de doublons dans les liens.
62
        print "Preparation cartes"
63
        functions.add_node_host(host, 'h1', m1)
64
        functions.add_node_host(host, 'h2', m1)
65
        functions.add_node_host(host, 'h', m2)
66
        functions.add_node_host(host, 'h', m3)
67

    
68
        # Création de quelques utilisateurs.
69
        print "Creation des comptes utilisateurs et reglages permissions"
70
        functions.add_user(u'restricted', u're@strict.ed',
71
                           u'restricted', u'restricted',
72
                           u'restricted')
73
        functions.add_user(u'unrestricted', u'unre@strict.ed',
74
                           u'unrestricted', u'unrestricted',
75
                           u'unrestricted')
76
        functions.add_user(u'no_rights', u'no_r@igh.ts',
77
                           u'no_rights', u'no_rights',
78
                           u'no_rights')
79
        # Les 3 utilisateurs ont accès à VigiBoard.
80
        functions.add_usergroup_permission(u'no_rights', u'vigiboard-access')
81
        functions.add_usergroup_permission(u'restricted', u'vigiboard-access')
82
        functions.add_usergroup_permission(u'unrestricted', u'vigiboard-access')
83
        # Mais seuls "restricted" et "unrestricted" ont accès à VigiMap.
84
        functions.add_usergroup_permission(u'restricted', u'vigimap-access')
85
        functions.add_usergroup_permission(u'unrestricted', u'vigimap-access')
86
        # Ils voient tous les trois les événements dans VigiBoard...
87
        functions.add_supitemgrouppermission(sig, 'no_rights')
88
        functions.add_supitemgrouppermission(sig, 'restricted')
89
        functions.add_supitemgrouppermission(sig, 'unrestricted')
90
        # ... mais "restricted" ne peut voir que "M2" ...
91
        functions.add_MapGroupPermission(mg, 'restricted')
92
        # ... tandis que "unrestricted" voit les 3 cartes (par héritage).
93
        functions.add_MapGroupPermission(root, 'unrestricted')
94

    
95
        DBSession.flush()
96
        transaction.commit()
97

    
98
    def tearDown(self):
99
        """Nettoyage après chaque test."""
100
        transaction.abort()
101
        DBSession.expunge_all()
102
        super(TestDetailsPluginMapsHostLimited, self).tearDown()
103

    
104
    def _insert_dep(self):
105
        """Insertion de l'événement corrélé de test."""
106
        print "Insertion evenement correle"
107
        timestamp = datetime.now()
108
        supitem = DBSession.query(self.supitem_class).one()
109
        if isinstance(supitem, Host):
110
            event = functions.add_event(supitem, u'DOWN', u'', timestamp)
111
        else: # Sinon, il s'agit d'un LowLevelService.
112
            event = functions.add_event(supitem, u'CRITICAL', u'', timestamp)
113
        functions.add_correvent([event], timestamp=timestamp)
114
        DBSession.flush()
115
        transaction.commit()
116
        correvent = DBSession.query(CorrEvent.idcorrevent).one()
117
        return correvent.idcorrevent
118

    
119
    def test_maps_links_anonymous(self):
120
        """Cartes dans dialogue détails en tant qu'anonyme."""
121
        idcorrevent = self._insert_dep()
122
        # 401 : Unauthorized car l'utilisateur doit s'authentifier
123
        # pour pouvoir accéder à la boîte de dialogue.
124
        self.app.post('/plugin_json', {
125
                'idcorrevent': idcorrevent,
126
                'plugin_name': 'details',
127
            }, extra_environ={}, status=401)
128

    
129
    def test_maps_links_manager(self):
130
        """Cartes dans dialogue détails en tant que manager."""
131
        idcorrevent = self._insert_dep()
132
        response = self.app.post('/plugin_json', {
133
                'idcorrevent': idcorrevent,
134
                'plugin_name': 'details',
135
            }, extra_environ={'REMOTE_USER': 'manager'})
136
        # Le manager a toujours accès à tout, la seule limite possible
137
        # est celle imposée par l'option "max_maps" dans la configuration.
138
        self.assertEquals(response.json['maps'], self.manager)
139

    
140
    def test_maps_links_no_rights(self):
141
        """Cartes dans dialogue détails sans droits."""
142
        idcorrevent = self._insert_dep()
143
        response = self.app.post('/plugin_json', {
144
                'idcorrevent': idcorrevent,
145
                'plugin_name': 'details',
146
            }, extra_environ={'REMOTE_USER': 'no_rights'})
147
        # L'utilisateur n'a pas accès à VigiMap, donc il ne doit pas voir
148
        # les cartes, même s'il a accès à VigiBoard par ailleurs.
149
        self.assertEquals(response.json['maps'], {})
150

    
151
    def test_maps_links_restricted(self):
152
        """Cartes dans dialogue détails avec droits restreints."""
153
        idcorrevent = self._insert_dep()
154
        response = self.app.post('/plugin_json', {
155
                'idcorrevent': idcorrevent,
156
                'plugin_name': 'details',
157
            }, extra_environ={'REMOTE_USER': 'restricted'})
158
        # L'utilisateur ne doit voir que les cartes pour lesquelles
159
        # il a été autorisé.
160
        self.assertEquals(response.json['maps'], self.restricted)
161

    
162
    def test_maps_links_unrestricted(self):
163
        """Cartes dans dialogue détails avec droits étendus."""
164
        idcorrevent = self._insert_dep()
165
        response = self.app.post('/plugin_json', {
166
                'idcorrevent': idcorrevent,
167
                'plugin_name': 'details',
168
            }, extra_environ={'REMOTE_USER': 'unrestricted'})
169
        # L'utilisateur ne doit voir que les cartes pour lesquelles
170
        # il a été autorisé (les mêmes que que "restricted" + "M2").
171
        self.assertEquals(response.json['maps'], self.unrestricted)
172

    
173

    
174
class TestDetailsPluginMapsHostDisabled(TestDetailsPluginMapsHostLimited):
175
    """
176
    Teste la désactivation de l'affichage des cartes
177
    dans le module de détails.
178
    """
179
    application_under_test = 'disabled_maps'
180
    # La réponse ne doit contenir aucune carte,
181
    # quel que soit l'utilisateur qui interroge
182
    # VigiBoard (la fonctionnalité est désactivée).
183
    manager = {}
184
    unrestricted = {}
185
    restricted = {}
186

    
187
    def shortDescription(self, *args, **kwargs):
188
        """Description courte du test en cours d'exécution."""
189
        res = TestController.shortDescription(*args, **kwargs)
190
        return "%s (disabled + host)" % (res, )
191

    
192

    
193
class TestDetailsPluginMapsHostUnlimited(TestDetailsPluginMapsHostLimited):
194
    """
195
    Teste l'affichage des cartes dans le module de détails
196
    lorsqu'il n'y a aucun limite.
197
    """
198
    application_under_test = 'unlimited_maps'
199
    # Le manager voit tout et en particulier les 3 cartes sur lesquelles
200
    # l'hôte apparaît. M1 ne doit apparaître qu'une seule fois
201
    # même si l'hôte est présent 2 fois sur la carte.
202
    manager = {'1': 'M1', '3': 'M3', '2': 'M2'}
203
    # L'utilisateur avec droits étendus voit
204
    # la même chose que le manager (3 cartes).
205
    unrestricted = manager.copy()
206
    # L'utilisateur avec droits restreints ne voit pas 'M2'.
207
    restricted = {'2': 'M2'}
208

    
209
    def shortDescription(self, *args, **kwargs):
210
        """Description courte du test en cours d'exécution."""
211
        res = TestController.shortDescription(*args, **kwargs)
212
        return "%s (unlimited + host)" % (res, )
213

    
214
class TestDetailsPluginMapsServiceLimited(
215
    TestDetailsPluginMapsHostLimited):
216
    """
217
    Idem que la classe mère mais teste un événement corrélé
218
    portant sur un service de l'hôte plutôt que sur l'hôte lui-même.
219
    """
220
    supitem_class = LowLevelService
221

    
222
    def shortDescription(self, *args, **kwargs):
223
        """Description courte du test en cours d'exécution."""
224
        # On court-circuite la hiérarchie de classes
225
        # pour appeler directement la méthode de nose/unittest.
226
        res = TestController.shortDescription(*args, **kwargs)
227
        return "%s (limited + service)" % (res, )
228

    
229
class TestDetailsPluginMapsServiceDisable(
230
    TestDetailsPluginMapsHostDisabled):
231
    """
232
    Idem que la classe mère mais teste un événement corrélé
233
    portant sur un service de l'hôte plutôt que sur l'hôte lui-même.
234
    """
235
    supitem_class = LowLevelService
236

    
237
    def shortDescription(self, *args, **kwargs):
238
        """Description courte du test en cours d'exécution."""
239
        # On court-circuite la hiérarchie de classes
240
        # pour appeler directement la méthode de nose/unittest.
241
        res = TestController.shortDescription(*args, **kwargs)
242
        return "%s (disabled + service)" % (res, )
243

    
244
class TestDetailsPluginMapsServiceUnlimited(
245
    TestDetailsPluginMapsHostUnlimited):
246
    """
247
    Idem que la classe mère mais teste un événement corrélé
248
    portant sur un service de l'hôte plutôt que sur l'hôte lui-même.
249
    """
250
    supitem_class = LowLevelService
251

    
252
    def shortDescription(self, *args, **kwargs):
253
        """Description courte du test en cours d'exécution."""
254
        # On court-circuite la hiérarchie de classes
255
        # pour appeler directement la méthode de nose/unittest.
256
        res = TestController.shortDescription(*args, **kwargs)
257
        return "%s (unlimited + service)" % (res, )