From 2bba2f8323b0aea8e4768576816f4101d86cbdc1 Mon Sep 17 00:00:00 2001
From: Bjarke Madsen <bjarke@nordu.net>
Date: Tue, 30 May 2023 12:34:18 +0200
Subject: [PATCH] add retries when creating dashboards on error 500

---
 brian_dashboard_manager/grafana/dashboard.py | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/brian_dashboard_manager/grafana/dashboard.py b/brian_dashboard_manager/grafana/dashboard.py
index ccaf83b..f5357b0 100644
--- a/brian_dashboard_manager/grafana/dashboard.py
+++ b/brian_dashboard_manager/grafana/dashboard.py
@@ -10,6 +10,7 @@ from brian_dashboard_manager.grafana.utils.request import TokenRequest
 
 logger = logging.getLogger(__name__)
 
+NUM_RETRIES = 3
 
 def get_dashboard_definitions(dir=None):
     """
@@ -231,9 +232,17 @@ def create_dashboard(request: TokenRequest, dashboard: dict, folder_id=None):
     if folder_id:
         payload['folderId'] = folder_id
 
-    try:
-        r = request.post('api/dashboards/db', json=payload)
-        return r.json()
-    except HTTPError:
-        logger.exception(f'Error when provisioning dashboard {title}')
+    # retry up to NUM_RETRIES times
+    for _ in range(NUM_RETRIES):
+        try:
+            r = request.post('api/dashboards/db', json=payload)
+            return r.json()
+        except HTTPError as e:
+            message = ''
+            if e.response is not None and e.response.status_code == 412:
+                message = e.response.json()
+            logger.exception(f'Error when provisioning dashboard {title}: {message}')
+            if e.response is not None and e.response.status_code < 500:
+                # only retry on server side errors
+                break
     return None
-- 
GitLab