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