Skip to content

Commit e2e75c2

Browse files
author
Andrei Neagu
committed
Merge remote-tracking branch 'upstream/master' into pr-osparc-add-dybamic-services-monitor-dashboard2
2 parents 1ad36bf + 5732a12 commit e2e75c2

File tree

1 file changed

+32
-18
lines changed
  • services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/api/ui

1 file changed

+32
-18
lines changed

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

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
1-
import asyncio
1+
import logging
2+
from asyncio import Task
3+
from datetime import timedelta
24
from typing import Annotated, Any, Final
35

46
from fastapi import APIRouter, Depends, FastAPI
57
from fastapi.responses import StreamingResponse
68
from fastui import AnyComponent, FastUI
79
from fastui import components as c
810
from fastui.events import PageEvent
11+
from servicelib.background_task import start_periodic_task, stop_periodic_task
912
from servicelib.fastapi.app_state import SingletonInAppStateMixin
1013
from starlette import status
1114

15+
from ...services.service_tracker import get_all_tracked_services
1216
from ..dependencies import get_app
1317
from ._constants import API_ROOT_PATH
1418
from ._sse_utils import (
@@ -17,6 +21,8 @@
1721
update_renderer_items,
1822
)
1923

24+
_logger = logging.getLogger(__name__)
25+
2026
_PREFIX: Final[str] = "/services"
2127

2228
router = APIRouter()
@@ -72,38 +78,46 @@ async def not_found():
7278
return {"message": "Not Found"}
7379

7480

75-
class MockMessagesProvider(SingletonInAppStateMixin):
76-
app_state_name: str = "mock_messages_provider"
81+
class ServicesStatusRetriever(SingletonInAppStateMixin):
82+
app_state_name: str = "services_status_retriever"
7783

78-
def __init__(self, app: FastAPI) -> None:
84+
def __init__(self, app: FastAPI, poll_interval: timedelta) -> None:
7985
self.app = app
80-
self._task: asyncio.Task | None = None
86+
self.poll_interval = poll_interval
87+
88+
self._task: Task | None = None
8189

82-
async def _publish_mock_data(self) -> None:
83-
messages: list[Any] = []
84-
while True:
85-
await asyncio.sleep(3)
90+
async def _task_service_state_retrieval(self) -> None:
91+
all_tracked_services = await get_all_tracked_services(self.app)
8692

87-
messages.append({"name": "a", "surname": "b"})
88-
await update_renderer_items(
89-
self.app, renderer_type=ServicesSSERenderer, items=messages
90-
)
93+
items = sorted(all_tracked_services.items(), reverse=True)
94+
_logger.error(f"PROPAGATING: {items=}")
95+
await update_renderer_items(
96+
self.app, renderer_type=ServicesSSERenderer, items=items
97+
)
9198

9299
def startup(self) -> None:
93-
self._task = asyncio.create_task(self._publish_mock_data())
100+
self._task = start_periodic_task(
101+
self._task_service_state_retrieval,
102+
interval=self.poll_interval,
103+
task_name="sse_periodic_status_poll",
104+
)
94105

95106
async def shutdown(self) -> None:
96107
if self._task:
97-
self._task.cancel()
98-
await self._task
108+
await stop_periodic_task(self._task, timeout=5)
99109

100110

101111
def setup_services(app: FastAPI) -> None:
102112
async def on_startup() -> None:
103-
MockMessagesProvider.get_from_app_state(app).startup()
113+
status_retriever = ServicesStatusRetriever(
114+
app, poll_interval=timedelta(seconds=1)
115+
)
116+
status_retriever.set_to_app_state(app)
117+
status_retriever.startup()
104118

105119
async def on_shutdown() -> None:
106-
await MockMessagesProvider.get_from_app_state(app).shutdown()
120+
await ServicesStatusRetriever.get_from_app_state(app).shutdown()
107121

108122
app.add_event_handler("startup", on_startup)
109123
app.add_event_handler("shutdown", on_shutdown)

0 commit comments

Comments
 (0)