diff --git a/brian_dashboard_manager/config.py b/brian_dashboard_manager/config.py index 2fccc79a566613f34d29bbd075e60257c7d9e9f9..499065511f86aac230180f1e65dff6aa97a87804 100644 --- a/brian_dashboard_manager/config.py +++ b/brian_dashboard_manager/config.py @@ -58,7 +58,8 @@ DEFAULT_ORGANIZATIONS = [ ], "excluded_folders": { "Aggregates": ["CAE1"], - "EUMETSAT Multicast": True + "EUMETSAT Multicast": True, + "NREN Access BETA": True } }, { @@ -88,7 +89,8 @@ DEFAULT_ORGANIZATIONS = [ "GWS PHY Upstream": True, "GWS Direct": True, "GWS Indirect": True, - "EUMETSAT Multicast": True + "EUMETSAT Multicast": True, + "NREN Access BETA": True } }, { @@ -107,7 +109,8 @@ DEFAULT_ORGANIZATIONS = [ "EUMETSAT" ], "excluded_folders": { - "EUMETSAT Multicast": True + "EUMETSAT Multicast": True, + "NREN Access BETA": True } }, { @@ -135,7 +138,8 @@ DEFAULT_ORGANIZATIONS = [ "IAS PUBLIC": True, "IAS UPSTREAM": True, "GWS PHY Upstream": True, - "EUMETSAT Multicast": True + "EUMETSAT Multicast": True, + "NREN Access BETA": True } } ] diff --git a/brian_dashboard_manager/grafana/provision.py b/brian_dashboard_manager/grafana/provision.py index 72fdfdb6ce360b120363a13c540b82b152b7b2ea..6e784d7a4f8f3f0b3c62ce13c21cb0021c86e997 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': { # needed for POL1-642 BETA + 'tag': ['customersbeta'], + 'folder_name': 'NREN Access BETA', + 'interfaces': [] + }, 'NREN': { 'tag': ['customers'], 'folder_name': 'NREN Access', @@ -188,8 +194,15 @@ def provision_folder(token_request, folder_name, dash, # dashboard should include error panels errors = dash.get('errors', False) + # needed for POL1-642 BETA + is_nren_beta = folder_name == 'NREN Access BETA' + is_nren = folder_name == 'NREN Access' if is_nren: + data = get_nren_interface_data_old(interfaces) + dash_data = get_nren_dashboard_data(data, ds_name, tag) + elif is_nren_beta: + # needed for POL1-642 BETA services = fetch_services(config['reporting_provider']) data = get_nren_interface_data( services, interfaces, excluded_dashboards) @@ -206,7 +219,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 +280,9 @@ 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': + # in is needed for POL1-642 BETA ('NREN Access BETA' folder) + # revert to == 'NREN Access' when beta is over + 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 +338,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'] @@ -534,7 +556,6 @@ def _delete_unknown_folders(config, token): # General is a base folder present in Grafana 'General', # other folders, created outside of the DASHBOARDS list - 'Service POC', 'GWS Indirect', 'GWS Direct', 'Aggregates', diff --git a/brian_dashboard_manager/templating/helpers.py b/brian_dashboard_manager/templating/helpers.py index adff696f552c4e25c1f1b6219f26e97310d2d933..dd71709b4c400d5d667b09843feb545c39131a45 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 @@ -101,10 +164,11 @@ def get_nren_interface_data(services, interfaces, excluded_dashboards): name = service.get('name') sid = service.get('sid') scid = service.get('scid') + service_type = service.get('service_type') measurement = 'scid_rates' - lag_service = service['service_type'] == 'ETHERNET' + lag_service = 'GA-' in sid and service_type == 'ETHERNET' if lag_service: if len(_interfaces) == 0: @@ -144,6 +208,7 @@ def get_nren_interface_data(services, interfaces, excluded_dashboards): description = interface['description'].strip() interface_name = interface['name'] host = interface['router'] + port_type = interface.get('port_type', 'unknown').lower() router = host.replace('.geant.net', '') location = host.split('.')[1].upper() @@ -160,6 +225,14 @@ def get_nren_interface_data(services, interfaces, excluded_dashboards): 'PHYSICAL': [] }) + if port_type == 'access': + dashboard['AGGREGATES'].append({ + 'interface': interface_name, + 'hostname': host, + 'alias': + f"{location} - {dashboard_name} ({interface_name})" + }) + if info['interface_type'] == 'AGGREGATE': # link aggregates are also shown # under the physical dropdown diff --git a/brian_dashboard_manager/templating/templates/homedashboard.json.j2 b/brian_dashboard_manager/templating/templates/homedashboard.json.j2 index 5ed832a9a1aef586f0f986c1b8929e6ed9171bf2..c55c5e7f44e8c219b0e23af47a2e45607bd87a31 100644 --- a/brian_dashboard_manager/templating/templates/homedashboard.json.j2 +++ b/brian_dashboard_manager/templating/templates/homedashboard.json.j2 @@ -49,6 +49,18 @@ "title": "NREN Access", "type": "dashboards" }, + {% if staff %} + { + "asDropdown": true, + "icon": "external link", + "tags": [ + "customersbeta" + ], + "targetBlank": true, + "title": "NREN Access BETA", + "type": "dashboards" + }, + {% endif %} { "asDropdown": true, "icon": "external link", diff --git a/changelog.md b/changelog.md index a5fb046f48fec5788a000db3bfc86bab4a31d193..f9571d90f7ed601977bd63294712578bc10d51ed 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,10 @@ All notable changes to this project will be documented in this file. +## [0.45] - 2022-12-7 +- POL1-642: Added new service-based NREN dashboard as a separate beta for staff +- POL1-645: Changed how interfaces/services are addeed to Aggregate panels + ## [0.44] - 2022-09-22 - POL1-533: Changed LAG services to be added under service list for NREN access dashboards 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'])