From aaad429a484e77fa56e06397caca36f85fd28eec Mon Sep 17 00:00:00 2001 From: Dan Fuchs Date: Sun, 23 Jun 2024 15:30:13 -0500 Subject: [PATCH] Add GitHub CI app info to `/summary` --- src/mobu/handlers/external.py | 17 ++++++++++--- src/mobu/models/ci_manager.py | 47 +++++++++++++++++++++++++++++++++++ src/mobu/models/summary.py | 17 +++++++++++++ tests/handlers/flock_test.py | 2 +- 4 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 src/mobu/models/ci_manager.py create mode 100644 src/mobu/models/summary.py diff --git a/src/mobu/handlers/external.py b/src/mobu/handlers/external.py index 87fc5324..c61933bc 100644 --- a/src/mobu/handlers/external.py +++ b/src/mobu/handlers/external.py @@ -14,10 +14,13 @@ from ..config import config from ..dependencies.context import RequestContext, context_dependency +from ..dependencies.github import maybe_ci_manager_dependency from ..models.flock import FlockConfig, FlockData, FlockSummary from ..models.index import Index from ..models.monkey import MonkeyData from ..models.solitary import SolitaryConfig, SolitaryResult +from ..models.summary import CombinedSummary +from ..services.github_ci.ci_manager import CiManager external_router = APIRouter(route_class=SlackRouteErrorHandler) """FastAPI router for all external handlers.""" @@ -239,10 +242,16 @@ async def put_run( @external_router.get( "/summary", response_class=FormattedJSONResponse, - response_model=list[FlockSummary], - summary="Summary of statistics for all flocks", + response_model=CombinedSummary, + summary="Summary of all app state", ) async def get_summary( context: Annotated[RequestContext, Depends(context_dependency)], -) -> list[FlockSummary]: - return context.manager.summarize_flocks() + ci_manager: Annotated[ + CiManager | None, Depends(maybe_ci_manager_dependency) + ], +) -> CombinedSummary: + return CombinedSummary( + flocks=context.manager.summarize_flocks(), + ci_manager=ci_manager.summarize() if ci_manager else None, + ) diff --git a/src/mobu/models/ci_manager.py b/src/mobu/models/ci_manager.py new file mode 100644 index 00000000..be66d5b8 --- /dev/null +++ b/src/mobu/models/ci_manager.py @@ -0,0 +1,47 @@ +"""Models for CiManager.""" + +from pydantic import BaseModel, Field, HttpUrl + +from .user import User + +__all__ = [ + "CiJobSummary", + "CiManagerSummary", + "CiWorkerSummary", +] + + +class CiJobSummary(BaseModel): + """Information about a job.""" + + commit_url: HttpUrl = Field( + ..., + title="GitHub URL to the commit being worked on", + ) + + +class CiWorkerSummary(BaseModel): + """Information about a running worker.""" + + user: User = Field(..., title="User that the worker works as") + + num_processed: int = Field( + ..., + title="Number of jobs this worker has processed since mobu started", + ) + + current_job: CiJobSummary | None = Field( + ..., title="The job the worker is currently running, if any" + ) + + +class CiManagerSummary(BaseModel): + """Information about the CiManager.""" + + workers: list[CiWorkerSummary] = Field( + ..., title="The workers being managed" + ) + + num_queued: int = Field( + ..., title="Number of jobs waiting for a free worker" + ) diff --git a/src/mobu/models/summary.py b/src/mobu/models/summary.py new file mode 100644 index 00000000..6f30cc74 --- /dev/null +++ b/src/mobu/models/summary.py @@ -0,0 +1,17 @@ +"""Combined summary of different functionalities.""" + +from pydantic import BaseModel, Field + +from .ci_manager import CiManagerSummary +from .flock import FlockSummary + + +class CombinedSummary(BaseModel): + """Summary of all app state.""" + + flocks: list[FlockSummary] = Field( + ..., title="Info about all running flocks" + ) + ci_manager: CiManagerSummary | None = Field( + None, title="Info about GitHub CI workers" + ) diff --git a/tests/handlers/flock_test.py b/tests/handlers/flock_test.py index bee63170..c868a256 100644 --- a/tests/handlers/flock_test.py +++ b/tests/handlers/flock_test.py @@ -110,7 +110,7 @@ async def test_start_stop_refresh( r = await client.get("/mobu/summary") assert r.status_code == 200 - assert r.json() == [summary] + assert r.json() == {"flocks": [summary], "ci_manager": None} r = await client.get("/mobu/flocks/other") assert r.status_code == 404