Skip to content

Commit 7a74839

Browse files
author
Andrei Neagu
committed
rerouted restart user services
1 parent 62f0089 commit 7a74839

File tree

12 files changed

+88
-29
lines changed

12 files changed

+88
-29
lines changed

packages/service-library/src/servicelib/rabbitmq/rpc_interfaces/dynamic_scheduler/services.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,19 @@ async def stop_dynamic_service(
9393
timeout_s=timeout_s,
9494
)
9595
assert result is None # nosec
96+
97+
98+
@log_decorator(_logger, level=logging.DEBUG)
99+
async def restart_user_services(
100+
rabbitmq_rpc_client: RabbitMQRPCClient,
101+
*,
102+
node_id: NodeID,
103+
timeout_s: NonNegativeInt,
104+
) -> None:
105+
result = await rabbitmq_rpc_client.request(
106+
DYNAMIC_SCHEDULER_RPC_NAMESPACE,
107+
_RPC_METHOD_NAME_ADAPTER.validate_python("restart_user_services"),
108+
node_id=node_id,
109+
timeout_s=timeout_s,
110+
)
111+
assert result is None # nosec

services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/api/rpc/_services.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,8 @@ async def stop_dynamic_service(
5656
return await scheduler_interface.stop_dynamic_service(
5757
app, dynamic_service_stop=dynamic_service_stop
5858
)
59+
60+
61+
@router.expose()
62+
async def restart_user_services(app: FastAPI, *, node_id: NodeID) -> None:
63+
await scheduler_interface.restart_user_services(app, node_id=node_id)

services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_public_client.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ async def list_tracked_dynamic_services(
108108
)
109109
return TypeAdapter(list[DynamicServiceGet]).validate_python(response.json())
110110

111+
async def restart_user_services(self, *, node_id: NodeID) -> None:
112+
await self.thin_client.post_restart(node_id=node_id)
113+
111114

112115
def setup_director_v2(app: FastAPI) -> None:
113116
public_client = DirectorV2Client(app)

services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/director_v2/_thin_client.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,3 +124,8 @@ async def get_dynamic_services(
124124
"/dynamic_services",
125125
params=as_dict_exclude_unset(user_id=user_id, project_id=project_id),
126126
)
127+
128+
@retry_on_errors()
129+
@expect_status(status.HTTP_204_NO_CONTENT)
130+
async def post_restart(self, *, node_id: NodeID) -> Response:
131+
return await self.client.post(f"/dynamic_services/{node_id}:restart")

services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/scheduler_interface.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,12 @@ async def stop_dynamic_service(
7373
)
7474

7575
await set_request_as_stopped(app, dynamic_service_stop)
76+
77+
78+
async def restart_user_services(app: FastAPI, *, node_id: NodeID) -> None:
79+
settings: ApplicationSettings = app.state.settings
80+
if settings.DYNAMIC_SCHEDULER_USE_INTERNAL_SCHEDULER:
81+
raise NotImplementedError
82+
83+
director_v2_client = DirectorV2Client.get_from_app_state(app)
84+
await director_v2_client.restart_user_services(node_id=node_id)

services/dynamic-scheduler/tests/unit/api_rpc/test_api_rpc__services.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,3 +490,25 @@ async def test_stop_dynamic_service_serializes_generic_errors(
490490
),
491491
timeout_s=5,
492492
)
493+
494+
495+
@pytest.fixture
496+
def mock_director_v2_restart_user_services(node_id: NodeID) -> Iterator[None]:
497+
with respx.mock(
498+
base_url="http://director-v2:8000/v2",
499+
assert_all_called=False,
500+
assert_all_mocked=True, # IMPORTANT: KEEP always True!
501+
) as mock:
502+
mock.post(f"/dynamic_services/{node_id}:restart").respond(
503+
status.HTTP_204_NO_CONTENT
504+
)
505+
506+
yield None
507+
508+
509+
async def test_restart_user_services(
510+
mock_director_v2_restart_user_services: None,
511+
rpc_client: RabbitMQRPCClient,
512+
node_id: NodeID,
513+
):
514+
await services.restart_user_services(rpc_client, node_id=node_id, timeout_s=5)

