5.0 KiB
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.
Как повторить
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).