99 FunctionInputs ,
1010 FunctionJobCollectionID ,
1111 FunctionJobID ,
12- FunctionJobStatus ,
13- FunctionOutputs ,
1412 FunctionSchemaClass ,
1513 ProjectFunctionJob ,
1614 RegisteredFunction ,
1715 RegisteredFunctionJob ,
1816 RegisteredFunctionJobPatch ,
19- RegisteredFunctionJobWithStatus ,
2017 RegisteredProjectFunctionJobPatch ,
2118 RegisteredSolverFunctionJobPatch ,
2219 SolverFunctionJob ,
2320 SolverJobID ,
2421 TaskID ,
2522)
2623from models_library .functions_errors import (
27- FunctionExecuteAccessDeniedError ,
2824 FunctionInputsValidationError ,
29- FunctionsExecuteApiAccessDeniedError ,
3025 UnsupportedFunctionClassError ,
31- UnsupportedFunctionFunctionJobClassCombinationError ,
3226)
3327from models_library .products import ProductName
3428from models_library .projects import ProjectID
3529from models_library .projects_nodes_io import NodeID
36- from models_library .projects_state import RunningState
3730from models_library .rest_pagination import PageMetaInfoLimitOffset , PageOffsetInt
3831from models_library .rpc_pagination import PageLimitInt
3932from models_library .users import UserID
4033from pydantic import ValidationError
4134from simcore_service_api_server ._service_functions import FunctionService
4235from simcore_service_api_server .services_rpc .storage import StorageService
43- from sqlalchemy .ext .asyncio import AsyncEngine
4436
4537from ._service_jobs import JobService
46- from .exceptions .function_errors import (
47- FunctionJobCacheNotFoundError ,
48- FunctionJobProjectMissingError ,
49- )
5038from .models .api_resources import JobLinks
5139from .models .domain .functions import PreRegisteredFunctionJobData
5240from .models .schemas .jobs import JobInputs , JobPricingSpecification
@@ -102,33 +90,6 @@ async def list_function_jobs(
10290 ** pagination_kwargs ,
10391 )
10492
105- async def list_function_jobs_with_status (
106- self ,
107- * ,
108- filter_by_function_id : FunctionID | None = None ,
109- filter_by_function_job_ids : list [FunctionJobID ] | None = None ,
110- filter_by_function_job_collection_id : FunctionJobCollectionID | None = None ,
111- pagination_offset : PageOffsetInt | None = None ,
112- pagination_limit : PageLimitInt | None = None ,
113- ) -> tuple [
114- list [RegisteredFunctionJobWithStatus ],
115- PageMetaInfoLimitOffset ,
116- ]:
117- """Lists all function jobs for a user with pagination"""
118-
119- pagination_kwargs = as_dict_exclude_none (
120- pagination_offset = pagination_offset , pagination_limit = pagination_limit
121- )
122-
123- return await self ._web_rpc_client .list_function_jobs_with_status (
124- user_id = self .user_id ,
125- product_name = self .product_name ,
126- filter_by_function_id = filter_by_function_id ,
127- filter_by_function_job_ids = filter_by_function_job_ids ,
128- filter_by_function_job_collection_id = filter_by_function_job_collection_id ,
129- ** pagination_kwargs ,
130- )
131-
13293 async def validate_function_inputs (
13394 self , * , function_id : FunctionID , inputs : FunctionInputs
13495 ) -> tuple [bool , str ]:
@@ -158,54 +119,6 @@ async def validate_function_inputs(
158119 f"Unsupported function schema class { function .input_schema .schema_class } " ,
159120 )
160121
161- async def inspect_function_job (
162- self , function : RegisteredFunction , function_job : RegisteredFunctionJob
163- ) -> FunctionJobStatus :
164- """Raises FunctionJobProjectNotRegisteredError if no project is associated with job"""
165- stored_job_status = await self ._web_rpc_client .get_function_job_status (
166- function_job_id = function_job .uid ,
167- user_id = self .user_id ,
168- product_name = self .product_name ,
169- )
170-
171- if stored_job_status .status in (RunningState .SUCCESS , RunningState .FAILED ):
172- return stored_job_status
173-
174- if (
175- function .function_class == FunctionClass .PROJECT
176- and function_job .function_class == FunctionClass .PROJECT
177- ):
178- if function_job .project_job_id is None :
179- raise FunctionJobProjectMissingError
180- job_status = await self ._job_service .inspect_study_job (
181- job_id = function_job .project_job_id ,
182- )
183- elif (function .function_class == FunctionClass .SOLVER ) and (
184- function_job .function_class == FunctionClass .SOLVER
185- ):
186- if function_job .solver_job_id is None :
187- raise FunctionJobProjectMissingError
188- job_status = await self ._job_service .inspect_solver_job (
189- solver_key = function .solver_key ,
190- version = function .solver_version ,
191- job_id = function_job .solver_job_id ,
192- )
193- else :
194- raise UnsupportedFunctionFunctionJobClassCombinationError (
195- function_class = function .function_class ,
196- function_job_class = function_job .function_class ,
197- )
198-
199- new_job_status = FunctionJobStatus (status = job_status .state )
200-
201- return await self ._web_rpc_client .update_function_job_status (
202- function_job_id = function_job .uid ,
203- user_id = self .user_id ,
204- product_name = self .product_name ,
205- job_status = new_job_status ,
206- check_write_permissions = False ,
207- )
208-
209122 async def create_function_job_inputs ( # pylint: disable=no-self-use
210123 self ,
211124 * ,
@@ -220,58 +133,6 @@ async def create_function_job_inputs( # pylint: disable=no-self-use
220133 values = joined_inputs or {},
221134 )
222135
223- async def get_cached_function_job (
224- self ,
225- * ,
226- function : RegisteredFunction ,
227- job_inputs : JobInputs ,
228- ) -> RegisteredFunctionJob :
229- """
230- N.B. this function checks access rights
231-
232- raises FunctionsExecuteApiAccessDeniedError if user cannot execute functions
233- raises FunctionJobCacheNotFoundError if no cached job is found
234-
235- """
236-
237- user_api_access_rights = (
238- await self ._web_rpc_client .get_functions_user_api_access_rights (
239- user_id = self .user_id , product_name = self .product_name
240- )
241- )
242- if not user_api_access_rights .execute_functions :
243- raise FunctionsExecuteApiAccessDeniedError (
244- user_id = self .user_id ,
245- function_id = function .uid ,
246- )
247-
248- user_permissions = await self ._web_rpc_client .get_function_user_permissions (
249- function_id = function .uid ,
250- user_id = self .user_id ,
251- product_name = self .product_name ,
252- )
253- if not user_permissions .execute :
254- raise FunctionExecuteAccessDeniedError (
255- user_id = self .user_id ,
256- function_id = function .uid ,
257- )
258-
259- if cached_function_jobs := await self ._web_rpc_client .find_cached_function_jobs (
260- function_id = function .uid ,
261- inputs = job_inputs .values ,
262- user_id = self .user_id ,
263- product_name = self .product_name ,
264- ):
265- for cached_function_job in cached_function_jobs :
266- job_status = await self .inspect_function_job (
267- function = function ,
268- function_job = cached_function_job ,
269- )
270- if job_status .status == RunningState .SUCCESS :
271- return cached_function_job
272-
273- raise FunctionJobCacheNotFoundError
274-
275136 async def pre_register_function_job (
276137 self ,
277138 * ,
@@ -466,69 +327,3 @@ async def run_function(
466327 raise UnsupportedFunctionClassError (
467328 function_class = function .function_class ,
468329 )
469-
470- async def function_job_outputs (
471- self ,
472- * ,
473- function : RegisteredFunction ,
474- function_job : RegisteredFunctionJob ,
475- user_id : UserID ,
476- product_name : ProductName ,
477- stored_job_outputs : FunctionOutputs | None ,
478- async_pg_engine : AsyncEngine ,
479- ) -> FunctionOutputs :
480-
481- if stored_job_outputs is not None :
482- return stored_job_outputs
483-
484- try :
485- job_status = await self .inspect_function_job (
486- function = function ,
487- function_job = function_job ,
488- )
489- except FunctionJobProjectMissingError :
490- return None
491-
492- if job_status .status != RunningState .SUCCESS :
493- return None
494-
495- if (
496- function .function_class == FunctionClass .PROJECT
497- and function_job .function_class == FunctionClass .PROJECT
498- ):
499- if function_job .project_job_id is None :
500- return None
501- new_outputs = dict (
502- (
503- await self ._job_service .get_study_job_outputs (
504- study_id = function .project_id ,
505- job_id = function_job .project_job_id ,
506- )
507- ).results
508- )
509- elif (
510- function .function_class == FunctionClass .SOLVER
511- and function_job .function_class == FunctionClass .SOLVER
512- ):
513- if function_job .solver_job_id is None :
514- return None
515- new_outputs = dict (
516- (
517- await self ._job_service .get_solver_job_outputs (
518- solver_key = function .solver_key ,
519- version = function .solver_version ,
520- job_id = function_job .solver_job_id ,
521- async_pg_engine = async_pg_engine ,
522- )
523- ).results
524- )
525- else :
526- raise UnsupportedFunctionClassError (function_class = function .function_class )
527-
528- return await self ._web_rpc_client .update_function_job_outputs (
529- function_job_id = function_job .uid ,
530- user_id = user_id ,
531- product_name = product_name ,
532- outputs = new_outputs ,
533- check_write_permissions = False ,
534- )
0 commit comments