diff --git a/brian_dashboard_manager/config.py b/brian_dashboard_manager/config.py index 19fd6c836997d142dbe928dedcd313bc6ba474af..7e215f8bfc2c472aec99e0d6aaad787639974099 100644 --- a/brian_dashboard_manager/config.py +++ b/brian_dashboard_manager/config.py @@ -150,8 +150,6 @@ DEFAULT_ORGANIZATIONS = [ ] CONFIG_SCHEMA = { - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { "influx-datasource": { "type": "object", diff --git a/brian_dashboard_manager/dashboards/services_eumetsat.json b/brian_dashboard_manager/dashboards/services_eumetsat.json index 6cc2b5afcd725ff7a51f77a5fe30b677c4d391f1..46554a253d0b41c1c69be135dd546bbc77af8cf5 100755 --- a/brian_dashboard_manager/dashboards/services_eumetsat.json +++ b/brian_dashboard_manager/dashboards/services_eumetsat.json @@ -116,5 +116,6 @@ }, "timezone": "", "title": "EUMETSAT", + "uid": "eumetsat", "version": 1 } diff --git a/brian_dashboard_manager/environment.py b/brian_dashboard_manager/environment.py index 865f17a9398f932ad788947da0a3e1640d904c55..05804f27fa994c79866b08717e2d82b8cc0c9f86 100644 --- a/brian_dashboard_manager/environment.py +++ b/brian_dashboard_manager/environment.py @@ -1,7 +1,7 @@ import json import logging.config import os -import pkg_resources +from importlib.metadata import distribution import sentry_sdk from sentry_sdk.integrations.flask import FlaskIntegration @@ -16,13 +16,12 @@ def setup_logging(): default_filename = os.path.join( os.path.dirname(__file__), 'logging_default_config.json') filename = os.getenv('LOGGING_CONFIG', default_filename) - sentry_dsn = os.getenv('SENTRY_DSN') if sentry_dsn: sentry_sdk.init( dsn=sentry_dsn, integrations=[FlaskIntegration()], - release=pkg_resources.get_distribution('brian-dashboard-manager').version) + release=distribution('brian-dashboard-manager').version) with open(filename) as f: # TODO: this mac workaround should be removed ... diff --git a/brian_dashboard_manager/grafana/dashboard.py b/brian_dashboard_manager/grafana/dashboard.py index 74723ee0cc89d306a81bf3e1120debbe971f3192..9ef8db0d648f9cbcdcd4b2d64b6a8a096548a549 100644 --- a/brian_dashboard_manager/grafana/dashboard.py +++ b/brian_dashboard_manager/grafana/dashboard.py @@ -207,16 +207,7 @@ def create_dashboard(request: TokenRequest, dashboard: dict, folder_id=None): has_uid = dashboard.get('uid') is not None if has_uid: existing_dashboard = _get_dashboard(request, uid=dashboard['uid']) - - # The title might not match the one that's provisioned with that UID. - # Try to find it by searching for the title instead. - if existing_dashboard is not None: - grafana_title = existing_dashboard['title'] - different = grafana_title != title else: - different = False - - if existing_dashboard is None or different: existing_dashboard = _search_dashboard(request, dashboard, folder_id) if existing_dashboard: diff --git a/brian_dashboard_manager/grafana/datasource.py b/brian_dashboard_manager/grafana/datasource.py index 5ba9ea3ca631c4ab50c83ca4623ae69fe4d011cd..716987f0d0d5a2b715e41e98bef8eadb2ca896e8 100644 --- a/brian_dashboard_manager/grafana/datasource.py +++ b/brian_dashboard_manager/grafana/datasource.py @@ -25,7 +25,7 @@ def _datasource_exists(datasource_to_check, provisioned_datasources): return True for datasource in provisioned_datasources: exists = all(datasource.get(key) == datasource_to_check.get(key) - for key in datasource_to_check) + for key in datasource_to_check if key != 'secureJsonData') # we can't compare secureJsonData if exists: return True return False diff --git a/brian_dashboard_manager/grafana/organization.py b/brian_dashboard_manager/grafana/organization.py index eb2313f702582f60f40bbb6c21b89009bb9f5c7f..9fbfb33a84cfbf9b6e659cbc4de89a192747921a 100644 --- a/brian_dashboard_manager/grafana/organization.py +++ b/brian_dashboard_manager/grafana/organization.py @@ -220,7 +220,7 @@ def set_home_dashboard(request: TokenRequest, is_staff): """ payload = render_homedashboard(staff=is_staff) dashboard = create_dashboard(request, payload) - r = request.put('api/org/preferences', json={ + request.put('api/org/preferences', json={ 'homeDashboardId': dashboard.get('id') }).json() - return r and r.get('message') == 'Preferences updated' + return dashboard diff --git a/brian_dashboard_manager/grafana/provision.py b/brian_dashboard_manager/grafana/provision.py index 24e96aad08eb5ac94880a7295158ad30d1083b79..d7519c06924a8d75a5b56eae2f73eac2357cf4a8 100644 --- a/brian_dashboard_manager/grafana/provision.py +++ b/brian_dashboard_manager/grafana/provision.py @@ -698,20 +698,18 @@ def _provision_static_dashboards(config, org_config, ds_name, token): logger.info('Provisioning static dashboards') for dashboard in get_dashboard_definitions(): if dashboard['title'] not in excluded_dashboards: + logger.info(f'Provisioning static {dashboard["title"]} dashboard') res = create_dashboard(token, dashboard) if res: - # yield a fake dashboard dict - # ... only the 'uid' element is referenced - yield {'uid': res.get('uid')} + yield res else: + logger.info(f'Ensuring {dashboard["title"]} static dashboard is deleted') delete_dashboard(token, dashboard) # Home dashboard is always called "Home" # Make sure it's set for the organization logger.info('Configuring Home dashboard') - set_home_dashboard(token, is_staff=org_config['name'] == 'GÉANT Staff') - - yield {'uid': 'home'} + yield set_home_dashboard(token, is_staff=org_config['name'] == 'GÉANT Staff') def _get_ignored_dashboards(config, org_config, token): @@ -740,9 +738,7 @@ def _get_ignored_dashboards(config, org_config, token): continue for dash in to_ignore: - # return a hard-coded fake dashboard dict - # ... only the 'uid' element is referenced - yield {'uid': dash['uid']} # could just yield dash + yield dash def _provision_datasource(config, token): @@ -881,8 +877,7 @@ def provision(config, raise_exceptions=False): logger.debug(accounts) all_original_dashboards = list_dashboards(token_request) - all_original_dashboard_uids = { - d['uid'] for d in all_original_dashboards} + all_original_dashboard_uids = {d['uid']: d.get('folderUrl', '') + d['url'] for d in all_original_dashboards} datasource = _provision_datasource(config, token_request) ds_name = datasource.get('name', 'PollerInfluxDB') @@ -906,17 +901,21 @@ def provision(config, raise_exceptions=False): config, org_config, token_request) ) - managed_dashboard_uids = set() + managed_dashboard_uids = {} for dashboard in managed_dashboards: if isinstance(dashboard, Future): dashboard = dashboard.result() if dashboard is None: continue - managed_dashboard_uids.add(dashboard['uid']) + assert dashboard['uid'] not in managed_dashboard_uids, \ + f'Dashboard with UID {dashboard["uid"]} already exists: {dashboard}' + managed_dashboard_uids[dashboard['uid']] = dashboard['url'] - for uid in all_original_dashboard_uids - managed_dashboard_uids: + difference = set(all_original_dashboard_uids.keys()) - set(managed_dashboard_uids.keys()) + for uid in difference: + info = all_original_dashboard_uids[uid] # delete unmanaged dashboards - logger.info(f'Deleting stale dashboard with UID {uid}') + logger.info(f'Deleting stale dashboard {info} with UID {uid}') delete_dashboard(token_request, {'uid': uid}) folders_to_keep = { diff --git a/brian_dashboard_manager/inventory_provider/interfaces.py b/brian_dashboard_manager/inventory_provider/interfaces.py index 7a74d987b4601a87dd7588f722dd6cc3c4dc2f9a..44951bcba912970d44bc367f94b179354bab7ab9 100644 --- a/brian_dashboard_manager/inventory_provider/interfaces.py +++ b/brian_dashboard_manager/inventory_provider/interfaces.py @@ -62,7 +62,6 @@ _PORT_TYPES = [t.name for t in list(PORT_TYPES)] _INTERFACE_TYPES = [i.name for i in list(INTERFACE_TYPES)] ROUTER_INTERFACES_SCHEMA = { - "$schema": "http://json-schema.org/draft-07/schema#", "type": "array", "items": { "type": "object", @@ -89,8 +88,6 @@ ROUTER_INTERFACES_SCHEMA = { } INTERFACE_LIST_SCHEMA = { - '$schema': 'http://json-schema.org/draft-07/schema#', - 'definitions': { 'service': { 'type': 'object', @@ -137,8 +134,6 @@ INTERFACE_LIST_SCHEMA = { } GWS_DIRECT_DATA_SCHEMA = { - '$schema': 'http://json-schema.org/draft-07/schema#', - 'definitions': { 'oid': { 'type': 'string', @@ -214,8 +209,6 @@ GWS_DIRECT_DATA_SCHEMA = { } MULTICAST_SUBSCRIPTION_LIST_SCHEMA = { - '$schema': 'http://json-schema.org/draft-07/schema#', - 'definitions': { 'ipv4-address': { 'type': 'string', @@ -243,7 +236,6 @@ MULTICAST_SUBSCRIPTION_LIST_SCHEMA = { } NREN_REGION_LIST_SCHEMA = { - '$schema': 'https://json-schema.org/draft-07/schema#', 'definitions': { 'nren_region': { 'type': 'object', diff --git a/brian_dashboard_manager/routes/update.py b/brian_dashboard_manager/routes/update.py index 4674d82c85041886e04c692e35cc8debe58c72b2..8a042dfbfba511e0bcb42bf2bd3aa55c3f7823b0 100644 --- a/brian_dashboard_manager/routes/update.py +++ b/brian_dashboard_manager/routes/update.py @@ -13,7 +13,6 @@ from brian_dashboard_manager.config import STATE_PATH routes = Blueprint("update", __name__) UPDATE_RESPONSE_SCHEMA = { - '$schema': 'http://json-schema.org/draft-07/schema#', 'type': 'object', 'properties': { 'message': { diff --git a/brian_dashboard_manager/routes/version.py b/brian_dashboard_manager/routes/version.py index 55d6a88ff1081fc2c3f29b73697ec4c2b6a2bfc7..26da9b5b37e9da5470dc56549b56abee624e25df 100644 --- a/brian_dashboard_manager/routes/version.py +++ b/brian_dashboard_manager/routes/version.py @@ -1,5 +1,4 @@ -import pkg_resources - +from importlib.metadata import distribution from flask import Blueprint, jsonify from brian_dashboard_manager.routes import common @@ -18,6 +17,6 @@ def version(): version_params = { 'api': API_VERSION, 'module': - pkg_resources.get_distribution('brian-dashboard-manager').version + distribution('brian-dashboard-manager').version } return jsonify(version_params) diff --git a/changelog.md b/changelog.md index b1f465b75ac4a4f8daefad021cb10a9accfbebc6..4e47c6cf5ee711b81afac2ad55a075c2ea183506 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. +## [0.67] - 2024-10-14 +- Fix provisioning of static EUMETSAT dashboard +- Give the EUMETSAT dashboard a fixed UID +- When searching for dashboards with UID, don't attempt to search by name afterwards +- Fix various warnings for deprecated code + + ## [0.66] - 2024-10-14 - POL1-430 - Add EAP NREN Access dashboard to access EAP NRENs and aggregate dashboard diff --git a/setup.py b/setup.py index 07237d5a6535a8b2f8b19f31c6cce1f60e7560a0..5eb544169e9e84dfa5cda490113ba425bf4c2a29 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name='brian-dashboard-manager', - version="0.66", + version="0.67", author='GEANT', author_email='swd@geant.org', description='', diff --git a/test/conftest.py b/test/conftest.py index dbc0f52723b405677db6d72a7fef7ecf827d9981..963d78c118f63a0415f612b75a42d8bc95f333d3 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -223,11 +223,12 @@ def mock_grafana(data_config): def _create_object(self, obj, all_objects): id = obj.get("id") - uid = obj.get("uid") + uid = obj.get("uid") or next(self.uids) obj = { + 'url': '/fake/grafana/' + str(uid), **obj, "id": id if id is not None else next(self.ids), - "uid": str(uid if uid is not None else next(self.uids)), + "uid": str(uid), } all_objects[obj["uid"]] = obj return obj