From 4f57da1d6dc8344a5b487f8f049110303ff6a851 Mon Sep 17 00:00:00 2001
From: Christopher Rhodes <christopher.rhodes@embl.de>
Date: Fri, 22 Mar 2024 16:42:25 +0100
Subject: [PATCH] Report out session logs on API

---
 model_server/base/api.py     | 4 ++++
 model_server/base/session.py | 9 +++++++++
 tests/test_api.py            | 7 ++++++-
 tests/test_session.py        | 9 +++++++++
 4 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/model_server/base/api.py b/model_server/base/api.py
index 5d29cff4..752ed48a 100644
--- a/model_server/base/api.py
+++ b/model_server/base/api.py
@@ -62,6 +62,10 @@ def restart_session(root: str = None) -> dict:
     session.restart(root=root)
     return session.describe_loaded_models()
 
+@app.get('/session/logs')
+def list_session_log() -> list:
+    return session.get_log_data()
+
 @app.get('/models')
 def list_active_models():
     return session.describe_loaded_models()
diff --git a/model_server/base/session.py b/model_server/base/session.py
index bd76709f..18c8b61d 100644
--- a/model_server/base/session.py
+++ b/model_server/base/session.py
@@ -79,6 +79,15 @@ class Session(object, metaclass=Singleton):
             idx += 1
         return f'{yyyymmdd}-{idx:04d}'
 
+    def get_log_data(self) -> list:
+        log = []
+        with open(self.logfile, 'r') as fh:
+            for line in fh:
+                k = ['datatime', 'level', 'message']
+                v = line.strip().split(' - ')[0:3]
+                log.insert(0, dict(zip(k, v)))
+        return log
+
     def log_info(self, msg):
         logger.info(msg)
 
diff --git a/tests/test_api.py b/tests/test_api.py
index 2afc8e93..aa302338 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -171,4 +171,9 @@ class TestApiFromAutomatedClient(TestServerBaseClass):
         )
         self.assertEqual(resp_change.status_code, 200)
         resp_check = self._get('paths')
-        self.assertEqual(resp_inpath.json()['outbound_images'], resp_check.json()['outbound_images'])
\ No newline at end of file
+        self.assertEqual(resp_inpath.json()['outbound_images'], resp_check.json()['outbound_images'])
+
+    def test_get_logs(self):
+        resp = self._get('session/logs')
+        self.assertEqual(resp.status_code, 200)
+        self.assertEqual(resp.json()[0]['message'], 'Initialized session')
\ No newline at end of file
diff --git a/tests/test_session.py b/tests/test_session.py
index 6d998c33..6a85f199 100644
--- a/tests/test_session.py
+++ b/tests/test_session.py
@@ -65,6 +65,15 @@ class TestGetSessionObject(unittest.TestCase):
             log = fh.read()
         self.assertTrue(msg in log)
 
+    def test_get_logs(self):
+        self.sesh.log_info('Info example 1')
+        self.sesh.log_warning('Example warning')
+        self.sesh.log_info('Info example 2')
+        logs = self.sesh.get_log_data()
+        self.assertEqual(len(logs), 4)
+        self.assertEqual(logs[1]['level'], 'WARNING')
+        self.assertEqual(logs[-1]['message'], 'Initialized session')
+
     def test_session_records_workflow(self):
         di = WorkflowRunRecord(
             model_id='test_model',
-- 
GitLab