Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / tests / functional / plugins / test_plugin_hls.py @ e7e3d45e

History | View | Annotate | Download (8.16 KB)

1
# -*- coding: utf-8 -*-
2
""" Test du plugin listant les services de haut niveau impactés. """
3

    
4
from datetime import datetime
5
import transaction
6
from nose.tools import assert_equal
7

    
8
from vigilo.models.session import DBSession
9
from vigilo.models.tables import Permission, StateName, \
10
                            HostGroup, Host, HighLevelService, \
11
                            Event, CorrEvent, ImpactedPath, ImpactedHLS
12
from vigiboard.tests import TestController
13

    
14
def populate_DB():
15
    """ Peuple la base de données. """
16

    
17
    # On ajoute un groupe d'hôtes
18
    hostmanagers = HostGroup(name = u'managersgroup')
19
    DBSession.add(hostmanagers)
20
    DBSession.flush()
21

    
22
    # On lui octroie les permissions
23
    manage_perm = Permission.by_permission_name(u'manage')
24
    hostmanagers.permissions.append(manage_perm)
25
    DBSession.flush()
26

    
27
    # On crée un hôte de test.
28
    host = Host(
29
        name = u'host', 
30
        checkhostcmd = u'halt',
31
        snmpcommunity = u'public',
32
        hosttpl = u'/dev/null',
33
        mainip = u'192.168.1.1',
34
        snmpport = 42,
35
        weight = 42,
36
        )
37
    DBSession.add(host)
38

    
39
    # On affecte cet hôte au groupe précédemment créé.
40
    hostmanagers.hosts.append(host)
41
    DBSession.flush()
42

    
43
    # On ajoute un évènement causé par cet hôte.
44
    event1 = Event(
45
        supitem = host,
46
        message = u'foo',
47
        current_state = StateName.statename_to_value(u'WARNING'),
48
        timestamp = datetime.now(),
49
    )
50
    DBSession.add(event1)
51
    DBSession.flush()
52

    
53
    # On ajoute un évènement corrélé causé par cet évènement 'brut'.
54
    aggregate = CorrEvent(
55
        idcause = event1.idevent, 
56
        timestamp_active = datetime.now(),
57
        priority = 1,
58
        status = u'None')
59
    aggregate.events.append(event1)
60
    DBSession.add(aggregate)
61
    DBSession.flush()
62
    
63
    transaction.commit()
64

    
65
    return aggregate
66

    
67
def add_paths(path_number, path_length, idsupitem):
68
    """ 
69
    Ajoute path_number chemins de services de haut niveau impactés
70
    dans la base de donnée. Leur longeur sera égale à path_length.
71
    La 3ème valeur passée en paramètre est l'id du supitem impactant.
72
     
73
    path_number * path_length services de 
74
    haut niveau sont créés dans l'opération.
75
    """
76

    
77
    # Création de services de haut niveau dans la BDD.
78
    hls_template = {
79
        'op_dep': u'&',
80
        'message': u'Bar',
81
        'warning_threshold': 60,
82
        'critical_threshold': 80,
83
        'weight': None,
84
        'priority': 2,
85
    }
86

    
87
    # Création des chemins de services de haut niveau impactés.
88
    for j in range(path_number):
89
        
90
        # On crée le chemin en lui-même
91
        path = ImpactedPath(idsupitem = idsupitem)
92
        DBSession.add(path)
93
        DBSession.flush()
94
        
95
        # Pour chaque étage du chemin,
96
        for i in range(path_length):
97
            # on ajoute un service de haut niveau dans la BDD,
98
            hls = HighLevelService(
99
                servicename = u'HLS' + str(j + 1) + str(i + 1), 
100
                **hls_template)
101
            DBSession.add(hls)
102
            # et on ajoute un étage au chemin contenant ce service. 
103
            DBSession.add(
104
                ImpactedHLS(
105
                    path = path,
106
                    hls = hls,
107
                    distance = i + 1,
108
                    ))
109
    
110
    DBSession.flush()
111
    transaction.commit()
112

    
113

    
114
class TestHLSPlugin(TestController):
115
    """
116
    Classe de test du contrôleur listant les services 
117
    de haut niveau impactés par un évènement corrélé.
118
    """
119
    
120
    def test_no_impacted_hls(self):
121
        """
122
        Retour du plugin HLS pour 0 HLS impacté
123
        Teste la valeur de retour du plugin lorsque
124
        aucun service de haut niveau n'est impacté.
125
        """
126
        
127
        # On peuple la base de données avant le test.
128
        aggregate = populate_DB()
129
        DBSession.add(aggregate)
130
        add_paths(0, 0, aggregate.events[0].idsupitem)
131
        DBSession.add(aggregate)
132
        
133
        ### 1er cas : l'utilisateur n'est pas connecté.
134
        # On vérifie que le plugin retourne bien une erreur 401.
