Skip to content
Snippets Groups Projects
Commit 2abbb128 authored by geant-release-service's avatar geant-release-service
Browse files

Finished release 0.58.

parents 0675fc12 feee2ca0
No related branches found
No related tags found
No related merge requests found
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
"asDropdown": true, "asDropdown": true,
"icon": "external link", "icon": "external link",
"tags": [ "tags": [
"copernicus" "peer-aggregate"
], ],
"title": "Aggregates", "title": "Aggregates",
"type": "dashboards" "type": "dashboards"
......
...@@ -19,13 +19,24 @@ def delete_folder(request: TokenRequest, title=None, uid=None): ...@@ -19,13 +19,24 @@ def delete_folder(request: TokenRequest, title=None, uid=None):
:return: True if folder is considered deleted, False otherwise :return: True if folder is considered deleted, False otherwise
""" """
if uid: if uid:
r = request.delete(f'api/folders/{uid}').json() try:
r = request.delete(f'api/folders/{uid}').json()
except HTTPError:
logger.exception(f'Error when deleting folder: {uid}')
return False
return r is not None return r is not None
else: else:
folder = find_folder(request, title, False) folder = find_folder(request, title, False)
if folder is None: if folder is None:
return True return True
r = request.delete(f'api/folders/{folder.get("uid")}').json() try:
r = request.delete(f'api/folders/{folder.get("uid")}')
r = r.json()
except HTTPError:
logger.exception(f'Error when deleting folder: {title}')
return False
logger.info(f'Deleted folder: {title}') logger.info(f'Deleted folder: {title}')
return r is not None return r is not None
...@@ -48,8 +59,10 @@ def find_folder(request: TokenRequest, title, create=True): ...@@ -48,8 +59,10 @@ def find_folder(request: TokenRequest, title, create=True):
folder = None folder = None
if not folder and create: if not folder and create:
logger.info(f'Created folder: {title}')
folder = create_folder(request, title) folder = create_folder(request, title)
if not folder:
return None
logger.info(f'Created folder: {title}')
return folder return folder
...@@ -61,7 +74,14 @@ def get_folders(request: TokenRequest): ...@@ -61,7 +74,14 @@ def get_folders(request: TokenRequest):
:param request: TokenRequest object :param request: TokenRequest object
:return: list of folder definitions :return: list of folder definitions
""" """
return request.get('api/folders').json() try:
r = request.get('api/folders')
folders = r.json()
except HTTPError:
logger.exception('Error when getting Grafana folders:')
return []
return folders
def create_folder(request: TokenRequest, title): def create_folder(request: TokenRequest, title):
......
...@@ -161,12 +161,22 @@ AGG_DASHBOARDS = { ...@@ -161,12 +161,22 @@ AGG_DASHBOARDS = {
'dashboard_name': 'CAE1', 'dashboard_name': 'CAE1',
'interfaces': [] 'interfaces': []
}, },
'IC1': {
'tag': ['ic1', 'peer-aggregate'],
'dashboard_name': 'IC-1',
'interfaces': []
},
'COPERNICUS': { 'COPERNICUS': {
'tag': ['copernicus', 'services'], 'tag': ['copernicus', 'services', 'peer-aggregate'],
'dashboard_name': 'COPERNICUS', 'dashboard_name': 'COPERNICUS',
'group_by': 'location', 'group_by': 'location',
'interfaces': [] 'interfaces': []
} },
'ANA': {
'tag': ['ana', 'peer-aggregate'],
'dashboard_name': 'ANA',
'interfaces': []
},
} }
...@@ -478,6 +488,8 @@ def _provision_gws_direct(config, org_config, ds_name, token): ...@@ -478,6 +488,8 @@ def _provision_gws_direct(config, org_config, ds_name, token):
delete_folder(token, title=folder_name) delete_folder(token, title=folder_name)
else: else:
folder = find_folder(token, folder_name) folder = find_folder(token, folder_name)
if not folder:
logger.error(f'Folder {folder_name} not found')
with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
gws_data = get_gws_direct(config['inventory_provider']) gws_data = get_gws_direct(config['inventory_provider'])
provisioned = [] provisioned = []
......
from enum import Enum, auto
import requests import requests
import logging import logging
import jsonschema import jsonschema
from requests.exceptions import HTTPError
from enum import Enum, auto
from functools import reduce from functools import reduce
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -39,7 +40,9 @@ class BRIAN_DASHBOARDS(Enum): ...@@ -39,7 +40,9 @@ class BRIAN_DASHBOARDS(Enum):
GWS_UPSTREAMS = auto() GWS_UPSTREAMS = auto()
LHCONE = auto() LHCONE = auto()
CAE1 = auto() CAE1 = auto()
IC1 = auto()
COPERNICUS = auto() COPERNICUS = auto()
ANA = auto()
# NREN customer # NREN customer
NREN = auto() NREN = auto()
...@@ -300,9 +303,14 @@ def _get_ip_info(host): ...@@ -300,9 +303,14 @@ def _get_ip_info(host):
prev[router_name] = router prev[router_name] = router
return prev return prev
r = requests.get(f'{host}/data/interfaces') try:
r.raise_for_status() r = requests.get(f'{host}/data/interfaces')
interfaces = r.json() r.raise_for_status()
interfaces = r.json()
except HTTPError:
logger.exception('Failed to get IP info')
interfaces = []
jsonschema.validate(interfaces, ROUTER_INTERFACES_SCHEMA) jsonschema.validate(interfaces, ROUTER_INTERFACES_SCHEMA)
return reduce(reduce_func, interfaces, {}) return reduce(reduce_func, interfaces, {})
...@@ -316,8 +324,13 @@ def get_interfaces(host): ...@@ -316,8 +324,13 @@ def get_interfaces(host):
""" """
r = requests.get(f'{host}/poller/interfaces') r = requests.get(f'{host}/poller/interfaces')
r.raise_for_status() try:
interfaces = r.json() r.raise_for_status()
interfaces = r.json()
except HTTPError:
logger.exception('Failed to get interfaces')
interfaces = []
jsonschema.validate(interfaces, INTERFACE_LIST_SCHEMA) jsonschema.validate(interfaces, INTERFACE_LIST_SCHEMA)
ip_info = _get_ip_info(host) ip_info = _get_ip_info(host)
...@@ -336,6 +349,7 @@ def get_interfaces(host): ...@@ -336,6 +349,7 @@ def get_interfaces(host):
interface['ipv4'] = ipv4 interface['ipv4'] = ipv4
interface['ipv6'] = ipv6 interface['ipv6'] = ipv6
return interface return interface
filtered = filter(lambda i: len(i['dashboards']) > 0, interfaces) filtered = filter(lambda i: len(i['dashboards']) > 0, interfaces)
enriched = list(map(enrich, filtered)) enriched = list(map(enrich, filtered))
return enriched return enriched
...@@ -351,8 +365,13 @@ def get_gws_direct(host): ...@@ -351,8 +365,13 @@ def get_gws_direct(host):
""" """
r = requests.get(f'{host}/poller/gws/direct') r = requests.get(f'{host}/poller/gws/direct')
r.raise_for_status() try:
interfaces = r.json() r.raise_for_status()
interfaces = r.json()
except HTTPError:
logger.exception('Failed to get GWS direct data')
interfaces = []
jsonschema.validate(interfaces, GWS_DIRECT_DATA_SCHEMA) jsonschema.validate(interfaces, GWS_DIRECT_DATA_SCHEMA)
return interfaces return interfaces
...@@ -364,10 +383,13 @@ def get_gws_indirect(host): ...@@ -364,10 +383,13 @@ def get_gws_indirect(host):
:param host: Hostname to perform the request to. :param host: Hostname to perform the request to.
:return: GWS Indirect data :return: GWS Indirect data
""" """
try:
r = requests.get(f'{host}/poller/gws/indirect') r = requests.get(f'{host}/poller/gws/indirect')
r.raise_for_status() r.raise_for_status()
interfaces = r.json() interfaces = r.json()
except HTTPError:
logger.exception('Failed to get GWS indirect data')
interfaces = []
return interfaces return interfaces
...@@ -378,9 +400,13 @@ def get_eumetsat_multicast_subscriptions(host): ...@@ -378,9 +400,13 @@ def get_eumetsat_multicast_subscriptions(host):
:param host: Hostname to perform the request to. :param host: Hostname to perform the request to.
:return: EUMETSAT multicast subscriptions :return: EUMETSAT multicast subscriptions
""" """
try:
r = requests.get(f'{host}/poller/eumetsat-multicast')
r.raise_for_status()
data = r.json()
except HTTPError:
logger.exception('Failed to get EUMETSAT multicast subscriptions')
data = []
r = requests.get(f'{host}/poller/eumetsat-multicast')
r.raise_for_status()
data = r.json()
jsonschema.validate(data, MULTICAST_SUBSCRIPTION_LIST_SCHEMA) jsonschema.validate(data, MULTICAST_SUBSCRIPTION_LIST_SCHEMA)
return data return data
import logging
import requests import requests
logger = logging.getLogger(__name__)
def fetch_services(host): def fetch_services(host):
""" """
Fetches the current service state from the Reporting Provider host Fetches the current service state from the Reporting Provider host
""" """
r = requests.get(f'{host}/scid/current') try:
r.raise_for_status() r = requests.get(f'{host}/scid/current')
services = r.json() r.raise_for_status()
services = r.json()
except requests.exceptions.HTTPError:
logger.exception('Error when fetching services:')
services = []
return services return services
...@@ -2,6 +2,10 @@ ...@@ -2,6 +2,10 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [0.58] - 2024-04-22
- POL1-418/POL1-804: Add ANA graphs
- POL1-703: Add IC1 aggregate dashboard
## [0.57] - 2024-02-27 ## [0.57] - 2024-02-27
- Fix layout for Grafana 10.3.3 - Fix layout for Grafana 10.3.3
......
...@@ -2,7 +2,7 @@ from setuptools import setup, find_packages ...@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup( setup(
name='brian-dashboard-manager', name='brian-dashboard-manager',
version="0.57", version="0.58",
author='GEANT', author='GEANT',
author_email='swd@geant.org', author_email='swd@geant.org',
description='', description='',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment