Skip to content

Commit 03f57d8

Browse files
author
Andrei Neagu
committed
applied #4963
1 parent 809a4d6 commit 03f57d8

File tree

5 files changed

+51
-1
lines changed

5 files changed

+51
-1
lines changed

services/director-v2/src/simcore_service_director_v2/api/routes/dynamic_scheduler.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from tenacity.stop import stop_after_delay
2323
from tenacity.wait import wait_random_exponential
2424

25+
from ...models.dynamic_services_scheduler import SchedulerData
2526
from ...modules.dynamic_sidecar.scheduler import DynamicSidecarsScheduler
2627
from ...utils.routes import NoContentResponse
2728
from ..dependencies.dynamic_sidecar import get_dynamic_sidecar_scheduler
@@ -121,6 +122,24 @@ async def _progress_callback(
121122
raise HTTPException(status.HTTP_409_CONFLICT, detail=f"{e}") from e
122123

123124

125+
@router.get(
126+
"/services/{node_uuid}/state",
127+
summary="Returns the internals of the scheduler for the given service",
128+
status_code=status.HTTP_200_OK,
129+
response_model=SchedulerData,
130+
)
131+
async def get_service_state(
132+
node_uuid: NodeID,
133+
dynamic_sidecars_scheduler: Annotated[
134+
DynamicSidecarsScheduler, Depends(get_dynamic_sidecar_scheduler)
135+
],
136+
):
137+
# pylint: disable=protected-access
138+
return dynamic_sidecars_scheduler._scheduler.get_scheduler_data(
139+
node_uuid
140+
) # noqa: SLF001
141+
142+
124143
@router.post(
125144
"/services/{node_uuid}/state:save",
126145
summary="Starts the saving of the state for the service",

services/director-v2/src/simcore_service_director_v2/cli/__init__.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from ..core.settings import AppSettings
1111
from ..meta import PROJECT_NAME
1212
from ._close_and_save_service import async_close_and_save_service
13-
from ._core import async_project_save_state, async_project_state
13+
from ._core import async_project_save_state, async_project_state, async_service_state
1414

1515
DEFAULT_NODE_SAVE_ATTEMPTS: Final[int] = 3
1616
DEFAULT_STATE_UPDATE_INTERVAL_S: Final[int] = 5
@@ -50,6 +50,14 @@ def project_state(
5050
asyncio.run(async_project_state(project_id, blocking, update_interval))
5151

5252

53+
@main.command()
54+
def service_state(node_id: NodeID):
55+
"""
56+
Prints the state of a services as tracked by director-v2
57+
"""
58+
asyncio.run(async_service_state(node_id))
59+
60+
5361
@main.command()
5462
def close_and_save_service(
5563
node_id: NodeID,

services/director-v2/src/simcore_service_director_v2/cli/_client.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,8 @@ async def delete_service_docker_resources(self, node_uuid: str) -> Response:
6060
return await self.client.delete(
6161
self._get_url(f"/services/{node_uuid}/docker-resources")
6262
)
63+
64+
@retry_on_errors
65+
@expect_status(status.HTTP_200_OK)
66+
async def get_service_state(self, node_uuid: str) -> Response:
67+
return await self.client.get(self._get_url(f"/services/{node_uuid}/state"))

services/director-v2/src/simcore_service_director_v2/cli/_core.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
from ..modules.dynamic_sidecar import api_client
3030
from ..modules.projects_networks import requires_dynamic_sidecar
3131
from ..utils.db import get_repository
32+
from ._client import ThinDV2LocalhostClient
3233

3334

3435
@asynccontextmanager
@@ -273,3 +274,9 @@ async def async_project_state(
273274
await _display(
274275
app, project_id, update_interval=update_interval, blocking=blocking
275276
)
277+
278+
279+
async def async_service_state(node_id: NodeID) -> None:
280+
thin_dv2_localhost_client = ThinDV2LocalhostClient()
281+
result = await thin_dv2_localhost_client.get_service_state(node_id)
282+
typer.echo(f"Service state: {result.text}")

services/director-v2/tests/unit/with_dbs/test_cli.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ async def mock_close_service_routes(
134134
respx_mock.post(
135135
re.compile(f"{regex_base}/state:save"), name="save_service_state"
136136
).respond(status_code=status.HTTP_202_ACCEPTED, json=task_id)
137+
respx_mock.get(
138+
re.compile(f"{regex_base}/state"), name="service_internal_state"
139+
).respond(status_code=status.HTTP_200_OK)
137140
respx_mock.post(
138141
re.compile(f"{regex_base}/outputs:push"), name="push_service_outputs"
139142
).respond(status_code=status.HTTP_202_ACCEPTED, json=task_id)
@@ -235,3 +238,11 @@ def test_close_and_save_service(
235238
result = cli_runner.invoke(main, ["close-and-save-service", f"{node_id}"])
236239
assert result.exit_code == os.EX_OK, _format_cli_error(result)
237240
print(result.stdout)
241+
242+
243+
def test_service_state(
244+
mock_close_service_routes: None, cli_runner: CliRunner, node_id: NodeID
245+
):
246+
result = cli_runner.invoke(main, ["service-state", f"{node_id}"])
247+
assert result.exit_code == os.EX_OK, _format_cli_error(result)
248+
print(result.stdout)

0 commit comments

Comments
 (0)