feat(observatory): expose attempt-bound recorded progress

This commit is contained in:
DCCONSTRUCTIONS
2026-09-03 11:17:56 +03:00
parent 4e0565eb4b
commit bee8552003
17 changed files with 960 additions and 11 deletions
+11
View File
@@ -1151,6 +1151,17 @@ def build_observatory_router(
"authority": dict(_OBSERVATION_ONLY_AUTHORITY),
}
@router.get("/api/v1/observatory/runs/{job_id}/progress")
def get_observatory_progress(
job_id: str = ApiPath(pattern=r"^observatory-run-[a-f0-9]{32}$"),
) -> dict[str, object]:
try:
return recorded_job_queue.progress(job_id)
except ObservatoryRecordedQueueNotFoundError as exc:
raise HTTPException(status_code=404, detail="Расчёт не найден.") from exc
except (ObservatoryRecordedQueueError, ValueError) as exc:
raise HTTPException(status_code=503, detail="Прогресс недоступен.") from exc
@router.get("/api/v1/observatory/runs/{job_id}")
def get_observatory_recorded_run(
job_id: str = ApiPath(
+18
View File
@@ -51,6 +51,7 @@ from k1link.observatory.recorded_jobs import (
ObservatoryRecordedQueueStaleClaimError,
RecordedExecutorIdentity,
)
from k1link.observatory.recorded_progress import RecordedProgress
OBSERVATORY_WORKER_CAPABILITY_CLAIM_REQUEST_SCHEMA: Final = (
"missioncore.observatory-worker-claim-request/v2"
@@ -194,6 +195,12 @@ class ObservatoryWorkerRenewRequest(_StrictWorkerRequest):
heartbeat_sequence: int = Field(ge=1)
class ObservatoryWorkerProgressRequest(_StrictWorkerRequest):
schema_version: Literal["missioncore.observatory-worker-progress-request/v1"]
claim_token: str = Field(pattern=_CLAIM_TOKEN_PATTERN)
progress: RecordedProgress
class ObservatoryWorkerCheckpointRequest(_StrictWorkerRequest):
schema_version: Literal["missioncore.observatory-worker-checkpoint-request/v1"]
claim_token: str = Field(pattern=_CLAIM_TOKEN_PATTERN)
@@ -333,6 +340,17 @@ def build_observatory_worker_router(
)
).as_dict()
@router.post("/recorded-jobs/{job_id}/progress", status_code=204)
def report_job_progress(
request: ObservatoryWorkerProgressRequest,
job_id: Annotated[str, ApiPath(pattern=_JOB_ID_PATTERN)],
) -> Response:
_queue_call(lambda: queue.report_progress(
job_id, claim_token=request.claim_token,
claimant_id=authentication.contour_id, progress=request.progress,
))
return Response(status_code=204)
@router.post("/recorded-jobs/{job_id}/checkpoint")
def checkpoint_job(
request: ObservatoryWorkerCheckpointRequest,