diff --git a/brian_dashboard_manager/grafana/dashboard.py b/brian_dashboard_manager/grafana/dashboard.py index 3ab43d34d96c8bb498e5798ce5f1bb9964df4e14..8deec69f8044bf3aa97d4898c1390c884df34eff 100644 --- a/brian_dashboard_manager/grafana/dashboard.py +++ b/brian_dashboard_manager/grafana/dashboard.py @@ -73,26 +73,17 @@ def delete_dashboards(request: TokenRequest): return True -# lists all dashboards, optionally within a folder -def list_dashboards(request: TokenRequest, folder_id=None): - params = { - 'query': '' - } - if folder_id is not None: - params['folderIds'] = folder_id - - r = request.get('api/search', params=params) - return r - - # Searches for a dashboard with given title -def find_dashboard(request: TokenRequest, title=None): +def find_dashboard(request: TokenRequest, title=None, folder_id=None): param = { **({'query': title} if title else {}), 'type': 'dash-db', 'limit': 5000, 'page': 1 } + if folder_id is not None: + param['folderIds'] = folder_id + r = request.get('api/search', params=param) if r and len(r) > 0: if title: diff --git a/brian_dashboard_manager/grafana/folder.py b/brian_dashboard_manager/grafana/folder.py index 64e6ad46b645d9693a3ea0264e8999fc2c1688b4..fb214ddd9b9a3ed6d449ad355df96cddfc2ef784 100644 --- a/brian_dashboard_manager/grafana/folder.py +++ b/brian_dashboard_manager/grafana/folder.py @@ -6,7 +6,7 @@ from brian_dashboard_manager.grafana.utils.request import TokenRequest logger = logging.getLogger(__name__) -def delete_folder(request: TokenRequest, title, uid=None): +def delete_folder(request: TokenRequest, title=None, uid=None): if uid: r = request.delete(f'api/folders/{uid}') return r is not None diff --git a/brian_dashboard_manager/grafana/provision.py b/brian_dashboard_manager/grafana/provision.py index 7a9bc702a9dfe5c55b18b442efbdb7f3cee4e917..9acd02bed82a8daacb45e037ab1fc3caff4eafac 100644 --- a/brian_dashboard_manager/grafana/provision.py +++ b/brian_dashboard_manager/grafana/provision.py @@ -18,12 +18,11 @@ from brian_dashboard_manager.grafana.organization import \ get_organizations, create_organization, create_api_token, \ delete_api_token, delete_expired_api_tokens, set_home_dashboard from brian_dashboard_manager.grafana.dashboard import find_dashboard, \ - get_dashboard_definitions, create_dashboard, delete_dashboard, \ - list_dashboards + get_dashboard_definitions, create_dashboard, delete_dashboard from brian_dashboard_manager.grafana.datasource import \ check_provisioned, create_datasource from brian_dashboard_manager.grafana.folder import find_folder, \ - delete_folder + delete_folder, get_folders from brian_dashboard_manager.inventory_provider.interfaces import \ get_gws_direct, get_gws_indirect, get_interfaces @@ -309,6 +308,11 @@ def provision(config): updated = find_dashboard(token_request) or [] updated = reduce(get_uid, updated, {}) + # General is a base folder present in Grafana + folders_to_keep = ['General', 'Aggregates'] + folders_to_keep.extend([dash['folder_name'] + for dash in dashboards.values()]) + def update_dash_list(dashboards): for dashboard in dashboards: if isinstance(dashboard, Future): @@ -452,12 +456,16 @@ def provision(config): # get dashboard UIDs from ignored folders # and make sure we don't touch them for name in ignored_folders: + folders_to_keep.append(name) logger.info( f'Ignoring dashboards under the folder {org["name"]}/{name}') folder = find_folder(token_request, name, create=False) if folder is None: continue - to_ignore = list_dashboards(token_request, folder['id']) + to_ignore = find_dashboard(token_request, folder_id=folder['id']) + + if to_ignore is None: + continue for dash in to_ignore: # mark it updated, so we don't modify it. @@ -468,6 +476,13 @@ def provision(config): logger.info(f'Deleting stale dashboard with UID {dash}') delete_dashboard(token_request, {'uid': dash}) + all_folders = get_folders(token_request) + folders_to_keep = set(folders_to_keep) + + for folder in all_folders: + if folder['title'] not in folders_to_keep: + delete_folder(token_request, uid=folder['uid']) + logger.info(f'Time to complete: {time.time() - start}') for org_id, token in tokens: delete_api_token(request, org_id, token) diff --git a/changelog.md b/changelog.md index c5374a4daba918e1a42f6fa69d250275b826ef8e..6047e161ec477f8abe959ccee6e0398b5efa5e51 100644 --- a/changelog.md +++ b/changelog.md @@ -2,8 +2,11 @@ All notable changes to this project will be documented in this file. +## [0.21] - 2021-09-14 +- Delete left-over and unmanaged folders + ## [0.20] - 2021-09-13 -- Don't automatically create ignored folders, just ignore them if they are present. +- Don't automatically create ignored folders, just ignore them if they are present ## [0.19] - 2021-09-13 - [POL1-501] create config option ignored_folders for provisioning folders with manually maintained dashboards diff --git a/setup.py b/setup.py index 1b5e7aa93bf018ba54ba3cc5304acbeeb89dffad..6a02e312571526a640b4214596b6e552760fe747 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name='brian-dashboard-manager', - version="0.20", + version="0.21", author='GEANT', author_email='swd@geant.org', description='',