From dbd2732cf0d1efc1530b9b070e252d19c2b1d8f9 Mon Sep 17 00:00:00 2001 From: Maryam Mokhtarifar <maryam.mokhtarifar@geant.org> Date: Tue, 21 Jan 2025 16:56:39 +0100 Subject: [PATCH] Implement get_router_dashboard_data and _provision_vlan_dashboards --- brian_dashboard_manager/grafana/provision.py | 21 ++++++++++++-- brian_dashboard_manager/templating/helpers.py | 29 +++++++++++++++++-- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/brian_dashboard_manager/grafana/provision.py b/brian_dashboard_manager/grafana/provision.py index cacf06e..6cfafec 100644 --- a/brian_dashboard_manager/grafana/provision.py +++ b/brian_dashboard_manager/grafana/provision.py @@ -33,7 +33,7 @@ from brian_dashboard_manager.templating.helpers import \ get_nren_interface_data, get_dashboard_data, \ get_nren_dashboard_data, get_aggregate_interface_data, \ get_nren_interface_data_old, get_re_peer_dashboard_data, get_re_peer_interface_data, get_service_data, \ - get_service_dashboard_data, get_aggregate_service_data + get_service_dashboard_data, get_aggregate_service_data, get_router_dashboard_data, get_dashboard_data_dropdown from brian_dashboard_manager.templating.gws import generate_gws, generate_indirect from brian_dashboard_manager.templating.eumetsat import generate_eumetsat_multicast @@ -501,8 +501,25 @@ def _provision_vlan_dashboards(thread_executor: ThreadPoolExecutor, config, org_ folder_name = "VLAN Interfaces" # hardcoded, keep this in sync with the folder name specified in folders_to_keep logger.info(f'Provisioning {org_config["name"]}/{folder_name} dashboards') + excluded_folders = org_config.get('excluded_folders', {}) + if is_excluded_folder(excluded_folders, folder_name): + delete_folder(token, title=folder_name) + else: + folder = find_folder(token, title=folder_name) + if not folder: + raise Exception(f'Folder {folder_name} not found') + + folder_dashboards_by_name = list_folder_dashboards(token, folder['uid']) - yield + vlan_data = get_router_dashboard_data(interfaces) + provisioned = [] + for dashboard in get_dashboard_data_dropdown(vlan_data, ds_name, 'vlandash'): + rendered = render_simple_dashboard(**dashboard) + provisioned.append( + thread_executor.submit(create_dashboard, token, rendered, folder['id'], folder_dashboards_by_name) + ) + + yield from provisioned def _provision_gws_indirect(thread_executor: ThreadPoolExecutor, config, org_config, ds_name, token): diff --git a/brian_dashboard_manager/templating/helpers.py b/brian_dashboard_manager/templating/helpers.py index 6b2300c..8156dc5 100644 --- a/brian_dashboard_manager/templating/helpers.py +++ b/brian_dashboard_manager/templating/helpers.py @@ -11,6 +11,8 @@ from itertools import product from functools import partial, reduce from string import ascii_uppercase +from docutils.nodes import description + from brian_dashboard_manager.templating.render import create_panel, \ create_panel_target, create_dropdown_panel @@ -543,9 +545,31 @@ def get_router_dashboard_data(interfaces): :return: dictionary of routers (dashboards) and their interface data. """ - # TODO: implement + result = {} + + filtered_interfaces = [interface for interface in interfaces if interface.get('vlan_type') in {'TRUNK', 'VLAN'}] + + sorted_interfaces = sorted(filtered_interfaces, key=lambda x: x['name']) - return {} + for interface in sorted_interfaces: + description = interface['description'].strip() + interface_name = interface['name'] + host = interface['router'] + + router = host.replace('.geant.net', '') + panel_title = f'{router} - {{}} - {interface_name} - {description}' + + dashboard_name = interface['router'] + + dashboard = result.get(dashboard_name, []) + dashboard.append({ + 'title': panel_title, + 'interface': interface_name, # TODO NAME or interface data? + 'hostname': host + }) + result[dashboard_name] = dashboard + + return result def get_interface_data(interfaces): @@ -1130,7 +1154,6 @@ def get_dashboard_data_dropdown( def get_nren_dashboard_data(data, datasource, tag): - func = partial( get_dashboard_with_agg_data_single, datasource=datasource, -- GitLab