Skip to content

Commit b81f5b2

Browse files
fix: node creation
1 parent 790feaf commit b81f5b2

File tree

4 files changed

+74
-54
lines changed

4 files changed

+74
-54
lines changed

packages/models-library/src/models_library/projects_nodes.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,10 @@ class Node(BaseModel):
269269
Field(default_factory=NodeState, description="The node's state object"),
270270
] = DEFAULT_FACTORY
271271

272+
required_resources: Annotated[
273+
dict[str, Any] | None, Field(default_factory=dict)
274+
] = DEFAULT_FACTORY
275+
272276
boot_options: Annotated[
273277
dict[EnvVarKey, str] | None,
274278
Field(

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,24 @@
4343
]
4444

4545

46+
async def add(
47+
app: web.Application,
48+
connection: AsyncConnection | None = None,
49+
*,
50+
project_id: ProjectID,
51+
node_id: NodeID,
52+
node: Node,
53+
) -> None:
54+
values = node.model_dump(mode="json", exclude_none=True, exclude_unset=True)
55+
56+
async with transaction_context(get_asyncpg_engine(app), connection) as conn:
57+
await conn.execute(
58+
projects_nodes.insert().values(
59+
project_uuid=f"{project_id}", node_id=f"{node_id}", **values
60+
)
61+
)
62+
63+
4664
async def delete(
4765
app: web.Application,
4866
connection: AsyncConnection | None = None,

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

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@
9292
from servicelib.utils import fire_and_forget_task, limited_gather, logged_gather
9393
from simcore_postgres_database.models.users import UserRole
9494
from simcore_postgres_database.utils_projects_nodes import (
95-
ProjectNodeCreate,
9695
ProjectNodesNodeNotFoundError,
9796
)
9897
from simcore_postgres_database.webserver_models import ProjectType
@@ -169,6 +168,30 @@
169168
_logger = logging.getLogger(__name__)
170169

171170

171+
async def _create_project_document_and_notify(
172+
app,
173+
*,
174+
project_id: ProjectID,
175+
user_id: UserID,
176+
client_session_id: ClientSessionID | None,
177+
):
178+
(
179+
project_document,
180+
document_version,
181+
) = await create_project_document_and_increment_version(app, project_id)
182+
183+
user_primary_gid = await users_service.get_user_primary_group_id(app, user_id)
184+
185+
await notify_project_document_updated(
186+
app=app,
187+
project_id=project_id,
188+
user_primary_gid=user_primary_gid,
189+
client_session_id=client_session_id,
190+
version=document_version,
191+
document=project_document,
192+
)
193+
194+
172195
async def patch_project_and_notify_users(
173196
app: web.Application,
174197
*,
@@ -937,26 +960,23 @@ async def add_project_node(
937960
default_resources = await catalog_service.get_service_resources(
938961
request.app, user_id, service_key, service_version
939962
)
940-
db_legacy: ProjectDBAPI = ProjectDBAPI.get_from_app_context(request.app)
941-
assert db_legacy # nosec
942-
await db_legacy.add_project_node(
943-
user_id,
944-
ProjectID(project["uuid"]),
945-
ProjectNodeCreate(
946-
node_id=node_uuid,
947-
required_resources=jsonable_encoder(default_resources),
963+
964+
await _projects_nodes_repository.add(
965+
request.app,
966+
project_id=ProjectID(project["uuid"]),
967+
node_id=node_uuid,
968+
node=Node(
948969
key=service_key,
949970
version=service_version,
950971
label=service_key.split("/")[-1],
972+
required_resources=jsonable_encoder(default_resources),
951973
),
952-
Node.model_validate(
953-
{
954-
"key": service_key,
955-
"version": service_version,
956-
"label": service_key.split("/")[-1],
957-
}
958-
),
959-
product_name,
974+
)
975+
976+
await _create_project_document_and_notify(
977+
request.app,
978+
project_id=ProjectID(project["uuid"]),
979+
user_id=user_id,
960980
client_session_id=client_session_id,
961981
)
962982

@@ -1094,6 +1114,13 @@ async def delete_project_node(
10941114
node_id=NodeID(node_uuid),
10951115
)
10961116

1117+
await _create_project_document_and_notify(
1118+
request.app,
1119+
project_id=project_uuid,
1120+
user_id=user_id,
1121+
client_session_id=client_session_id,
1122+
)
1123+
10971124
# also ensure the project is updated by director-v2 since services
10981125
product_name = products_web.get_product_name(request)
10991126
await director_v2_service.create_or_update_pipeline(
@@ -1103,24 +1130,6 @@ async def delete_project_node(
11031130
request.app, project_id=project_uuid
11041131
)
11051132

1106-
(
1107-
project_document,
1108-
document_version,
1109-
) = await create_project_document_and_increment_version(request.app, project_uuid)
1110-
1111-
user_primary_gid = await users_service.get_user_primary_group_id(
1112-
request.app, user_id
1113-
)
1114-
1115-
await notify_project_document_updated(
1116-
app=request.app,
1117-
project_id=project_uuid,
1118-
user_primary_gid=user_primary_gid,
1119-
client_session_id=client_session_id,
1120-
version=document_version,
1121-
document=project_document,
1122-
)
1123-
11241133

11251134
async def update_project_linked_product(
11261135
app: web.Application, project_id: ProjectID, product_name: str
@@ -1249,20 +1258,11 @@ async def patch_project_node(
12491258
partial_node=partial_node,
12501259
)
12511260

1252-
(
1253-
project_document,
1254-
document_version,
1255-
) = await create_project_document_and_increment_version(app, project_id)
1256-
1257-
user_primary_gid = await users_service.get_user_primary_group_id(app, user_id)
1258-
1259-
await notify_project_document_updated(
1260-
app=app,
1261+
await _create_project_document_and_notify(
1262+
app,
12611263
project_id=project_id,
1262-
user_primary_gid=user_primary_gid,
1264+
user_id=user_id,
12631265
client_session_id=client_session_id,
1264-
version=document_version,
1265-
document=project_document,
12661266
)
12671267

12681268
# 4. Make calls to director-v2 to keep data in sync (ex. comp_* DB tables)

services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handler.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -371,16 +371,14 @@ async def test_create_node(
371371

372372
# check database is updated
373373
assert "node_id" in data
374-
create_node_id = data["node_id"]
374+
node_id = data["node_id"]
375375
with postgres_db.connect() as conn:
376376
result = conn.execute(
377-
sa.select(projects_db_model.c.workbench).where(
378-
projects_db_model.c.uuid == user_project["uuid"]
379-
)
377+
sa.select(sa.literal(1))
378+
.where(projects_nodes.c.node_id == node_id)
379+
.limit(1)
380380
)
381-
assert result
382-
workbench = result.one()[projects_db_model.c.workbench]
383-
assert create_node_id in workbench
381+
assert result.scalar() is not None
384382
else:
385383
assert error
386384

0 commit comments

Comments
 (0)