Skip to content
Snippets Groups Projects
Commit b18e7312 authored by Bjarke Madsen's avatar Bjarke Madsen
Browse files

Fix a bug with NREN Access panels being under the wrong dropdowns.

Add multiprocessing for generating dashboards to reduce provisioning time
parent 4d3b047b
No related branches found
No related tags found
No related merge requests found
...@@ -3,14 +3,17 @@ Helper functions used to group interfaces together and generate the ...@@ -3,14 +3,17 @@ Helper functions used to group interfaces together and generate the
necessary data to generate the dashboards from templates. necessary data to generate the dashboards from templates.
""" """
from collections import defaultdict from collections import defaultdict
from concurrent.futures import ProcessPoolExecutor
import logging import logging
import json import json
from itertools import product from itertools import product
from functools import reduce from functools import partial, reduce
from string import ascii_uppercase from string import ascii_uppercase
from brian_dashboard_manager.templating.render import create_panel, \ from brian_dashboard_manager.templating.render import create_panel, \
create_panel_target, create_dropdown_panel create_panel_target, create_dropdown_panel
NUM_PROCESSES = 4
PANEL_HEIGHT = 12 PANEL_HEIGHT = 12
PANEL_WIDTH = 24 PANEL_WIDTH = 24
...@@ -365,58 +368,72 @@ def default_interface_panel_generator(gridPos): ...@@ -365,58 +368,72 @@ def default_interface_panel_generator(gridPos):
return get_panel_definitions return get_panel_definitions
def get_nren_dashboard_data_single(data, datasource, tag):
nren, dash = data
id_gen = num_generator()
gridPos = gridPos_generator(id_gen, start=1)
if len(dash['AGGREGATES']) > 0:
agg_panels = create_aggregate_panel(
f'Aggregate - {nren}',
gridPos_generator(id_gen, agg=True),
dash['AGGREGATES'], datasource)
else:
# if there's no aggregate panel(s), start other stuff at y=0.
gridPos = gridPos_generator(id_gen, start=0)
agg_panels = []
panel_gen = default_interface_panel_generator(gridPos)
services_dropdown = create_dropdown_panel('Services', **next(gridPos))
service_panels = panel_gen(dash['SERVICES'], datasource)
iface_dropdown = create_dropdown_panel('Interfaces', **next(gridPos))
phys_panels = panel_gen(dash['PHYSICAL'], datasource, True)
result = {
'nren_name': nren,
'datasource': datasource,
'aggregate_panels': agg_panels,
'dropdown_groups': [
{
'dropdown': services_dropdown,
'panels': service_panels,
},
{
'dropdown': iface_dropdown,
'panels': phys_panels,
}
]
}
if isinstance(tag, list):
result['tags'] = tag
else:
result['tag'] = tag
return result
def get_nren_dashboard_data(data, datasource, tag): def get_nren_dashboard_data(data, datasource, tag):
""" """
Generates all panels used in a NREN dashboard, Generates all panels used in a NREN dashboard,
including dropdowns and aggregate panels. including dropdowns and aggregate panels.
""" """
for nren, dash in data.items(): with ProcessPoolExecutor(max_workers=NUM_PROCESSES) as executor:
id_gen = num_generator() for dash in executor.map(
partial(
gridPos = gridPos_generator(id_gen, start=1) get_nren_dashboard_data_single,
datasource=datasource,
panel_gen = default_interface_panel_generator(gridPos) tag=tag),
data.items()
if len(dash['AGGREGATES']) > 0: ):
agg_panels = create_aggregate_panel(
f'Aggregate - {nren}',
gridPos_generator(id_gen, agg=True),
dash['AGGREGATES'], datasource)
else:
# if there's no aggregate panel(s), start other stuff at y=0.
gridPos = gridPos_generator(id_gen, start=0)
agg_panels = []
services_dropdown = create_dropdown_panel('Services', **next(gridPos))
service_panels = panel_gen(dash['SERVICES'], datasource)
iface_dropdown = create_dropdown_panel('Interfaces', **next(gridPos))
phys_panels = panel_gen(dash['PHYSICAL'], datasource, True)
result = {
'nren_name': nren,
'datasource': datasource,
'aggregate_panels': agg_panels,
'dropdown_groups': [
{
'dropdown': services_dropdown,
'panels': service_panels,
},
{
'dropdown': iface_dropdown,
'panels': phys_panels,
}
]
}
if isinstance(tag, list):
result['tags'] = tag
else:
result['tag'] = tag
yield result yield dash
def get_dashboard_data( def get_dashboard_data_single(
data, datasource, tag, data, datasource, tag,
panel_generator=default_interface_panel_generator, panel_generator=default_interface_panel_generator,
errors=False): errors=False):
...@@ -427,19 +444,41 @@ def get_dashboard_data( ...@@ -427,19 +444,41 @@ def get_dashboard_data(
gridPos = gridPos_generator(id_gen) gridPos = gridPos_generator(id_gen)
panel_gen = panel_generator(gridPos) panel_gen = panel_generator(gridPos)
for dashboard_name, panels in data.items(): name, panels = data
result = { result = {
'title': dashboard_name, 'title': name,
'datasource': datasource, 'datasource': datasource,
'panels': list(panel_gen(panels, datasource, errors)), 'panels': list(panel_gen(panels, datasource, errors)),
} }
if isinstance(tag, list): if isinstance(tag, list):
result['tags'] = tag result['tags'] = tag
else: else:
result['tag'] = tag result['tag'] = tag
yield result return result
def get_dashboard_data(
data, datasource, tag,
panel_generator=default_interface_panel_generator,
errors=False):
"""
Generates all panels used in a normal dashboard without aggregate panels
"""
with ProcessPoolExecutor(max_workers=NUM_PROCESSES) as executor:
for dash in executor.map(
partial(
get_dashboard_data_single,
datasource=datasource,
tag=tag,
panel_generator=panel_generator,
errors=errors),
data.items()
):
yield dash
def create_aggregate_panel(title, gridpos, targets, datasource): def create_aggregate_panel(title, gridpos, targets, datasource):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment