diff --git a/brian_dashboard_manager/grafana/provision.py b/brian_dashboard_manager/grafana/provision.py index c0f27229954af0929764e29430474ef2a8dbe9ca..dfa8ae508ea738d7055f48e106df137a110c2157 100644 --- a/brian_dashboard_manager/grafana/provision.py +++ b/brian_dashboard_manager/grafana/provision.py @@ -14,6 +14,8 @@ from brian_dashboard_manager.config import DEFAULT_ORGANIZATIONS, STATE_PATH from brian_dashboard_manager.grafana.utils.request import AdminRequest, \ TokenRequest +from brian_dashboard_manager.services.api import fetch_services + from brian_dashboard_manager.grafana.organization import \ get_organizations, create_organization, create_api_token, \ delete_api_token, delete_expired_api_tokens, set_home_dashboard @@ -36,6 +38,7 @@ from brian_dashboard_manager.templating.gws import generate_gws, \ generate_indirect from brian_dashboard_manager.templating.eumetsat \ import generate_eumetsat_multicast +from brian_dashboard_manager.templating.services import create_service_panels from brian_dashboard_manager.templating.render import render_dashboard logger = logging.getLogger(__name__) @@ -356,6 +359,33 @@ def _provision_interfaces(config, org_config, ds_name, token): yield from folder +def _provision_service_dashboards(config, org_config, ds_name, token): + """ + Fetches service data from Reporting Provider + and creates dashboards for each customer with their services + """ + logger.info('Provisioning Service dashboards') + folder_name = 'Service POC' + + # hardcode the org for the POC + if org_config.get('name') != 'GÉANT Staff': + return [] + + if is_excluded_folder(org_config, folder_name): + # don't provision Services folder + delete_folder(token, title=folder_name) + else: + folder = find_folder(token, folder_name) + with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: + services = fetch_services(config['reporting_provider']) + dashes = create_service_panels(services, ds_name) + for dashboard in dashes: + rendered = render_dashboard(dashboard) + yield executor.submit(create_dashboard, + token, + rendered, folder['id']) + + def _provision_gws_indirect(config, org_config, ds_name, token): # fetch GWS direct data and provision related dashboards logger.info('Provisioning GWS Indirect dashboards') @@ -507,6 +537,7 @@ def _delete_unknown_folders(config, token): # General is a base folder present in Grafana 'General', # other folders, created outside of the DASHBOARDS list + 'Service POC', 'GWS Indirect', 'GWS Direct', 'Aggregates', @@ -521,6 +552,7 @@ def _delete_unknown_folders(config, token): for folder in all_folders: if folder['title'] in folders_to_keep: continue + logger.info(f'Deleting unknown folder: {folder.get("title")}') delete_folder(token, uid=folder['uid']) @@ -598,6 +630,8 @@ def provision(config): ds_name = datasource.get('name', 'PollerInfluxDB') managed_dashboards = itertools.chain( + _provision_service_dashboards( + config, org_config, ds_name, token_request), _provision_interfaces( config, org_config, ds_name, token_request), _provision_gws_indirect(