1+ from logging import getLogger
12from typing import Annotated , Final
23
4+ from common_library .error_codes import create_error_code
35from fastapi import APIRouter , Depends , FastAPI , HTTPException , status
46from fastapi_pagination .api import create_page
57from fastapi_pagination .bases import AbstractPage
1517from models_library .functions import RegisteredFunction
1618from models_library .functions_errors import (
1719 UnsupportedFunctionClassError ,
20+ UnsupportedFunctionFunctionJobClassCombinationError ,
1821)
1922from models_library .products import ProductName
2023from models_library .users import UserID
24+ from servicelib .celery .models import TaskUUID
2125from servicelib .fastapi .dependencies import get_app
26+ from servicelib .logging_errors import create_troubleshootting_log_kwargs
2227from simcore_service_api_server .models .schemas .functions_filters import (
2328 FunctionJobsListFilters ,
2429)
2530from sqlalchemy .ext .asyncio import AsyncEngine
2631
2732from ..._service_function_jobs import FunctionJobService
2833from ..._service_jobs import JobService
34+ from ...exceptions .function_errors import FunctionJobProjectMissingError
2935from ...models .pagination import Page , PaginationParams
3036from ...models .schemas .errors import ErrorGet
3137from ...services_http .storage import StorageApi
3238from ...services_http .webserver import AuthSession
3339from ...services_rpc .wb_api_server import WbApiRpcClient
3440from ..dependencies .authentication import get_current_user_id , get_product_name
41+ from ..dependencies .celery import get_task_manager
3542from ..dependencies .database import get_db_asyncpg_engine
3643from ..dependencies .functions import (
3744 get_function_from_functionjob ,
5259 FMSG_CHANGELOG_NEW_IN_VERSION ,
5360 create_route_description ,
5461)
62+ from .tasks import _get_task_filter
63+
64+ _logger = getLogger (__name__ )
5565
5666# pylint: disable=too-many-arguments
5767# pylint: disable=cyclic-import
@@ -196,6 +206,9 @@ async def delete_function_job(
196206 ),
197207)
198208async def function_job_status (
209+ app : Annotated [FastAPI , Depends (get_app )],
210+ user_id : Annotated [UserID , Depends (get_current_user_id )],
211+ product_name : Annotated [ProductName , Depends (get_product_name )],
199212 function_job : Annotated [
200213 RegisteredFunctionJob , Depends (get_function_job_dependency )
201214 ],
@@ -204,10 +217,46 @@ async def function_job_status(
204217 FunctionJobService , Depends (get_function_job_service )
205218 ],
206219) -> FunctionJobStatus :
220+ try :
221+ return await function_job_service .inspect_function_job (
222+ function = function , function_job = function_job
223+ )
224+ except FunctionJobProjectMissingError as exc :
225+ if (
226+ function .function_class == FunctionClass .PROJECT
227+ and function_job .function_class == FunctionClass .PROJECT
228+ ) or (
229+ function .function_class == FunctionClass .SOLVER
230+ and function_job .function_class == FunctionClass .SOLVER
231+ ):
232+ if task_id := function_job .job_creation_task_id :
233+ task_manager = get_task_manager (app )
234+ task_filter = _get_task_filter (user_id , product_name )
235+ task_status = await task_manager .get_task_status (
236+ task_uuid = TaskUUID (task_id ), task_filter = task_filter
237+ )
238+ return FunctionJobStatus (
239+ status = f"JOB_CREATION_TASK_STATUS_{ task_status .task_state } "
240+ )
241+ user_error_msg = f"The creation of job { function_job .uid } failed"
242+ support_id = create_error_code (Exception ())
243+ _logger .exception (
244+ ** create_troubleshootting_log_kwargs (
245+ user_error_msg ,
246+ error = Exception (),
247+ error_code = support_id ,
248+ tip = "Initial call to run metamodeling function must have failed" ,
249+ )
250+ )
251+ raise HTTPException (
252+ status_code = status .HTTP_500_INTERNAL_SERVER_ERROR ,
253+ detail = "Function job is not in a valid state" ,
254+ ) from exc
207255
208- return await function_job_service .inspect_function_job (
209- function = function , function_job = function_job
210- )
256+ raise UnsupportedFunctionFunctionJobClassCombinationError (
257+ function_class = function .function_class ,
258+ function_job_class = function_job .function_class ,
259+ )
211260
212261
213262async def get_function_from_functionjobid (
0 commit comments