135
        resp = self.app.post(
136
            '/get_plugin_value', 
137
            {"idcorrevent" : str(aggregate.idcorrevent),
138
             "plugin_name" : "hls"},
139
            status = 401,)
140
        
141
        ### 2ème cas : l'utilisateur n'a pas les
142
        ### droits sur l'hôte ayant causé le correvent.
143
        # On vérifie que le plugin retourne bien une erreur 404.
144
        resp = self.app.post(
145
            '/get_plugin_value', 
146
            {"idcorrevent" : str(aggregate.idcorrevent),
147
             "plugin_name" : "hls"},
148
            status = 404,
149
            extra_environ={'REMOTE_USER': 'editor'})
150
        
151
        ### 3ème cas : l'utilisateur a cette fois les droits.
152
        resp = self.app.post(
153
            '/get_plugin_value', 
154
            {"idcorrevent" : str(aggregate.idcorrevent),
155
             "plugin_name" : "hls"},
156
            extra_environ={'REMOTE_USER': 'manager'})
157
        # On vérifie que le plugin ne retourne toujours rien.
158
        assert_equal(resp.json, {"services": []})
159
    
160
    def test_1_impacted_hls_path(self):
161
        """
162
        Retour du plugin HLS pour 1 chemin impacté
163
        Teste la valeur de retour du plugin lorsqu'un
164
        chemin de services de haut niveau est impacté.
165
        """
166
        
167
        # On peuple la base de données avant le test.
168
        aggregate = populate_DB()
169
        DBSession.add(aggregate)
170
        add_paths(1, 2, aggregate.events[0].idsupitem)
171
        DBSession.add(aggregate)
172
        
173
        ### 1er cas : l'utilisateur n'est pas connecté.
174
        # On vérifie que le plugin retourne bien une erreur 401.
175
        resp = self.app.post(
176
            '/get_plugin_value', 
177
            {"idcorrevent" : str(aggregate.idcorrevent),
178
             "plugin_name" : "hls"},
179
            status = 401,)
180
        
181
        ### 2ème cas : l'utilisateur n'a pas les droits
182
        ### sur l'hôte ayant causé le correvent, on doit
183
        ### obtenir une erreur 404 (pas d'événement trouvé
184
        ### avec les informations liées à cet utilisateur).
185
        resp = self.app.post(
186
            '/get_plugin_value', 
187
            {"idcorrevent" : str(aggregate.idcorrevent),
188
             "plugin_name" : "hls"},
189
            status = 404,
190
            extra_environ={'REMOTE_USER': 'editor'})
191
        
192
        ### 3ème cas : l'utilisateur a cette fois les droits.
193
        resp = self.app.post(
194
            '/get_plugin_value', 
195
            {"idcorrevent" : str(aggregate.idcorrevent),
196
             "plugin_name" : "hls"},
197
            extra_environ={'REMOTE_USER': 'manager'})
198
        # On vérifie que le plugin retourne bien les 2 HLS impactés.
199
        assert_equal(resp.json, {"services": ['HLS12']})
200
    
201
    def test_2_impacted_hls_path(self):
202
        """
203
        Retour du plugin HLS pour 2 chemins impactés
204
        Teste la valeur de retour du plugin lorsque deux
205
        chemins de services de haut niveau sont impactés.
206
        """
207
        
208
        # On peuple la base de données avant le test.
209
        aggregate = populate_DB()
210
        DBSession.add(aggregate)
211
        add_paths(2, 2, aggregate.events[0].idsupitem)
212
        DBSession.add(aggregate)
213
        
214
        ### 1er cas : l'utilisateur n'est pas connecté.
215
        # On vérifie que le plugin retourne bien une erreur 401.
216
        resp = self.app.post(
217
            '/get_plugin_value', 
218
            {"idcorrevent" : str(aggregate.idcorrevent),
219
             "plugin_name" : "hls"},
220
            status = 401,)
221
        
222
        ### 2ème cas : l'utilisateur n'a pas les
223
        ### droits sur l'hôte ayant causé le correvent.
224
        resp = self.app.post(
225
            '/get_plugin_value', 
226
            {"idcorrevent" : str(aggregate.idcorrevent),
227
             "plugin_name" : "hls"},
228
            status = 404,
229
            extra_environ={'REMOTE_USER': 'editor'})
230
        
231
        ### 3ème cas : l'utilisateur a cette fois les droits.
232
        resp = self.app.post(
233
            '/get_plugin_value', 
234
            {"idcorrevent" : str(aggregate.idcorrevent),
235
             "plugin_name" : "hls"},
236
            extra_environ={'REMOTE_USER': 'manager'})
237
        # On vérifie que le plugin retourne bien les 4 HLS impactés.
238
        assert_equal(resp.json, {"services": ['HLS12', 'HLS22']})
239