diff --git a/brian_dashboard_manager/grafana/provision.py b/brian_dashboard_manager/grafana/provision.py index 3dd9481968d2cf434102273c373bc1cb92f1a189..8087026120e9a57352257a8bce0474353fe72493 100644 --- a/brian_dashboard_manager/grafana/provision.py +++ b/brian_dashboard_manager/grafana/provision.py @@ -756,74 +756,78 @@ def provision(config): return None for org in all_orgs: - org_id = org['id'] - - logger.info( - f'--- Provisioning org {org["name"]} (ID #{org_id}) ---') - org_config = _find_org_config(org) - if not org_config: - # message logged from _find_org_config - continue - - token = create_api_token(request, org_id) - token_request = TokenRequest(token=token['key'], **config) - tokens.append((org_id, token['id'])) - logger.debug(tokens) - - all_original_dashboards = list_dashboards(token_request) - all_original_dashboard_uids = { - d['uid'] for d in all_original_dashboards} - - datasource = _provision_datasource(config, token_request) - ds_name = datasource.get('name', 'PollerInfluxDB') - - managed_dashboards = itertools.chain( - _provision_interfaces( - config, org_config, ds_name, token_request), - _provision_gws_indirect( - config, org_config, ds_name, token_request), - _provision_gws_direct( - config, org_config, ds_name, token_request), - _provision_eumetsat_multicast( - config, org_config, ds_name, token_request), - _provision_aggregates( - config, org_config, ds_name, token_request), - _provision_static_dashboards( - config, org_config, ds_name, token_request), - _get_ignored_dashboards( - config, org_config, token_request) - ) + try: + org_id = org['id'] - managed_dashboard_uids = set() - for dashboard in managed_dashboards: - if isinstance(dashboard, Future): - dashboard = dashboard.result() - if dashboard is None: + logger.info( + f'--- Provisioning org {org["name"]} (ID #{org_id}) ---') + org_config = _find_org_config(org) + if not org_config: + # message logged from _find_org_config continue - managed_dashboard_uids.add(dashboard['uid']) - - for uid in all_original_dashboard_uids - managed_dashboard_uids: - # delete unmanaged dashboards - logger.info(f'Deleting stale dashboard with UID {uid}') - delete_dashboard(token_request, {'uid': uid}) - - folders_to_keep = { - # General is a base folder present in Grafana - 'General', - # other folders, created outside of the DASHBOARDS list - 'GWS Indirect', - 'GWS Direct', - 'Aggregates', - 'EUMETSAT Multicast' - } - folders_to_keep.update({dash['folder_name'] - for dash in DASHBOARDS.values()}) - - ignored_folders = config.get('ignored_folders', []) - folders_to_keep.update(ignored_folders) - - delete_unknown_folders(token_request, folders_to_keep) - delete_api_token(request, token['id'], org_id=org_id) + + token = create_api_token(request, org_id) + token_request = TokenRequest(token=token['key'], **config) + tokens.append((org_id, token['id'])) + logger.debug(tokens) + + all_original_dashboards = list_dashboards(token_request) + all_original_dashboard_uids = { + d['uid'] for d in all_original_dashboards} + + datasource = _provision_datasource(config, token_request) + ds_name = datasource.get('name', 'PollerInfluxDB') + + managed_dashboards = itertools.chain( + _provision_interfaces( + config, org_config, ds_name, token_request), + _provision_gws_indirect( + config, org_config, ds_name, token_request), + _provision_gws_direct( + config, org_config, ds_name, token_request), + _provision_eumetsat_multicast( + config, org_config, ds_name, token_request), + _provision_aggregates( + config, org_config, ds_name, token_request), + _provision_static_dashboards( + config, org_config, ds_name, token_request), + _get_ignored_dashboards( + config, org_config, token_request) + ) + + managed_dashboard_uids = set() + for dashboard in managed_dashboards: + if isinstance(dashboard, Future): + dashboard = dashboard.result() + if dashboard is None: + continue + managed_dashboard_uids.add(dashboard['uid']) + + for uid in all_original_dashboard_uids - managed_dashboard_uids: + # delete unmanaged dashboards + logger.info(f'Deleting stale dashboard with UID {uid}') + delete_dashboard(token_request, {'uid': uid}) + + folders_to_keep = { + # General is a base folder present in Grafana + 'General', + # other folders, created outside of the DASHBOARDS list + 'GWS Indirect', + 'GWS Direct', + 'Aggregates', + 'EUMETSAT Multicast' + } + folders_to_keep.update({dash['folder_name'] + for dash in DASHBOARDS.values()}) + + ignored_folders = config.get('ignored_folders', []) + folders_to_keep.update(ignored_folders) + + delete_unknown_folders(token_request, folders_to_keep) + delete_api_token(request, token['id'], org_id=org_id) + except Exception: + logger.exception(f'Error when provisioning org {org["name"]}') + break logger.info(f'Time to complete: {time.time() - start}') diff --git a/brian_dashboard_manager/inventory_provider/interfaces.py b/brian_dashboard_manager/inventory_provider/interfaces.py index b9f574087e9e33bb30f7763ab006f14b953079e0..429969405e9b63fbe53c71b40a6be96e8dbabfdf 100644 --- a/brian_dashboard_manager/inventory_provider/interfaces.py +++ b/brian_dashboard_manager/inventory_provider/interfaces.py @@ -106,7 +106,7 @@ INTERFACE_LIST_SCHEMA = { 'type': 'object', 'properties': { 'name': {'type': 'string'}, - 'interface_type': {'enum': _INTERFACE_TYPES} + 'interface_type': {'type': 'string'}, }, 'required': ['name', 'interface_type'] }, @@ -118,7 +118,7 @@ INTERFACE_LIST_SCHEMA = { 'description': {'type': 'string'}, 'dashboards': { 'type': 'array', - 'items': {'enum': _DASHBOARD_IDS} + 'items': {'type': 'string'} }, 'dashboards_info': { 'type': 'array', diff --git a/brian_dashboard_manager/templating/templates/nren_access/nren-dashboard.json.j2 b/brian_dashboard_manager/templating/templates/nren_access/nren-dashboard.json.j2 index 7383eabdcd20a40960f69befbb3505d010651ea5..eeb9dbb9fb0151e4f25a0f100e495796bad1e2ff 100644 --- a/brian_dashboard_manager/templating/templates/nren_access/nren-dashboard.json.j2 +++ b/brian_dashboard_manager/templating/templates/nren_access/nren-dashboard.json.j2 @@ -42,17 +42,18 @@ { "datasource": null, "gridPos": { - "h": 2, - "w": 15, - "x": 4, + "h": 1, + "w": 24, + "x": 0, "y": 0 }, "id": 1, "options": { - "content": "<div style=\"display: flex; justify-content: center; align-items: center; height: 100%;\"><span>INFO: The average values displayed are only mean values for timescales of 2 days or less</span></div>", + "content": "", "mode": "html" }, - "title": "", + "pluginVersion": "8.2.5", + "title": "INFO: The average values displayed are only mean values for timescales of 2 days or less", "type": "text" }, {% for panel in aggregate_panels %} diff --git a/brian_dashboard_manager/templating/templates/shared/dashboard.json.j2 b/brian_dashboard_manager/templating/templates/shared/dashboard.json.j2 index 6b2e1d59a58127c97a98bf9d79299da2bb32a304..bbefccc38a500ec4bd4656e586cbf7d11b7aab4f 100644 --- a/brian_dashboard_manager/templating/templates/shared/dashboard.json.j2 +++ b/brian_dashboard_manager/templating/templates/shared/dashboard.json.j2 @@ -39,21 +39,22 @@ "version": 1, "links": [], "panels": [ - { - "datasource": null, - "gridPos": { - "h": 2, - "w": 15, - "x": 4, - "y": 0 - }, - "id": 1, - "options": { - "content": "<div style=\"display: flex; justify-content: center; align-items: center; height: 100%;\"><span>INFO: The average values displayed are only mean values for timescales of 2 days or less</span></div>", - "mode": "html" - }, - "title": "", - "type": "text" + { + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "content": "", + "mode": "html" + }, + "pluginVersion": "8.2.5", + "title": "INFO: The average values displayed are only mean values for timescales of 2 days or less", + "type": "text" }{{ "," if panels }} {% for panel in panels %} {{ panel }}{{ "," if not loop.last }} diff --git a/changelog.md b/changelog.md index ae8b254f28d84155c8e14e1938afbfedf5ce7fe1..53fb89afe18a50a87f49cb4e476b99f087409e9d 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,11 @@ All notable changes to this project will be documented in this file. +## [0.59] - 2024-04-24 +- Add exception logging when provisioning to aid in debugging +- Fix inventory-provider schema to be less strict to support new values in the future +- Revert to layout for Grafana 8.2.5 until we can use >=10.3.3 + ## [0.58] - 2024-04-22 - POL1-418/POL1-804: Add ANA graphs - POL1-703: Add IC1 aggregate dashboard diff --git a/setup.py b/setup.py index 0ad12bd7d859b8e523f5235cd91aba929d47a677..6faadf15181667525ef792e9fcbe2d1e9a888f6f 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name='brian-dashboard-manager', - version="0.58", + version="0.59", author='GEANT', author_email='swd@geant.org', description='',