73 lines
5.0 KiB
Markdown
73 lines
5.0 KiB
Markdown
---
|
||
title: sched admin-client openapi — F&F раунд 2026-08-18
|
||
type: concept
|
||
tags: [sched, ff, openapi, admin-api, python, codegen, f&f-round]
|
||
related: [[openapi-generator-3-1-spec-gotchas]], [[sched-fnf-r8-verification-stand]]
|
||
updated: 2026-08-18
|
||
---
|
||
|
||
# sched admin-client openapi — F&F раунды
|
||
|
||
Живая проверка claim'а sched openapi-spec: **«клиент на любом ЯП одной
|
||
командой»**. Вердикт round 1: **claim подтверждён с оговорками** (8 операций
|
||
требуют raw-обхода). Вердикт round 2 (0.2.0/0.3.5): **claim подтверждён
|
||
полностью** — все находки F-1..F-5 закрыты, raw-обход удалён, клиент
|
||
типизированный end-to-end.
|
||
|
||
## Round 2 — ретест фиксов (0.2.0 / daemon 0.3.5), 2026-08-18
|
||
|
||
| | |
|
||
|---|---|
|
||
| Что | `generate.ps1` заново против `@sched/admin-api@0.2.0` (tarball spec byte-identical pinned), сьют+smoke против `@sched/daemon@0.3.5` (:8127, no auth) |
|
||
| Ожидал | все 5 находок закрыты, `raw_ops.py` не нужен |
|
||
| Получил | **все 5 закрыты**; сьют **24/24** (3 прогона), smoke **19/19** — **полностью через типизированный клиент, 0 операций на обходе**; `raw_ops.py` **удалён**; F-1/F-5 подтверждены живьём на keyed-инстансе (:8128): health 200 open, /tasks 401 без ключа, 400 на неизвестные поля schedule body/patch |
|
||
|
||
Deliverables round 2: коммит sched `d658ff0` (пример обновлён: openapi.json
|
||
0.2.0, tests/smoke typed-only, raw_ops удалён, README+generate.ps1); репорт
|
||
`sched/.agents/inbox/2026-08-18T22-55-00Z-admin-openapi-fixes-round2-retest.md`.
|
||
Механика фиксов и генераторные грабли — [[openapi-generator-3-1-spec-gotchas]].
|
||
|
||
## Round 1 — 2026-08-18 (0.1.2 / daemon 0.3.4)
|
||
|
||
| | |
|
||
|---|---|
|
||
| Что | Python-клиент из опубликованной спеки `@sched/admin-api/openapi.json` 0.1.2 (verdaccio subpath-export, идентична репо), `openapi-generator` 7.24.0 (`-g python`, JDK 25) |
|
||
| Ожидал | типизированная десериализация всех ответов, зелёный сьют, зелёный smoke |
|
||
| Получил | сьют **24/24** (3 прогона), smoke **19/19**, все 15 путей/21 операция живые — НО клиент в сыром виде падает на 8 операциях (pydantic ValidationError) из-за пробелов спеки; обход — `raw_ops.py` (сгенерированный пакет не тронут) |
|
||
|
||
## Deliverables
|
||
|
||
- **Код**: `sched/examples/admin-client-python/` — коммит `e89e868` (запушен):
|
||
`openapi.json` (пин 0.1.2), `generate.ps1` (одна команда), `sched_admin_client/`
|
||
(сгенерированный, checked-in), `tests/` (TDD 24/24), `smoke.py` (19/19),
|
||
`raw_ops.py` (обход), `README.md` (F&F-таблица по всем путям).
|
||
- **Репорт**: `sched/.agents/inbox/2026-08-18T19-15-43Z-admin-fnf-openapi-client-report.md`
|
||
(F&F-формат: что→ожидал→получил→дока+гладкое).
|
||
- **Таска**: `[sched-admin-client-openapi]` 🟢 закрыта 2026-08-18.
|
||
|
||
## Находки (в репорт, спеку НЕ чинил — импл sched, TDD)
|
||
|
||
- **F-1** `/health`: спека `security: []`, daemon с ключом 401-ит даже health (письменный стенд :8080 непригоден для безключевых клиентов).
|
||
- **F-2 (главный)** mutation-ответы `{}` вместо `{task/run/schedule:…}` → генераторы врут; объявить схемы ответов.
|
||
- **F-3** `const: true` → строковый enum `('true')` ломает boolean.
|
||
- **F-4** oneOf+discriminator `Schedule` → `actual_instance=None`, контент только через raw JSON.
|
||
- **F-5** top-level `dedupKey` в POST /schedules молча игнорится (ключ — внутри `schedule`).
|
||
- Механика генераторных граблей — [[openapi-generator-3-1-spec-gotchas]].
|
||
|
||
## Как повторить
|
||
|
||
```powershell
|
||
cd sched/examples/admin-client-python
|
||
$env:JAVA_HOME = "C:\Program Files\Eclipse Adoptium\jdk-25.0.2.10-hotspot"
|
||
$env:Path = "$env:JAVA_HOME\bin;" + $env:Path # генератор спавнит java из PATH, не из JAVA_HOME
|
||
.\generate.ps1
|
||
pip install -r requirements.txt pytest
|
||
SCHED_ADMIN_URL=http://127.0.0.1:8127/api python -m pytest tests/ -v
|
||
python smoke.py --url http://127.0.0.1:8127/api
|
||
```
|
||
|
||
Стенд round 2: published `@sched/daemon` 0.3.5, `--admin-port 8127`, NO AUTH,
|
||
scratch sqlite (`/tmp/sched-acpy-stand/acpy.db`). Round 1 стоял на 0.3.4.
|
||
Письменный `:8080` — под ключом (`SCHED_ADMIN_KEY=dev-key`), `:8123` — стейл-билд
|
||
(health 0.1.8, нет POST /tasks).
|