services/web/server/src/simcore_service_webserver/director_v2/_core_dynamic_services.py

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -65,24 +65,6 @@ async def request_retrieve_dyn_service(
6565
)
6666

6767

68-
@log_decorator(logger=_log)
69-
async def restart_dynamic_service(app: web.Application, node_uuid: str) -> None:
70-
"""Restarts the user service(s) started by the the node_uuid's sidecar
71-
72-
NOTE: this operation will NOT restart
73-
sidecar services (``dy-sidecar`` or ``dy-proxy`` services),
74-
but ONLY user services (the ones defined by the compose spec).
75-
"""
76-
settings: DirectorV2Settings = get_plugin_settings(app)
77-
await request_director_v2(
78-
app,
79-
"POST",
80-
url=settings.base_url / f"dynamic_services/{node_uuid}:restart",
81-
expected_status=web.HTTPOk,
82-
timeout=settings.DIRECTOR_V2_RESTART_DYNAMIC_SERVICE_TIMEOUT,
83-
)
84-
85-
8668
@log_decorator(logger=_log)
8769
async def update_dynamic_service_networks_in_project(
8870
app: web.Application, project_id: ProjectID

services/web/server/src/simcore_service_webserver/director_v2/api.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
from ._core_dynamic_services import (
2020
get_project_inactivity,
2121
request_retrieve_dyn_service,
22-
restart_dynamic_service,
2322
retrieve,
2423
update_dynamic_service_networks_in_project,
2524
)
@@ -39,7 +38,6 @@
3938
"is_healthy",
4039
"is_pipeline_running",
4140
"request_retrieve_dyn_service",
42-
"restart_dynamic_service",
4341
"retrieve",
4442
"set_project_run_policy",
4543
"stop_pipeline",

services/web/server/src/simcore_service_webserver/director_v2/settings.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,6 @@ def base_url(self) -> URL:
3333
# - Mostly in floats (aiohttp.Client/) but sometimes in ints
3434
# - Typically in seconds but occasionally in ms
3535

36-
DIRECTOR_V2_RESTART_DYNAMIC_SERVICE_TIMEOUT: PositiveInt = Field(
37-
1 * _MINUTE,
38-
description="timeout of containers restart",
39-
validation_alias=AliasChoices(
40-
"DIRECTOR_V2_RESTART_DYNAMIC_SERVICE_TIMEOUT",
41-
),
42-
)
43-
4436
DIRECTOR_V2_STORAGE_SERVICE_UPLOAD_DOWNLOAD_TIMEOUT: PositiveInt = Field(
4537
_HOUR,
4638
description=(

services/web/server/src/simcore_service_webserver/dynamic_scheduler/api.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,3 +148,20 @@ async def stop_dynamic_services_in_project(
148148
]
149149

150150
await logged_gather(*services_to_stop)
151+
152+
153+
async def restart_user_services(app: web.Application, *, node_id: NodeID) -> None:
154+
"""Restarts the user service(s) started by the the node_uuid's sidecar
155+
156+
NOTE: this operation will NOT restart
157+
sidecar services (``dy-sidecar`` or ``dy-proxy`` services),
158+
but ONLY user services (the ones defined by the compose spec).
159+
"""
160+
settings: DynamicSchedulerSettings = get_plugin_settings(app)
161+
await services.restart_user_services(
162+
get_rabbitmq_rpc_client(app),
163+
node_id=node_id,
164+
timeout_s=int(
165+
settings.DYNAMIC_SCHEDULER_RESTART_DYNAMIC_SERVICE_TIMEOUT.total_seconds()
166+
),
167+
)

0 commit comments

Comments
 (0)