diff --git a/brian_dashboard_manager/grafana/provision.py b/brian_dashboard_manager/grafana/provision.py index ccf7f928eb88670a511906f64c9d64d05ddfd571..a51b639d2e939972a1a0a971078363401eaf3daa 100644 --- a/brian_dashboard_manager/grafana/provision.py +++ b/brian_dashboard_manager/grafana/provision.py @@ -171,7 +171,7 @@ AGG_DASHBOARDS = { def provision_folder(token_request, folder_name, dash, - ds_name, excluded_dashboards): + config, ds_name, excluded_dashboards): """ Function to provision dashboards within a folder. """ @@ -193,7 +193,8 @@ def provision_folder(token_request, folder_name, dash, is_nren = folder_name == 'NREN Access' if is_nren: - data = get_nren_interface_data(interfaces) + services = fetch_services(config['reporting_provider']) + data = get_nren_interface_data(services, interfaces) dash_data = get_nren_dashboard_data(data, ds_name, tag) else: data = get_interface_data(interfaces) @@ -348,7 +349,7 @@ def _provision_interfaces(config, org_config, ds_name, token): f'Provisioning {org_config["name"]}/{folder_name} dashboards') res = executor.submit( provision_folder, token, - folder_name, folder, ds_name, + folder_name, folder, config, ds_name, excluded_folder_dashboards(org_config, folder_name)) provisioned.append(res) @@ -630,8 +631,8 @@ def provision(config): ds_name = datasource.get('name', 'PollerInfluxDB') managed_dashboards = itertools.chain( - _provision_service_dashboards( - config, org_config, ds_name, token_request), + # _provision_service_dashboards( + # config, org_config, ds_name, token_request), _provision_interfaces( config, org_config, ds_name, token_request), _provision_gws_indirect( diff --git a/brian_dashboard_manager/templating/helpers.py b/brian_dashboard_manager/templating/helpers.py index fceb3e0d5bc49bcf8bcdcd501b3ed042fa8e1684..ca9323c1145c57def56c2f6d47625da56c2f30f1 100644 --- a/brian_dashboard_manager/templating/helpers.py +++ b/brian_dashboard_manager/templating/helpers.py @@ -2,6 +2,7 @@ Helper functions used to group interfaces together and generate the necessary data to generate the dashboards from templates. """ +from collections import defaultdict import logging import json from itertools import product @@ -63,7 +64,7 @@ def letter_generator(): yield result -def get_nren_interface_data(interfaces): +def get_nren_interface_data(services, interfaces): """ Helper for grouping interfaces into groups of NRENs Extracts information from interfaces to be used in panels. @@ -72,6 +73,66 @@ def get_nren_interface_data(interfaces): """ result = {} + customers = defaultdict(list) + + for service in services: + _customers = service.get('customers') + for cust in _customers: + customers[cust].append(service) + + for customer, services in customers.items(): + if not any([s['service_type'] == 'GEANT IP' for s in services]): + # NREN access customers must have at least one GEANT IP service + continue + + dashboard = result.setdefault(customer, { + 'AGGREGATES': [], + 'SERVICES': [], + 'PHYSICAL': [] + }) + + for service in services: + _interfaces = service.get('endpoints') + name = service.get('name') + sid = service.get('sid') + scid = service.get('scid') + + measurement = 'scid_rates' + + lag_service = service['service_type'] == 'ETHERNET' + + if lag_service: + if len(_interfaces) > 1: + logger.info( + f'{sid} {name} aggregate service has > 1 interface') + continue + + if 'interface' in _interfaces[0]: + if_name = _interfaces[0].get('interface') + router = _interfaces[0].get('hostname') + else: + if_name = _interfaces[0].get('port') + router = _interfaces[0].get('equipment') + router = router.replace('.geant.net', '') + location = router.split('.')[1].upper() + title = f'{location} - {customer} ({if_name}) | {name}' + dashboard['AGGREGATES'].append({ + 'measurement': measurement, + 'alias': title, + 'scid': scid + }) + + else: + if 'MDVPN' in service['service_type']: + # MDVPN type services don't have data in BRIAN + continue + title = f'{name} ({sid})' + dashboard['SERVICES'].append({ + 'measurement': measurement, + 'title': title, + 'scid': scid + }) + for interface in interfaces: description = interface['description'].strip() @@ -94,13 +155,6 @@ def get_nren_interface_data(interfaces): }) if info['interface_type'] == 'AGGREGATE': - dashboard['AGGREGATES'].append({ - 'interface': interface_name, - 'hostname': host, - 'alias': - f"{location} - {dashboard_name} ({interface_name})" - }) - # link aggregates are also shown # under the physical dropdown dashboard['PHYSICAL'].append({ @@ -108,13 +162,6 @@ def get_nren_interface_data(interfaces): 'hostname': host, 'interface': interface_name }) - - elif info['interface_type'] == 'LOGICAL': - dashboard['SERVICES'].append({ - 'title': panel_title, - 'hostname': host, - 'interface': interface_name - }) elif info['interface_type'] == 'PHYSICAL': dashboard['PHYSICAL'].append({ 'title': panel_title, diff --git a/test/test_update.py b/test/test_update.py index f8be68b42ac38f7073aca9761db92c3c7b9a950c..d529f480e16a9bfb51f4b9c34bc3dc11197f7d32 100644 --- a/test/test_update.py +++ b/test/test_update.py @@ -637,7 +637,7 @@ def test_provision_folder(data_config, mocker): excluded_dashboards = [] nren_result = provision_folder(None, 'testfolder', dashboards['NREN'], - 'testdatasource', excluded_dashboards) + [], 'testdatasource', excluded_dashboards) assert len(nren_result) == 3 assert nren_result[0]['title'] == 'GEANT' @@ -646,14 +646,14 @@ def test_provision_folder(data_config, mocker): excluded_dashboards = ['SWITCH'] nren_excluded = provision_folder(None, 'testfolder', dashboards['NREN'], - 'testdatasource', excluded_dashboards) + [], 'testdatasource', excluded_dashboards) assert len(nren_excluded) == 2 assert nren_excluded[0]['title'] == 'GEANT' assert nren_excluded[1]['title'] == 'KIAE' cust_result = provision_folder(None, 'testfolder', dashboards['RE_CUST'], - 'testdatasource', ['GEANT']) + [], 'testdatasource', ['GEANT']) assert len(cust_result) == 2 assert cust_result[0]['title'] == 'KIAE' assert cust_result[1]['title'] == 'SWITCH'