From 17d065f0194452a86efc1512fe22f738cfda73d2 Mon Sep 17 00:00:00 2001
From: Bjarke Madsen <bjarke.madsen@geant.org>
Date: Mon, 25 Jan 2021 17:58:43 +0100
Subject: [PATCH] update to provision datasources and dashboards

---
 brian_dashboard_manager/grafana/provision.py | 44 +++++++++-----------
 1 file changed, 20 insertions(+), 24 deletions(-)

diff --git a/brian_dashboard_manager/grafana/provision.py b/brian_dashboard_manager/grafana/provision.py
index 99da18b..363394b 100644
--- a/brian_dashboard_manager/grafana/provision.py
+++ b/brian_dashboard_manager/grafana/provision.py
@@ -1,30 +1,21 @@
 import logging
-import os
-import json
-from functools import reduce
-from typing import List
 from brian_dashboard_manager.grafana.utils.request import AdminRequest, TokenRequest
-from brian_dashboard_manager.grafana.organization import get_organizations, create_organization, delete_organization, create_api_token, delete_api_token, delete_expired_api_tokens
-from brian_dashboard_manager.grafana.dashboard import provision_dashboard
-
+from brian_dashboard_manager.grafana.organization import get_organizations, create_organization, create_api_token, delete_api_token, delete_expired_api_tokens
+from brian_dashboard_manager.grafana.dashboard import get_dashboard_definitions, create_dashboard
+from brian_dashboard_manager.grafana.datasource import get_missing_datasource_definitions, create_datasource
 
 logger = logging.getLogger(__name__)
 
 
 def provision(config):
 
-    hostname = config.get('hostname')
-    port = config.get('grafana_port')
-    username = config.get('admin_username')
-    password = config.get('admin_password')
-
-    request = AdminRequest(hostname, port, username, password)
+    request = AdminRequest(**config)
     all_orgs = get_organizations(request)
 
     organizations_to_provision = config.get('organizations', [])
 
-    missing = [name for name in organizations_to_provision
-               if name not in [org['name'] for org in all_orgs]]
+    missing = (name for name in organizations_to_provision
+               if name not in [org['name'] for org in all_orgs])
 
     for org in missing:
         org_data = create_organization(request, org)
@@ -34,15 +25,20 @@ def provision(config):
         org_id = org['id']
         delete_expired_api_tokens(request, org_id)
         token = create_api_token(request, org_id)
-        token_request = TokenRequest(hostname, port, token['key'])
-        # TODO: (de)provision datasources and remove all existing dashboards in an organization before attempting to provision new dashboards.
-
-        for (dirpath, dirnames, filenames) in os.walk(config.get('dashboard_directory', 'dashboards')):
-            for file in filenames:
-                if file.endswith('.json'):
-                    filename = os.path.join(dirpath, file)
-                    logger.info(f'Provisioning dashboard: {file.strip(".json")}')
-                    provision_dashboard(token_request, json.load(open(filename, 'r')))
+        token_request = TokenRequest(token=token['key'], **config)
+
+        logger.info(f'--- Provisioning org {org["name"]} (ID #{org_id}) ---')
+
+        # Provision missing data sources
+        for datasource in get_missing_datasource_definitions(token_request):
+            ds = create_datasource(
+                token_request, datasource, config.get('BRIAN_ENVIRONMENT', 'test'))
+            if ds:
+                logger.info(f'Provisioned datasource: {datasource["name"]}')
+
+        # Provision dashboards, overwriting existing ones.
+        for dashboard in get_dashboard_definitions():
+            create_dashboard(token_request, dashboard)
 
         delete_api_token(request, org_id, token['id'])
 
-- 
GitLab