diff --git a/brian_dashboard_manager/grafana/provision.py b/brian_dashboard_manager/grafana/provision.py index 99da18b09599241c9ff628259d4bf99623341977..363394b9f372e664bb98eae61c79c9dd6410e01e 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'])