Revision cf3c2494
Chaque plugin adresse désormais une seule requête à la base de données pour tous les évènements de la page, plutôt qu'une requête par évènement.
git-svn-id: https://vigilo-dev.si.c-s.fr/svn@6291 b22e2e97-25c9-44ff-b637-2e5ceca36478
vigiboard/controllers/plugins/hls.py | ||
---|---|---|
25 | 25 |
|
26 | 26 |
from vigiboard.controllers.plugins import VigiboardRequestPlugin |
27 | 27 |
from vigilo.models.session import DBSession |
28 |
from vigilo.models.tables import HighLevelService, CorrEvent, Event, SupItem |
|
28 |
from vigilo.models.tables import HighLevelService, CorrEvent, Event, SupItem, \ |
|
29 |
ImpactedHLS, ImpactedPath |
|
30 |
from sqlalchemy.orm import aliased |
|
31 |
from sqlalchemy.sql import functions |
|
29 | 32 |
|
30 | 33 |
class PluginHLS(VigiboardRequestPlugin): |
31 | 34 |
""" |
32 | 35 |
Plugin qui permet de voir les services de haut niveau impactés par |
33 |
un événement.
|
|
36 |
les événements affichés sur la page principale de VigiBoard.
|
|
34 | 37 |
""" |
35 |
def get_value(self, idcorrevent): |
|
38 |
|
|
39 |
def get_bulk_data(self, events_ids): |
|
36 | 40 |
""" |
37 |
Renvoie le nom des services de haut niveau impactés par l'événement. |
|
41 |
Renvoie le nom des services de haut niveau impactés |
|
42 |
par chacun des événements du tableau de VigiBoard. |
|
38 | 43 |
|
39 |
@param idcorrevent: Identifiant de l'événement corrélé. |
|
40 |
@type idcorrevent: C{int} |
|
41 |
@return: Un dictionnaire dont la clé "services" contient une liste |
|
42 |
des noms des services de haut niveau impactés par l'événement |
|
43 |
corrélé dont l'identifiant est L{idcorrevent}. |
|
44 |
@param events_ids: Liste des identifiants des événements corrélés |
|
45 |
à afficher. |
|
46 |
@type events_ids: C{int} |
|
47 |
@return: Un dictionnaire associant à chaque identifiant d'évènement |
|
48 |
la liste des noms des HLS de plus haut niveau qu'il impacte. |
|
49 |
@rtype: C{dict} |
|
44 | 50 |
""" |
45 |
supitem = self.get_correvent_supitem(idcorrevent) |
|
46 | 51 |
|
47 |
if not supitem: |
|
48 |
return [] |
|
52 |
imp_hls1 = aliased(ImpactedHLS) |
|
53 |
imp_hls2 = aliased(ImpactedHLS) |
|
54 |
|
|
55 |
# Sous-requête récupérant les identifiants des supitems |
|
56 |
# impactés par les évènements passés en paramètre. |
|
57 |
subquery = DBSession.query( |
|
58 |
SupItem.idsupitem, |
|
59 |
CorrEvent.idcorrevent |
|
60 |
).join( |
|
61 |
(Event, Event.idsupitem == SupItem.idsupitem), |
|
62 |
(CorrEvent, CorrEvent.idcause == Event.idevent), |
|
63 |
).filter(CorrEvent.idcorrevent.in_(events_ids) |
|
64 |
).subquery() |
|
65 |
|
|
66 |
# Sous-requête récupérant les identifiants des SHN de plus |
|
67 |
# haut niveau impactés par les évènements passés en paramètre. |
|
68 |
# Fait appel à la sous-requête précédente (subquery). |
|
69 |
subquery2 = DBSession.query( |
|
70 |
functions.max(imp_hls1.distance).label('distance'), |
|
71 |
imp_hls1.idpath, |
|
72 |
subquery.c.idcorrevent |
|
73 |
).join( |
|
74 |
(ImpactedPath, ImpactedPath.idpath == imp_hls1.idpath) |
|
75 |
).join( |
|
76 |
(subquery, ImpactedPath.idsupitem == subquery.c.idsupitem) |
|
77 |
).group_by(imp_hls1.idpath, subquery.c.idcorrevent |
|
78 |
).subquery() |
|
49 | 79 |
|
50 |
services = supitem.impacted_hls( |
|
51 |
HighLevelService.servicename |
|
52 |
).distinct().order_by( |
|
80 |
# Requête récupérant les noms des SHN de plus haut niveau |
|
81 |
# impactés par chacun des évènements passés en paramètre. |
|
82 |
# Fait appel à la sous-requête précédente (subquery2). |
|
83 |
services = DBSession.query( |
|
84 |
HighLevelService.servicename, |
|
85 |
subquery2.c.idcorrevent |
|
86 |
).join( |
|
87 |
(imp_hls2, HighLevelService.idservice == imp_hls2.idhls), |
|
88 |
(subquery2, subquery2.c.idpath == imp_hls2.idpath), |
|
89 |
).filter(imp_hls2.distance == subquery2.c.distance |
|
90 |
).order_by( |
|
53 | 91 |
HighLevelService.servicename.asc() |
54 | 92 |
).all() |
55 | 93 |
|
56 |
return {'services': [service.servicename for service in services]} |
|
94 |
# Construction d'un dictionnaire associant à chaque évènement |
|
95 |
# le nom des SHN de plus haut niveau qu'il impacte. |
|
96 |
hls = {} |
|
97 |
for event_id in events_ids: |
|
98 |
hls[event_id] = [] |
|
99 |
for service in services: |
|
100 |
hls[service.idcorrevent].append(service.servicename) |
|
101 |
|
|
102 |
return hls |
|
57 | 103 |
|
58 |
def get_correvent_supitem(self, idcorrevent): |
|
59 |
""" |
|
60 |
Retourne le supitem ayant causé l'évènement |
|
61 |
corrélé dont l'identifiant est passé en paramètre. |
|
62 |
""" |
|
63 |
# On récupère l'item recherché dans la BDD |
|
64 |
supitem = DBSession.query(SupItem |
|
65 |
).join( |
|
66 |
(Event, Event.idsupitem == SupItem.idsupitem), |
|
67 |
(CorrEvent, CorrEvent.idcause == Event.idevent), |
|
68 |
).filter(CorrEvent.idcorrevent == idcorrevent).first() |
|
69 |
return supitem |
Also available in: Unified diff