11from dataclasses import dataclass
2- from typing import NamedTuple , overload
2+ from typing import overload
33
44import jsonschema
55from common_library .exclude import as_dict_exclude_none
4242
4343from ._service_jobs import JobService
4444from .models .api_resources import JobLinks
45+ from .models .domain .functions import PreRegisteredFunctionJobData
4546from .models .schemas .jobs import (
4647 JobInputs ,
4748 JobPricingSpecification ,
4849)
4950from .services_rpc .wb_api_server import WbApiRpcClient
5051
5152
52- class RegisteredFunctionJobData (NamedTuple ):
53- function_job_id : FunctionJobID
54- job_inputs : JobInputs
55-
56-
5753def join_inputs (
5854 default_inputs : FunctionInputs | None ,
5955 function_inputs : FunctionInputs | None ,
@@ -191,10 +187,15 @@ async def get_cached_function_job(
191187 self ,
192188 * ,
193189 function : RegisteredFunction ,
194- function_inputs : FunctionInputs ,
195190 job_inputs : JobInputs ,
196191 ) -> RegisteredFunctionJob :
197- """raises FunctionJobCacheNotFoundError if no cached job is found"""
192+ """
193+ N.B. this function checks access rights
194+
195+ raises FunctionsExecuteApiAccessDeniedError if user cannot execute functions
196+ raises FunctionJobCacheNotFoundError if no cached job is found
197+
198+ """
198199
199200 user_api_access_rights = (
200201 await self ._web_rpc_client .get_functions_user_api_access_rights (
@@ -234,13 +235,12 @@ async def get_cached_function_job(
234235
235236 raise FunctionJobCacheNotFoundError ()
236237
237- async def create_registered_function_job (
238+ async def pre_register_function_job (
238239 self ,
239240 * ,
240241 function : RegisteredFunction ,
241- function_inputs : FunctionInputs ,
242242 job_inputs : JobInputs ,
243- ) -> FunctionJobID :
243+ ) -> PreRegisteredFunctionJobData :
244244
245245 if function .input_schema is not None :
246246 is_valid , validation_str = await self .validate_function_inputs (
@@ -284,7 +284,10 @@ async def create_registered_function_job(
284284 function_class = function .function_class ,
285285 )
286286
287- return job .uid
287+ return PreRegisteredFunctionJobData (
288+ function_job_id = job .uid ,
289+ job_inputs = job_inputs ,
290+ )
288291
289292 @overload
290293 async def patch_registered_function_job (
@@ -368,8 +371,7 @@ async def run_function(
368371 * ,
369372 job_creation_task_id : TaskID | None ,
370373 function : RegisteredFunction ,
371- pre_registered_function_job_id : FunctionJobID ,
372- job_inputs : JobInputs ,
374+ pre_registered_function_job_data : PreRegisteredFunctionJobData ,
373375 pricing_spec : JobPricingSpecification | None ,
374376 job_links : JobLinks ,
375377 x_simcore_parent_project_uuid : NodeID | None ,
@@ -380,7 +382,7 @@ async def run_function(
380382 if function .function_class == FunctionClass .PROJECT :
381383 study_job = await self ._job_service .create_studies_job (
382384 study_id = function .project_id ,
383- job_inputs = job_inputs ,
385+ job_inputs = pre_registered_function_job_data . job_inputs ,
384386 hidden = True ,
385387 job_links = job_links ,
386388 x_simcore_parent_project_uuid = x_simcore_parent_project_uuid ,
@@ -394,7 +396,7 @@ async def run_function(
394396 return await self .patch_registered_function_job (
395397 user_id = self .user_id ,
396398 product_name = self .product_name ,
397- function_job_id = pre_registered_function_job_id ,
399+ function_job_id = pre_registered_function_job_data . function_job_id ,
398400 function_class = FunctionClass .PROJECT ,
399401 job_creation_task_id = job_creation_task_id ,
400402 project_job_id = study_job .id ,
@@ -404,7 +406,7 @@ async def run_function(
404406 solver_job = await self ._job_service .create_solver_job (
405407 solver_key = function .solver_key ,
406408 version = function .solver_version ,
407- inputs = job_inputs ,
409+ inputs = pre_registered_function_job_data . job_inputs ,
408410 job_links = job_links ,
409411 hidden = True ,
410412 x_simcore_parent_project_uuid = x_simcore_parent_project_uuid ,
@@ -419,7 +421,7 @@ async def run_function(
419421 return await self .patch_registered_function_job (
420422 user_id = self .user_id ,
421423 product_name = self .product_name ,
422- function_job_id = pre_registered_function_job_id ,
424+ function_job_id = pre_registered_function_job_data . function_job_id ,
423425 function_class = FunctionClass .SOLVER ,
424426 job_creation_task_id = job_creation_task_id ,
425427 solver_job_id = solver_job .id ,
@@ -434,7 +436,7 @@ async def map_function(
434436 * ,
435437 job_creation_task_id : TaskID | None ,
436438 function : RegisteredFunction ,
437- job_inputs : list [JobInputs ],
439+ pre_registered_function_job_data_list : list [PreRegisteredFunctionJobData ],
438440 job_links : JobLinks ,
439441 pricing_spec : JobPricingSpecification | None ,
440442 x_simcore_parent_project_uuid : ProjectID | None ,
@@ -445,16 +447,16 @@ async def map_function(
445447 await self .run_function (
446448 job_creation_task_id = job_creation_task_id ,
447449 function = function ,
448- job_inputs = inputs ,
450+ pre_registered_function_job_data = data ,
449451 pricing_spec = pricing_spec ,
450452 job_links = job_links ,
451453 x_simcore_parent_project_uuid = x_simcore_parent_project_uuid ,
452454 x_simcore_parent_node_id = x_simcore_parent_node_id ,
453455 )
454- for inputs in job_inputs
456+ for data in pre_registered_function_job_data_list
455457 ]
456458
457- function_job_collection_description = f"Function job collection of map of function { function .uid } with { len (job_inputs )} inputs"
459+ function_job_collection_description = f"Function job collection of map of function { function .uid } with { len (pre_registered_function_job_data_list )} inputs"
458460 return await self ._web_rpc_client .register_function_job_collection (
459461 function_job_collection = FunctionJobCollection (
460462 title = "Function job collection of function map" ,
0 commit comments