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