Skip to content

Commit 4e4ad60

Browse files
committed
added _get_node_lock_state method
1 parent 0ac9337 commit 4e4ad60

File tree

1 file changed

+51
-1
lines changed

1 file changed

+51
-1
lines changed

services/web/server/src/simcore_service_webserver/projects/_projects_service.py

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from common_library.json_serialization import json_dumps, json_loads
2424
from models_library.api_schemas_clusters_keeper.ec2_instances import EC2InstanceTypeGet
2525
from models_library.api_schemas_directorv2.dynamic_services import (
26+
DynamicServiceGet,
2627
GetProjectInactivityResponse,
2728
)
2829
from models_library.api_schemas_dynamic_scheduler.dynamic_services import (
@@ -34,14 +35,24 @@
3435
ProjectGet,
3536
ProjectPatch,
3637
)
38+
from models_library.api_schemas_webserver.projects_nodes import (
39+
NodeGet,
40+
NodeGetUnknown,
41+
)
3742
from models_library.basic_types import KeyIDStr
3843
from models_library.errors import ErrorDict
3944
from models_library.groups import GroupID
4045
from models_library.products import ProductName
4146
from models_library.projects import Project, ProjectID, ProjectTemplateType
4247
from models_library.projects import ProjectType as ProjectTypeAPI
4348
from models_library.projects_access import Owner
44-
from models_library.projects_nodes import Node, NodeState, PartialNode
49+
from models_library.projects_nodes import (
50+
Node,
51+
NodeLockReason,
52+
NodeLockState,
53+
NodeState,
54+
PartialNode,
55+
)
4556
from models_library.projects_nodes_io import NodeID, NodeIDStr, PortLink
4657
from models_library.projects_state import (
4758
ProjectRunningState,
@@ -1364,6 +1375,45 @@ async def is_node_id_present_in_any_project_workbench(
13641375
return await db.node_id_exists(node_id)
13651376

13661377

1378+
async def _get_node_lock_state(
1379+
app: web.Application, *, user_id: UserID, project_uuid: ProjectID, node_id: NodeID
1380+
) -> NodeLockState:
1381+
node = await _projects_nodes_repository.get(
1382+
app, project_id=project_uuid, node_id=node_id
1383+
)
1384+
1385+
if _is_node_dynamic(node.key):
1386+
# if the service is dynamic and running it is locked
1387+
service = await dynamic_scheduler_service.get_dynamic_service(
1388+
app, node_id=node_id
1389+
)
1390+
1391+
if isinstance(service, DynamicServiceGet | NodeGet):
1392+
# service is running
1393+
return NodeLockState(
1394+
is_locked=True,
1395+
locked_by=await users_service.get_user_primary_group_id(
1396+
app, TypeAdapter(UserID).validate_python(service.user_id)
1397+
),
1398+
locked_reason=NodeLockReason.OPENED,
1399+
)
1400+
if isinstance(service, NodeGetUnknown):
1401+
# service state is unknown
1402+
# we should raise an exception here
1403+
msg = "Node state is unknown"
1404+
raise RuntimeError(msg)
1405+
return NodeLockState(is_locked=False)
1406+
1407+
# if the service is computational and no pipeline is running it is not locked
1408+
if await director_v2_service.is_pipeline_running(app, user_id, project_uuid):
1409+
return NodeLockState(
1410+
is_locked=True,
1411+
locked_by=await users_service.get_user_primary_group_id(app, user_id),
1412+
locked_reason=NodeLockReason.OPENED,
1413+
)
1414+
return NodeLockState(is_locked=False)
1415+
1416+
13671417
async def _safe_retrieve(
13681418
app: web.Application, node_id: NodeID, port_keys: list[str]
13691419
) -> None:

0 commit comments

Comments
 (0)