From 6a3efcf84d12dffd1bc60fee60cc1e7bfed86a53 Mon Sep 17 00:00:00 2001
From: Bjarke Madsen <bjarke@nordu.net>
Date: Mon, 4 Mar 2024 14:33:50 +0100
Subject: [PATCH] Fix unhandled errors from inventory-provider API

---
 .../inventory_provider/interfaces.py          | 54 +++++++++++++------
 1 file changed, 39 insertions(+), 15 deletions(-)

diff --git a/brian_dashboard_manager/inventory_provider/interfaces.py b/brian_dashboard_manager/inventory_provider/interfaces.py
index dcdd6dd..dec23c6 100644
--- a/brian_dashboard_manager/inventory_provider/interfaces.py
+++ b/brian_dashboard_manager/inventory_provider/interfaces.py
@@ -1,8 +1,9 @@
-from enum import Enum, auto
 import requests
 import logging
 import jsonschema
 
+from requests.exceptions import HTTPError
+from enum import Enum, auto
 from functools import reduce
 
 logger = logging.getLogger(__name__)
@@ -300,9 +301,14 @@ def _get_ip_info(host):
             prev[router_name] = router
 
         return prev
-    r = requests.get(f'{host}/data/interfaces')
-    r.raise_for_status()
-    interfaces = r.json()
+    try:
+        r = requests.get(f'{host}/data/interfaces')
+        r.raise_for_status()
+        interfaces = r.json()
+    except HTTPError:
+        logger.exception('Failed to get IP info')
+        interfaces = []
+
     jsonschema.validate(interfaces, ROUTER_INTERFACES_SCHEMA)
     return reduce(reduce_func, interfaces, {})
 
@@ -316,8 +322,13 @@ def get_interfaces(host):
     """
 
     r = requests.get(f'{host}/poller/interfaces')
-    r.raise_for_status()
-    interfaces = r.json()
+    try:
+        r.raise_for_status()
+        interfaces = r.json()
+    except HTTPError:
+        logger.exception('Failed to get interfaces')
+        interfaces = []
+
     jsonschema.validate(interfaces, INTERFACE_LIST_SCHEMA)
 
     ip_info = _get_ip_info(host)
@@ -336,6 +347,7 @@ def get_interfaces(host):
         interface['ipv4'] = ipv4
         interface['ipv6'] = ipv6
         return interface
+
     filtered = filter(lambda i: len(i['dashboards']) > 0, interfaces)
     enriched = list(map(enrich, filtered))
     return enriched
@@ -351,8 +363,13 @@ def get_gws_direct(host):
     """
 
     r = requests.get(f'{host}/poller/gws/direct')
-    r.raise_for_status()
-    interfaces = r.json()
+    try:
+        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)
     return interfaces
 
@@ -364,10 +381,13 @@ def get_gws_indirect(host):
     :param host: Hostname to perform the request to.
     :return: GWS Indirect data
     """
-
-    r = requests.get(f'{host}/poller/gws/indirect')
-    r.raise_for_status()
-    interfaces = r.json()
+    try:
+        r = requests.get(f'{host}/poller/gws/indirect')
+        r.raise_for_status()
+        interfaces = r.json()
+    except HTTPError:
+        logger.exception('Failed to get GWS indirect data')
+        interfaces = []
     return interfaces
 
 
@@ -378,9 +398,13 @@ def get_eumetsat_multicast_subscriptions(host):
     :param host: Hostname to perform the request to.
     :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)
     return data
-- 
GitLab