diff --git a/brian_dashboard_manager/grafana/provision.py b/brian_dashboard_manager/grafana/provision.py index ad34477c2868c5898436bf5eba52f39ba9949d46..93721c6ee690ef53f3d9f8b8939405653f203bde 100644 --- a/brian_dashboard_manager/grafana/provision.py +++ b/brian_dashboard_manager/grafana/provision.py @@ -32,7 +32,8 @@ from brian_dashboard_manager.inventory_provider.interfaces import \ from brian_dashboard_manager.templating.helpers import \ get_aggregate_dashboard_data, get_interface_data, \ get_nren_interface_data, get_dashboard_data, \ - get_nren_dashboard_data, get_aggregate_interface_data + get_nren_dashboard_data, get_aggregate_interface_data, \ + get_nren_interface_data_old from brian_dashboard_manager.templating.gws import generate_gws, \ generate_indirect @@ -45,6 +46,11 @@ logger = logging.getLogger(__name__) MAX_WORKERS = 4 DASHBOARDS = { + 'NRENBETA': { + 'tag': ['customersbeta'], + 'folder_name': 'NREN Access BETA', + 'interfaces': [] + }, 'NREN': { 'tag': ['customers'], 'folder_name': 'NREN Access', @@ -189,7 +195,11 @@ def provision_folder(token_request, folder_name, dash, errors = dash.get('errors', False) is_nren = folder_name == 'NREN Access' + is_nren_beta = folder_name == 'NREN Access BETA' if is_nren: + data = get_nren_interface_data_old(interfaces) + dash_data = get_nren_dashboard_data(data, ds_name, tag) + elif is_nren_beta: services = fetch_services(config['reporting_provider']) data = get_nren_interface_data( services, interfaces, excluded_dashboards) @@ -206,7 +216,8 @@ def provision_folder(token_request, folder_name, dash, with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: for dashboard in dash_data: - rendered = render_dashboard(dashboard, nren=is_nren) + rendered = render_dashboard( + dashboard, nren=is_nren or is_nren_beta) if rendered.get('title').lower() in excluded_dashboards: executor.submit(delete_dashboard, token_request, rendered, folder['id']) @@ -266,7 +277,7 @@ def is_excluded_folder(org_config, folder_name): def excluded_folder_dashboards(org_config, folder_name): excluded_folders = org_config.get('excluded_folders', {}) excluded = excluded_folders.get(folder_name, []) - if folder_name == 'NREN Access': + if 'NREN Access' in folder_name: excluded_nrens = org_config.get('excluded_nrens', []) excluded = list(set(excluded).union(set(excluded_nrens))) return excluded if isinstance(excluded, list) else [] @@ -322,6 +333,12 @@ def _provision_interfaces(config, org_config, ds_name, token): ifaces = DASHBOARDS[dash_name]['interfaces'] ifaces.append(iface) + # TODO: remove all references to NRENBETA + # when NREN service BETA is over (homedashboard/helpers) + if dash_name == 'NREN': + ifaces = DASHBOARDS['NRENBETA']['interfaces'] + ifaces.append(iface) + # add to matched aggregate dashboard if dash_name in AGG_DASHBOARDS: ifaces = AGG_DASHBOARDS[dash_name]['interfaces'] diff --git a/brian_dashboard_manager/templating/helpers.py b/brian_dashboard_manager/templating/helpers.py index adff696f552c4e25c1f1b6219f26e97310d2d933..d026cb62c794f5e0ae0d65fbe9173a0be34fee91 100644 --- a/brian_dashboard_manager/templating/helpers.py +++ b/brian_dashboard_manager/templating/helpers.py @@ -67,6 +67,69 @@ def letter_generator(): yield result +def get_nren_interface_data_old(interfaces): + """ + Helper for grouping interfaces into groups of NRENs + Extracts information from interfaces to be used in panels. + NREN dashboards have aggregate panels at the top and + dropdowns for services / physical interfaces. + """ + result = {} + + for interface in interfaces: + + description = interface['description'].strip() + interface_name = interface['name'] + host = interface['router'] + + router = host.replace('.geant.net', '') + location = host.split('.')[1].upper() + panel_title = f"{router} - {{}} - {interface_name} - {description}" + + dashboards_info = interface['dashboards_info'] + + for info in dashboards_info: + dashboard_name = info['name'] + + dashboard = result.get(dashboard_name, { + 'AGGREGATES': [], + 'SERVICES': [], + 'PHYSICAL': [] + }) + + 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({ + 'title': panel_title, + '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, + 'hostname': host, + 'interface': interface_name + }) + + result[dashboard_name] = dashboard + return result + + def get_nren_interface_data(services, interfaces, excluded_dashboards): """ Helper for grouping interfaces into groups of NRENs diff --git a/brian_dashboard_manager/templating/templates/homedashboard.json.j2 b/brian_dashboard_manager/templating/templates/homedashboard.json.j2 index 5ed832a9a1aef586f0f986c1b8929e6ed9171bf2..a422edfb1ed115753a4fbe0010d2f00fee68a6e5 100644 --- a/brian_dashboard_manager/templating/templates/homedashboard.json.j2 +++ b/brian_dashboard_manager/templating/templates/homedashboard.json.j2 @@ -49,6 +49,16 @@ "title": "NREN Access", "type": "dashboards" }, + { + "asDropdown": true, + "icon": "external link", + "tags": [ + "customersbeta" + ], + "targetBlank": true, + "title": "NREN Access BETA", + "type": "dashboards" + }, { "asDropdown": true, "icon": "external link", diff --git a/test/test_update.py b/test/test_update.py index cd09f5771803c7845d5f6a4f64ed9ef906656af3..f3f6b6f1b8d272a801f51a1c62e02837946bd70e 100644 --- a/test/test_update.py +++ b/test/test_update.py @@ -659,19 +659,42 @@ def test_provision_folder(data_config, mocker): None, 'NREN Access', dashboards['NREN'], data_config, 'testdatasource', excluded_dashboards) - assert len(nren_result) == 6 - assert nren_result[0]['title'] == 'ASNET-AM' - assert nren_result[1]['title'] == 'LITNET' - assert nren_result[2]['title'] == 'CESNET' + assert len(nren_result) == 3 + assert nren_result[0]['title'] == 'GEANT' + assert nren_result[1]['title'] == 'KIAE' + assert nren_result[2]['title'] == 'SWITCH' - excluded_dashboards = ['ASNET-AM', 'GEANT'] + excluded_dashboards = ['KIAE', 'GEANT'] nren_excluded = provision_folder( None, 'NREN Access', dashboards['NREN'], data_config, 'testdatasource', excluded_dashboards) - assert len(nren_excluded) == 4 - assert nren_excluded[0]['title'] == 'LITNET' - assert nren_excluded[1]['title'] == 'CESNET' + assert len(nren_excluded) == 1 + assert nren_excluded[0]['title'] == 'SWITCH' + + excluded_dashboards = [] + nren_result_beta = provision_folder( + None, 'NREN Access BETA', dashboards['NREN'], + data_config, 'testdatasource', excluded_dashboards) + + assert len(nren_result_beta) == 6 + assert nren_result_beta[0]['title'] == 'ASNET-AM' + assert nren_result_beta[1]['title'] == 'LITNET' + assert nren_result_beta[2]['title'] == 'CESNET' + assert nren_result_beta[3]['title'] == 'GEANT' + assert nren_result_beta[4]['title'] == 'KIAE' + assert nren_result_beta[5]['title'] == 'SWITCH' + + excluded_dashboards = ['ASNET-AM', 'GEANT'] + nren_excluded_beta = provision_folder( + None, 'NREN Access BETA', dashboards['NREN'], + data_config, 'testdatasource', excluded_dashboards) + + assert len(nren_excluded_beta) == 4 + assert nren_excluded_beta[0]['title'] == 'LITNET' + assert nren_excluded_beta[1]['title'] == 'CESNET' + assert nren_excluded_beta[2]['title'] == 'KIAE' + assert nren_excluded_beta[3]['title'] == 'SWITCH' cust_result = provision_folder(None, 'testfolder', dashboards['RE_CUST'], data_config, 'testdatasource', ['GEANT'])