Skip to content

Commit 4275912

Browse files
Merge branch 'master' into is8159/fix-redis-client-lifecycle
2 parents 7618c5e + 59febda commit 4275912

File tree

45 files changed

+1139
-643
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1139
-643
lines changed

packages/dask-task-models-library/src/dask_task_models_library/plugins/task_life_cycle_worker_plugin.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def transition(
3434
):
3535
_logger.info("Task '%s' transition from %s to %s", key, start, finish)
3636
assert self._worker # nosec
37+
assert isinstance(self._worker, Worker) # nosec
3738
self._worker.log_event(
3839
TASK_LIFE_CYCLE_EVENT.format(key=key),
3940
TaskLifeCycleState.from_worker_task_state(

packages/pytest-simcore/src/pytest_simcore/pydantic_models.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ def _is_model_cls(obj) -> bool:
9797
assert inspect.ismodule(module)
9898

9999
for model_name, model_cls in inspect.getmembers(module, _is_model_cls):
100-
101100
yield from iter_model_examples_in_class(model_cls, model_name)
102101

103102

@@ -172,7 +171,7 @@ def model_cls_examples(model_cls: type[BaseModel]) -> dict[str, dict[str, Any]]:
172171
"""
173172
warnings.warn(
174173
"The 'model_cls_examples' fixture is deprecated and will be removed in a future version. "
175-
"Please use 'iter_model_example_in_class' or 'iter_model_examples_in_module' as an alternative.",
174+
"Please use 'iter_model_examples_in_class' or 'iter_model_examples_in_module' as an alternative.",
176175
DeprecationWarning,
177176
stacklevel=2,
178177
)

packages/service-library/src/servicelib/rabbitmq/rpc_interfaces/webserver/functions/functions_rpc_interface.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
from typing import Literal
23

34
from models_library.api_schemas_webserver import WEBSERVER_RPC_NAMESPACE
45
from models_library.api_schemas_webserver.functions import (
@@ -18,6 +19,7 @@
1819
)
1920
from models_library.functions import (
2021
FunctionClass,
22+
FunctionGroupAccessRights,
2123
FunctionJobStatus,
2224
FunctionOutputs,
2325
FunctionUserAccessRights,
@@ -418,6 +420,7 @@ async def update_function_job_status(
418420
product_name: ProductName,
419421
function_job_id: FunctionJobID,
420422
job_status: FunctionJobStatus,
423+
check_write_permissions: bool = True,
421424
) -> FunctionJobStatus:
422425
result = await rabbitmq_rpc_client.request(
423426
WEBSERVER_RPC_NAMESPACE,
@@ -426,6 +429,7 @@ async def update_function_job_status(
426429
job_status=job_status,
427430
user_id=user_id,
428431
product_name=product_name,
432+
check_write_permissions=check_write_permissions,
429433
)
430434
return TypeAdapter(FunctionJobStatus).validate_python(result)
431435

@@ -438,6 +442,7 @@ async def update_function_job_outputs(
438442
product_name: ProductName,
439443
function_job_id: FunctionJobID,
440444
outputs: FunctionOutputs,
445+
check_write_permissions: bool = True,
441446
) -> FunctionOutputs:
442447
result = await rabbitmq_rpc_client.request(
443448
WEBSERVER_RPC_NAMESPACE,
@@ -446,6 +451,7 @@ async def update_function_job_outputs(
446451
outputs=outputs,
447452
user_id=user_id,
448453
product_name=product_name,
454+
check_write_permissions=check_write_permissions,
449455
)
450456
return TypeAdapter(FunctionOutputs).validate_python(result)
451457

@@ -578,3 +584,37 @@ async def get_functions_user_api_access_rights(
578584
product_name=product_name,
579585
)
580586
return TypeAdapter(FunctionUserApiAccessRights).validate_python(result)
587+
588+
589+
@log_decorator(_logger, level=logging.DEBUG)
590+
async def set_group_permissions(
591+
rabbitmq_rpc_client: RabbitMQRPCClient,
592+
*,
593+
user_id: UserID,
594+
product_name: ProductName,
595+
object_type: Literal["function", "function_job", "function_job_collection"],
596+
object_ids: list[FunctionID | FunctionJobID | FunctionJobCollectionID],
597+
permission_group_id: int,
598+
read: bool | None = None,
599+
write: bool | None = None,
600+
execute: bool | None = None,
601+
) -> list[
602+
tuple[
603+
FunctionID | FunctionJobID | FunctionJobCollectionID, FunctionGroupAccessRights
604+
]
605+
]:
606+
result = await rabbitmq_rpc_client.request(
607+
WEBSERVER_RPC_NAMESPACE,
608+
TypeAdapter(RPCMethodName).validate_python("set_group_permissions"),
609+
user_id=user_id,
610+
product_name=product_name,
611+
object_type=object_type,
612+
object_ids=object_ids,
613+
permission_group_id=permission_group_id,
614+
read=read,
615+
write=write,
616+
execute=execute,
617+
)
618+
return TypeAdapter(
619+
list[tuple[FunctionID | FunctionJobID, FunctionGroupAccessRights]]
620+
).validate_python(result)

services/api-server/src/simcore_service_api_server/_service_function_jobs.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ async def inspect_function_job(
203203
user_id=self.user_id,
204204
product_name=self.product_name,
205205
job_status=new_job_status,
206+
check_write_permissions=False,
206207
)
207208

208209
async def create_function_job_inputs( # pylint: disable=no-self-use
@@ -529,4 +530,5 @@ async def function_job_outputs(
529530
user_id=user_id,
530531
product_name=product_name,
531532
outputs=new_outputs,
533+
check_write_permissions=False,
532534
)

services/api-server/src/simcore_service_api_server/api/routes/functions_routes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ async def _run_single_function(function_inputs: FunctionInputs) -> FunctionJobID
474474
for function_inputs in function_inputs_list
475475
],
476476
reraise=False,
477-
limit=10,
477+
limit=1,
478478
)
479479

480480
# Check if any tasks raised exceptions and raise the first one found

services/api-server/src/simcore_service_api_server/services_rpc/wb_api_server.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,13 +587,15 @@ async def update_function_job_status(
587587
user_id: UserID,
588588
product_name: ProductName,
589589
job_status: FunctionJobStatus,
590+
check_write_permissions: bool = True,
590591
) -> FunctionJobStatus:
591592
return await functions_rpc_interface.update_function_job_status(
592593
self._client,
593594
function_job_id=function_job_id,
594595
user_id=user_id,
595596
product_name=product_name,
596597
job_status=job_status,
598+
check_write_permissions=check_write_permissions,
597599
)
598600

599601
async def update_function_job_outputs(
@@ -603,13 +605,15 @@ async def update_function_job_outputs(
603605
user_id: UserID,
604606
product_name: ProductName,
605607
outputs: FunctionOutputs,
608+
check_write_permissions: bool = True,
606609
) -> FunctionOutputs:
607610
return await functions_rpc_interface.update_function_job_outputs(
608611
self._client,
609612
function_job_id=function_job_id,
610613
user_id=user_id,
611614
product_name=product_name,
612615
outputs=outputs,
616+
check_write_permissions=check_write_permissions,
613617
)
614618

615619
async def find_cached_function_jobs(

services/director-v2/src/simcore_service_director_v2/core/settings.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,14 @@ class ComputationalBackendSettings(BaseCustomSettings):
9999
),
100100
] = datetime.timedelta(minutes=10)
101101

102+
COMPUTATIONAL_BACKEND_MAX_WAITING_FOR_RETRIEVING_RESULTS: Annotated[
103+
datetime.timedelta,
104+
Field(
105+
description="maximum time the computational scheduler waits until retrieving results from the computational backend is failed"
106+
"(default to seconds, or see https://pydantic-docs.helpmanual.io/usage/types/#datetime-types for string formatting)."
107+
),
108+
] = datetime.timedelta(minutes=10)
109+
102110
@cached_property
103111
def default_cluster(self) -> BaseCluster:
104112
return BaseCluster(

services/director-v2/src/simcore_service_director_v2/models/comp_run_snapshot_tasks.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,21 @@
1+
from contextlib import suppress
12
from datetime import datetime
23
from typing import Annotated, Any
34

45
from models_library.projects import ProjectID
56
from models_library.projects_nodes_io import NodeID
67
from models_library.projects_state import RunningState
78
from models_library.resource_tracker import HardwareInfo
8-
from pydantic import BaseModel, BeforeValidator, ConfigDict, PositiveInt
9+
from pydantic import (
10+
BaseModel,
11+
BeforeValidator,
12+
ConfigDict,
13+
PositiveInt,
14+
field_validator,
15+
)
16+
from simcore_postgres_database.models.comp_pipeline import StateType
917

18+
from ..utils.db import DB_TO_RUNNING_STATE
1019
from .comp_tasks import BaseCompTaskAtDB, Image
1120

1221

@@ -100,3 +109,15 @@ class CompRunSnapshotTaskDBGet(BaseModel):
100109
started_at: datetime | None
101110
ended_at: datetime | None
102111
iteration: PositiveInt
112+
113+
@field_validator("state", mode="before")
114+
@classmethod
115+
def convert_result_from_state_type_enum_if_needed(cls, v):
116+
if isinstance(v, str):
117+
# try to convert to a StateType, if it fails the validations will continue
118+
# and pydantic will try to convert it to a RunninState later on
119+
with suppress(ValueError):
120+
v = StateType(v)
121+
if isinstance(v, StateType):
122+
return RunningState(DB_TO_RUNNING_STATE[StateType(v)])
123+
return v

0 commit comments

Comments
 (0)