From b14edc41c0091be9043c344393825096d3af5ee4 Mon Sep 17 00:00:00 2001
From: Tor-Einar Skog <tor-einar.skog@nibio.no>
Date: Tue, 14 Feb 2023 12:51:30 +0100
Subject: [PATCH] Handling client running non-existent model

---
 app/internal/model_factory.py |  3 ++-
 app/main.py                   | 35 +++++++++++++++++++++++++++--------
 2 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/app/internal/model_factory.py b/app/internal/model_factory.py
index 4c8821a..cb91d11 100644
--- a/app/internal/model_factory.py
+++ b/app/internal/model_factory.py
@@ -34,7 +34,8 @@ def discover_models():
     return models
 
 def get_model_instance(model_id):
-    return get_vips_models().get(model_id)()
+    model_class = get_vips_models().get(model_id)
+    return model_class() if model_class is not None else None
 
 def get_vips_model_packages():
     global _packages
diff --git a/app/main.py b/app/main.py
index be6ad2e..7c8f073 100644
--- a/app/main.py
+++ b/app/main.py
@@ -1,4 +1,4 @@
-from fastapi import FastAPI
+from fastapi import FastAPI, Response, status
 from fastapi.responses import PlainTextResponse
 from app.internal.model_factory import *
 from vipscore_common.vips_model import VIPSModel
@@ -49,12 +49,17 @@ async def print_model_list(language: str) -> str:
 
 #######  Model running endpoints #######
 @app.post("/models/run/", name="Run a model")
-async def run_model_from_config_only(model_configuration:ModelConfiguration):
-    return _run_model(model_configuration.model_id, model_configuration)
+async def run_model_from_config_only(model_configuration:ModelConfiguration, response:Response):
+    result = _run_model(model_configuration.model_id, model_configuration)
+    return _result_or_404(result, model_id=model_id, response=response)
 
 @app.post("/models/{model_id}/run/", name="Run a model")
-async def run_model_from_config_only(model_id, model_configuration:ModelConfiguration):
-    return _run_model(model_id, model_configuration)
+async def run_model_from_config_only(model_id, model_configuration:ModelConfiguration, response:Response):
+    result =  _run_model(model_id, model_configuration)
+    return _result_or_404(result, model_id=model_id, response=response)
+    
+
+
 
 
 #######  Helper functions #######
@@ -66,8 +71,10 @@ def _run_model(model_id:str, model_configuration:ModelConfiguration):
     Return a list of Result objects
     """
     requested_model = get_model_instance(model_id)
-    requested_model.set_configuration(model_configuration)
-    return requested_model.get_result()
+    if requested_model is not None: 
+        requested_model.set_configuration(model_configuration)
+        return requested_model.get_result()
+    return None
 
 
 def _print_model_list(language:str):
@@ -91,4 +98,16 @@ def _print_model_list_json(language:str):
             "modelId" : model_id, 
             "modelName" : get_model_instance(model_id).get_model_name()
         }) 
-    return model_list
\ No newline at end of file
+    return model_list
+
+
+
+def _result_or_404(result, model_id:str, response:Response):
+    """
+    DRY
+    """
+    if result is not None:
+        return result
+    else:
+        response.status_code = status.HTTP_404_NOT_FOUND
+        return {"ERROR":"VIPS model with id=%s could not be found." % model_id}
\ No newline at end of file
-- 
GitLab