From e920fd228fc8de3762db624297f926ac794ed4f0 Mon Sep 17 00:00:00 2001
From: Bjarke Madsen <bjarke.madsen@geant.org>
Date: Wed, 10 Mar 2021 16:14:33 +0100
Subject: [PATCH] provision aggregate dashboards

---
 brian_dashboard_manager/grafana/provision.py | 57 ++++++++++++++++++--
 1 file changed, 53 insertions(+), 4 deletions(-)

diff --git a/brian_dashboard_manager/grafana/provision.py b/brian_dashboard_manager/grafana/provision.py
index 8acabc7..57b85d0 100644
--- a/brian_dashboard_manager/grafana/provision.py
+++ b/brian_dashboard_manager/grafana/provision.py
@@ -18,11 +18,12 @@ from brian_dashboard_manager.inventory_provider.interfaces import \
 from brian_dashboard_manager.templating.nren_access import generate_nrens
 
 from brian_dashboard_manager.templating.helpers import is_re_customer, \
-    is_cls, is_ias_customer, is_ias_private, is_ias_public, is_ias_upstream, \
-    is_lag_backbone, is_nren, is_phy_upstream, is_re_peer, is_gcs, \
-    is_geantopen, is_l2circuit, is_lhcone_peer, is_lhcone_customer, is_mdvpn,\
+    is_cls_peer, is_cls, is_ias_customer, is_ias_private, is_ias_public, \
+    is_ias_upstream, is_ias_peer, is_lag_backbone, is_nren, is_phy_upstream, \
+    is_re_peer, is_gcs, is_geantopen, is_l2circuit, is_lhcone_peer, \
+    is_lhcone_customer, is_lhcone, is_mdvpn, get_aggregate_dashboard_data, \
     get_interface_data, parse_backbone_name, parse_phy_upstream_name, \
-    get_dashboard_data
+    get_dashboard_data, get_aggregate_interface_data
 
 from brian_dashboard_manager.templating.render import render_dashboard
 
@@ -61,6 +62,21 @@ def provision_folder(token_request, folder_name,
                             rendered, folder['id'])
 
 
+def provision_aggregate(token_request, agg_type, aggregate_folder,
+                        dash, excluded_interfaces, datasource_name):
+    predicate = dash['predicate']
+    tag = dash['tag']
+
+    relevant_interfaces = filter(predicate, excluded_interfaces)
+    data = get_aggregate_interface_data(relevant_interfaces, agg_type)
+
+    dashboard = get_aggregate_dashboard_data(
+        f'Aggregate - {agg_type}', data, datasource_name, tag)
+
+    rendered = render_dashboard(dashboard)
+    create_dashboard(token_request, rendered, aggregate_folder['id'])
+
+
 def provision(config):
 
     request = AdminRequest(**config)
@@ -200,6 +216,39 @@ def provision(config):
                                 folder_name, dash,
                                 excluded_interfaces, datasource_name)
 
+        aggregate_dashboards = {
+            'CLS PEERS': {
+                'predicate': is_cls_peer,
+                'tag': 'cls_peers',
+            },
+            'IAS PEERS': {
+                'predicate': is_ias_peer,
+                'tag': 'ias_peers',
+            },
+            'GWS UPSTREAMS': {
+                'predicate': is_ias_upstream,
+                'tag': 'gws_upstreams',
+            },
+            'LHCONE': {
+                'predicate': is_lhcone,
+                'tag': 'lhcone',
+            },
+            # 'CAE1': {
+            #     'predicate': is_cae1,
+            #     'tag': 'cae',
+            # }
+        }
+
+        with ProcessPoolExecutor(max_workers=4) as executor:
+            aggregate_folder = find_folder(token_request, 'Aggregates')
+            for agg_type, dash in aggregate_dashboards.items():
+                logger.info(
+                    f'Provisioning {org["name"]}' +
+                    f'/Aggregate {agg_type} dashboards')
+                executor.submit(provision_aggregate, token_request, agg_type,
+                                aggregate_folder, dash,
+                                excluded_interfaces, datasource_name)
+
         # NREN Access dashboards
         # uses a different template than the above.
         logger.info('Provisioning NREN Access dashboards')
-- 
GitLab