Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (8.26 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
""" Test du plugin listant les services de haut niveau impactés. """
6

    
7
from datetime import datetime
8
import transaction
9
from nose.tools import assert_equal
10

    
11
from vigilo.models.session import DBSession
12
from vigilo.models.tables import Permission, DataPermission, StateName, \
13
                            SupItemGroup, Host, HighLevelService, \
14
                            Event, CorrEvent, ImpactedPath, ImpactedHLS, \
15
                            User, UserGroup
16
from vigiboard.tests import TestController
17

    
18
def populate_DB():
19
    """ Peuple la base de données. """
20

    
21
    # On ajoute un groupe d'hôtes
22
    hostmanagers = SupItemGroup(name=u'managersgroup', parent=None)
23
    DBSession.add(hostmanagers)
24
    DBSession.flush()
25

    
26
    # On lui octroie les permissions
27
    usergroup = UserGroup.by_group_name(u'users_with_access')
28
    DBSession.add(DataPermission(
29
        group=hostmanagers,
30
        usergroup=usergroup,
31
        access=u'r',
32
    ))
33
    DBSession.flush()
34

    
35
    # On crée un hôte de test.
36
    host = Host(
37
        name = u'host',
38
        snmpcommunity = u'public',
39
        hosttpl = u'/dev/null',
40
        address = u'192.168.1.1',
41
        snmpport = 42,
42
        weight = 42,
43
        )
44
    DBSession.add(host)
45

    
46
    # On affecte cet hôte au groupe précédemment créé.
47
    hostmanagers.supitems.append(host)
48
    DBSession.flush()
49

    
50
    # On ajoute un évènement causé par cet hôte.
51
    event1 = Event(
52
        supitem = host,
53
        message = u'foo',
54
        current_state = StateName.statename_to_value(u'WARNING'),
55
        timestamp = datetime.now(),
56
    )
57
    DBSession.add(event1)
58
    DBSession.flush()
59

    
60
    # On ajoute un évènement corrélé causé par cet évènement 'brut'.
61
    aggregate = CorrEvent(
62
        idcause = event1.idevent,
63
        timestamp_active = datetime.now(),
64
        priority = 1,
65
        ack = CorrEvent.ACK_NONE)
66
    aggregate.events.append(event1)
67
    DBSession.add(aggregate)
68
    DBSession.flush()
69

    
70
    transaction.commit()
71
    return aggregate
72

    
73
def add_paths(path_number, path_length, idsupitem):
74
    """
75
    Ajoute path_number chemins de services de haut niveau impactés
76
    dans la base de donnée. Leur longeur sera égale à path_length.
77
    La 3ème valeur passée en paramètre est l'id du supitem impactant.
78

79
    path_number * path_length services de
80
    haut niveau sont créés dans l'opération.
81
    """
82

    
83
    # Création de services de haut niveau dans la BDD.
84
    hls_template = {
85
        'message': u'Bar',
86
        'warning_threshold': 60,
87
        'critical_threshold': 80,
88
        'weight': None,
89
    }
90

    
91
    # Création des chemins de services de haut niveau impactés.
92
    for j in range(path_number):
93

    
94
        # On crée le chemin en lui-même
95
        path = ImpactedPath(idsupitem = idsupitem)
96
        DBSession.add(path)
97
        DBSession.flush()
98

    
99
        # Pour chaque étage du chemin,
100
        for i in range(path_length):
101
            # on ajoute un service de haut niveau dans la BDD,
102
            hls = HighLevelService(
103
                servicename = u'HLS' + str(j + 1) + str(i + 1),
104
                **hls_template)
105
            DBSession.add(hls)
106
            # et on ajoute un étage au chemin contenant ce service.
107
            DBSession.add(
108
                ImpactedHLS(
109
                    path = path,
110
                    hls = hls,
111
                    distance = i + 1,
112
                    ))
113

    
114
    DBSession.flush()
115
    transaction.commit()
116

    
117

    
118
class TestHLSPlugin(TestController):
119
    """
120
    Classe de test du contrôleur listant les services
121
    de haut niveau impactés par un évènement corrélé.
122
    """
123
    def setUp(self):
124
        super(TestHLSPlugin, self).setUp()
125
        perm = Permission.by_permission_name(u'vigiboard-access')
126

    
127
        user = User(
128
            user_name=u'access',
129
            fullname=u'',
130
            email=u'user.has@access',
131
        )
132
        usergroup = UserGroup(group_name=u'users_with_access')
133
        usergroup.permissions.append(perm)
134
        user.usergroups.append(usergroup)
135
        DBSession.add(user)
136
        DBSession.add(usergroup)
137
        DBSession.flush()
138

    
139
        self.aggregate = populate_DB()
140

    
141
    def test_no_impacted_hls(self):
142
        """
143
        Données affichées par le plugin HLS pour 0 HLS impacté
144
        Teste les données affichées par le  plugin lorsque
145
        aucun service de haut niveau n'est impacté.
146
        """
147

    
148
        # On peuple la base de données avant le test.
149
        DBSession.add(self.aggregate)
150
        add_paths(0, 0, self.aggregate.events[0].idsupitem)
151
        DBSession.add(self.aggregate)
152

    
153
        # On accède à la page principale de VigiBoard
154
        resp = self.app.post(
155
            '/', extra_environ={'REMOTE_USER': 'access'})
156

    
157
        # On s'assure que la colonne des HLS
158
        # impactés est vide pour notre évènement.
159
        plugin_data = resp.lxml.xpath('//table[@class="vigitable"]'
160
            '/tbody/tr/td[@class="plugin_hls"]/text()')
161
        assert_equal(plugin_data[0].strip(), "")
162

    
163
    def test_1_impacted_hls_path(self):
164
        """
165
        Données affichées par le plugin HLS pour 1 chemin impacté
166
        Teste les données affichées par le  plugin lorsque
167
        1 chemin de services de haut niveau est impacté.
168
        """
169

    
170
        # On peuple la base de données avant le test.
171
        DBSession.add(self.aggregate)
172
        add_paths(1, 2, self.aggregate.events[0].idsupitem)
173
        DBSession.add(self.aggregate)
174

    
175
        # On accède à la page principale de VigiBoard
176
        resp = self.app.post(
177
            '/', extra_environ={'REMOTE_USER': 'access'})
178

    
179
        # On s'assure que la colonne des HLS impactés contient
180
        # bien le nom de notre HLS de plus haut niveau impacté.
181
        plugin_data = resp.lxml.xpath('//table[@class="vigitable"]'
182
            '/tbody/tr/td[@class="plugin_hls"]/text()')
183
        assert_equal(plugin_data[0].strip(), "HLS12")
184

    
185
    def test_2_impacted_hls_path(self):
186
        """
187
        Données affichées par le plugin HLS pour 2 chemins impactés
188
        Teste les données affichées par le plugin lorsque
189
        2 chemins de services de haut niveau sont impactés.
190
        """
191

    
192
        # On peuple la base de données avant le test.
193
        DBSession.add(self.aggregate)
194
        add_paths(2, 2, self.aggregate.events[0].idsupitem)
195
        DBSession.add(self.aggregate)
196

    
197
        # On accède à la page principale de VigiBoard
198
        resp = self.app.post(
199
            '/', extra_environ={'REMOTE_USER': 'access'})
200

    
201
        # On s'assure que la colonne des HLS contient bien
202
        # le nombre de HLS de plus haut niveau impactés,
203
        plugin_data = resp.lxml.xpath('//table[@class="vigitable"]'
204
            '/tbody/tr/td[@class="plugin_hls"]/a/text()')
205
        assert_equal(plugin_data[0].strip(), "2")
206

    
207
    def test_same_hls_impacted_twice(self):
208
        """
209
        Pas de doublons dans les HLS impactés.
210
        Ticket #732.
211
        """
212

    
213
        # On peuple la base de données avant le test.
214
        DBSession.add(self.aggregate)
215
        hls = HighLevelService(
216
            servicename = u'HLS',
217
            message = u'Bar',
218
            warning_threshold = 60,
219
            critical_threshold = 80,
220
            weight = None,
221
        )
222
        DBSession.add(hls)
223
        DBSession.flush()
224
        path1 = ImpactedPath(idsupitem = self.aggregate.events[0].idsupitem)
225
        DBSession.add(path1)
226
        path2 = ImpactedPath(idsupitem = self.aggregate.events[0].idsupitem)
227
        DBSession.add(path2)
228
        DBSession.flush()
229
        DBSession.add(
230
            ImpactedHLS(
231
                path = path1,
232
                hls = hls,
233
                distance = 1,
234
            )
235
        )
236
        DBSession.add(
237
            ImpactedHLS(
238
                path = path2,
239
                hls = hls,
240
                distance = 2,
241
            )
242
        )
243
        DBSession.flush()
244
        transaction.commit()
245
        DBSession.add(self.aggregate)
246

    
247
        # On accède à la page principale de VigiBoard
248
        resp = self.app.post(
249
            '/', extra_environ={'REMOTE_USER': 'access'})
250

    
251
        # On s'assure que la colonne des HLS contient bien
252
        # le nom de notre HLS de plus haut niveau impacté.
253
        plugin_data = resp.lxml.xpath('//table[@class="vigitable"]'
254
            '/tbody/tr/td[@class="plugin_hls"]/text()')
255
        assert_equal(plugin_data[0].strip(), "HLS")