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

Add GWS indirect dashboards

parent a4a8b43c
No related branches found
No related tags found
No related merge requests found
...@@ -8,6 +8,7 @@ import time ...@@ -8,6 +8,7 @@ import time
import json import json
import datetime import datetime
from functools import reduce from functools import reduce
from concurrent.futures import Future
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
from brian_dashboard_manager.config import DEFAULT_ORGANIZATIONS, STATE_PATH from brian_dashboard_manager.config import DEFAULT_ORGANIZATIONS, STATE_PATH
from brian_dashboard_manager.grafana.utils.request import \ from brian_dashboard_manager.grafana.utils.request import \
...@@ -23,7 +24,7 @@ from brian_dashboard_manager.grafana.datasource import \ ...@@ -23,7 +24,7 @@ from brian_dashboard_manager.grafana.datasource import \
from brian_dashboard_manager.grafana.folder import find_folder, \ from brian_dashboard_manager.grafana.folder import find_folder, \
delete_folder delete_folder
from brian_dashboard_manager.inventory_provider.interfaces import \ from brian_dashboard_manager.inventory_provider.interfaces import \
get_gws_direct, get_interfaces get_gws_direct, get_gws_indirect, get_interfaces
from brian_dashboard_manager.templating.nren_access import generate_nrens from brian_dashboard_manager.templating.nren_access import generate_nrens
from brian_dashboard_manager.templating.helpers import is_re_customer, \ from brian_dashboard_manager.templating.helpers import is_re_customer, \
...@@ -34,7 +35,8 @@ from brian_dashboard_manager.templating.helpers import is_re_customer, \ ...@@ -34,7 +35,8 @@ from brian_dashboard_manager.templating.helpers import is_re_customer, \
get_interface_data, parse_backbone_name, parse_phy_upstream_name, \ get_interface_data, parse_backbone_name, parse_phy_upstream_name, \
get_dashboard_data, get_aggregate_interface_data get_dashboard_data, get_aggregate_interface_data
from brian_dashboard_manager.templating.gws import generate_gws from brian_dashboard_manager.templating.gws import generate_gws, \
generate_indirect
from brian_dashboard_manager.templating.render import render_dashboard from brian_dashboard_manager.templating.render import render_dashboard
...@@ -119,6 +121,9 @@ def provision_maybe(config): ...@@ -119,6 +121,9 @@ def provision_maybe(config):
now = datetime.datetime.now() now = datetime.datetime.now()
write_timestamp(now.timestamp(), val) write_timestamp(now.timestamp(), val)
provision(config) provision(config)
except Exception as e:
logger.exception('Uncaught Exception:')
raise e
finally: finally:
now = datetime.datetime.now() now = datetime.datetime.now()
write_timestamp(now.timestamp(), False) write_timestamp(now.timestamp(), False)
...@@ -182,7 +187,10 @@ def provision(config): ...@@ -182,7 +187,10 @@ def provision(config):
def excluded(interface): def excluded(interface):
desc = interface.get('description', '').lower() desc = interface.get('description', '').lower()
return not any(nren.lower() in desc for nren in excluded_nrens) lab = 'lab.office' in interface.get('router', '').lower()
excluded_desc = any(
nren.lower() in desc for nren in excluded_nrens)
return not (excluded_desc or lab)
excluded_interfaces = list(filter(excluded, interfaces)) excluded_interfaces = list(filter(excluded, interfaces))
...@@ -265,6 +273,14 @@ def provision(config): ...@@ -265,6 +273,14 @@ def provision(config):
dash_list = find_dashboard(token_request) or [] dash_list = find_dashboard(token_request) or []
dash_list = reduce(get_uid, dash_list, {}) dash_list = reduce(get_uid, dash_list, {})
def update_dash_list(dashboards):
for dashboard in dashboards:
if isinstance(dashboard, Future):
dashboard = dashboard.result()
if dashboard is None:
continue
dash_list[dashboard.get('uid')] = True
with ProcessPoolExecutor(max_workers=4) as executor: with ProcessPoolExecutor(max_workers=4) as executor:
provisioned = [] provisioned = []
for folder_name, dash in dashboards.items(): for folder_name, dash in dashboards.items():
...@@ -289,10 +305,35 @@ def provision(config): ...@@ -289,10 +305,35 @@ def provision(config):
folder = result.result() folder = result.result()
if folder is None: if folder is None:
continue continue
for dashboard in folder: update_dash_list(folder)
if dashboard is None:
# fetch GWS direct data and provision related dashboards
logger.info('Provisioning GWS Indirect dashboards')
folder_name = 'GWS Indirect'
exclude_indirect = excluded_folders.get(folder_name, [])
exclude_indirect = list(map(lambda f: f.lower(), exclude_indirect))
if isinstance(exclude_indirect, bool) and exclude_indirect:
# don't provision GWS Direct folder
delete_folder(token_request, folder_name)
else:
folder = find_folder(token_request, folder_name)
with ProcessPoolExecutor(max_workers=4) as executor:
gws_indirect_data = get_gws_indirect(
config['inventory_provider'])
provisioned = []
dashes = generate_indirect(gws_indirect_data, datasource_name)
for dashboard in dashes:
rendered = render_dashboard(dashboard)
if rendered.get('title').lower() in exclude_indirect:
executor.submit(delete_dashboard, token_request,
rendered, folder['id'])
continue continue
dash_list[dashboard.get('uid')] = True provisioned.append(executor.submit(create_dashboard,
token_request,
rendered, folder['id']))
update_dash_list(provisioned)
# fetch GWS direct data and provision related dashboards # fetch GWS direct data and provision related dashboards
logger.info('Provisioning GWS Direct dashboards') logger.info('Provisioning GWS Direct dashboards')
...@@ -318,11 +359,7 @@ def provision(config): ...@@ -318,11 +359,7 @@ def provision(config):
token_request, token_request,
rendered, folder['id'])) rendered, folder['id']))
for result in provisioned: update_dash_list(provisioned)
dashboard = result.result()
if dashboard is None:
continue
dash_list[dashboard.get('uid')] = True
aggregate_dashboards = { aggregate_dashboards = {
'CLS PEERS': { 'CLS PEERS': {
...@@ -370,11 +407,7 @@ def provision(config): ...@@ -370,11 +407,7 @@ def provision(config):
excluded_interfaces, datasource_name) excluded_interfaces, datasource_name)
provisioned.append(res) provisioned.append(res)
for result in provisioned: update_dash_list(provisioned)
dashboard = result.result()
if dashboard is None:
continue
dash_list[dashboard.get('uid')] = True
# NREN Access dashboards # NREN Access dashboards
# uses a different template than the above. # uses a different template than the above.
......
...@@ -2,7 +2,7 @@ from typing import DefaultDict ...@@ -2,7 +2,7 @@ from typing import DefaultDict
from brian_dashboard_manager.templating.helpers import get_dashboard_data from brian_dashboard_manager.templating.helpers import get_dashboard_data
def get_interface_data(interfaces): def get_panel_data(interfaces):
result = DefaultDict(list) result = DefaultDict(list)
for interface in interfaces: for interface in interfaces:
...@@ -39,8 +39,36 @@ def get_interface_data(interfaces): ...@@ -39,8 +39,36 @@ def get_interface_data(interfaces):
return result return result
def get_gws_indirect_panel_data(interfaces):
result = DefaultDict(list)
for interface in interfaces:
hostname = interface.get('hostname').replace('.geant.net', '')
interface_name = interface.get('interface')
service_name = interface.get('name')
customer = interface.get('customer')
measurement = 'dscp32_rates'
panel_title = f'{hostname} - {{}} - {interface_name} - #{service_name}'
result[f'GWS Indirect - {customer}'].append({
'measurement': measurement,
'title': panel_title,
'interface': interface_name,
'hostname': interface.get('hostname'),
'has_v6': False
})
return result
def generate_gws(gws_data, datasource): def generate_gws(gws_data, datasource):
panel_data = get_interface_data(gws_data) panel_data = get_panel_data(gws_data)
for dashboard in get_dashboard_data(panel_data, datasource, 'GWS_DIRECT'): for dash in get_dashboard_data(panel_data, datasource, 'GWS_DIRECT'):
yield dashboard yield dash
def generate_indirect(gws_data, datasource):
panel_data = get_gws_indirect_panel_data(gws_data)
for dash in get_dashboard_data(panel_data, datasource, 'GWS_INDIRECT'):
yield dash
import responses
import json
from brian_dashboard_manager.templating.gws import generate_indirect
from brian_dashboard_manager.inventory_provider.interfaces import \
get_gws_indirect
TEST_DATA = [
{
"id": 712361,
"name": "FCCN-AP3-IAS",
"customer": "FCCN",
"speed": 107374182400,
"pop": "PORTO",
"hostname": "rt1.por.pt.geant.net",
"interface": "ae10.333",
"type": "GWS - INDIRECT",
"status": "operational"
},
{
"id": 661222,
"name": "FCCN-AP2-IAS",
"customer": "FCCN",
"speed": 42949672960,
"pop": "LISBON 2",
"hostname": "mx1.lis.pt.geant.net",
"interface": "ae10.333",
"type": "GWS - INDIRECT",
"status": "operational"
},
{
"id": 661500,
"name": "IUCC-AP1-IAS",
"customer": "IUCC",
"speed": 32212254720,
"pop": "LONDON",
"hostname": "mx1.lon.uk.geant.net",
"interface": "ae21.333",
"type": "GWS - INDIRECT",
"status": "operational"
},
{
"id": 663112,
"name": "ROEDUNET_AP1_IAS",
"customer": "ROEDUNET",
"speed": 42949672960,
"pop": "BUCHAREST",
"hostname": "mx1.buc.ro.geant.net",
"interface": "ae11.333",
"type": "GWS - INDIRECT",
"status": "operational"
},
{
"id": 663228,
"name": "IUCC-AP2-IAS",
"customer": "IUCC",
"speed": 32212254720,
"pop": "FRANKFURT",
"hostname": "mx1.fra.de.geant.net",
"interface": "ae21.333",
"type": "GWS - INDIRECT",
"status": "operational"
},
{
"id": 661641,
"name": "FCCN-AP1-IAS",
"customer": "FCCN",
"speed": 42949672960,
"pop": "LISBON",
"hostname": "mx2.lis.pt.geant.net",
"interface": "ae10.333",
"type": "GWS - INDIRECT",
"status": "operational"
}
]
@responses.activate
def test_gws(data_config, mocker, client):
def get_callback(request):
return 200, {}, json.dumps(TEST_DATA)
responses.add_callback(
method=responses.GET,
url=f"{data_config['inventory_provider']}/poller/gws/indirect",
callback=get_callback)
gws_data = get_gws_indirect(data_config['inventory_provider'])
dashboards = list(generate_indirect(gws_data, 'testdatasource'))
assert len(dashboards) == 3
assert dashboards[0]['title'] == 'GWS Indirect - FCCN'
assert len(dashboards[0]['panels']) == 3
assert dashboards[1]['title'] == 'GWS Indirect - IUCC'
assert len(dashboards[1]['panels']) == 2
assert dashboards[2]['title'] == 'GWS Indirect - ROEDUNET'
assert len(dashboards[2]['panels']) == 1
...@@ -464,6 +464,10 @@ def test_provision(data_config, mocker, client): ...@@ -464,6 +464,10 @@ def test_provision(data_config, mocker, client):
'brian_dashboard_manager.grafana.provision.get_gws_direct') 'brian_dashboard_manager.grafana.provision.get_gws_direct')
_mocked_gws.return_value = [] _mocked_gws.return_value = []
_mocked_gws_indirect = mocker.patch(
'brian_dashboard_manager.grafana.provision.get_gws_indirect')
_mocked_gws_indirect.return_value = []
UID = 1 UID = 1
ID = 1 ID = 1
VERSION = 1 VERSION = 1
......
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