57 lines
3.6 KiB
Markdown
57 lines
3.6 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: **«клиент на любом ЯП одной
|
||
командой»**. Вердикт: **claim подтверждён с оговорками** — генерация одной
|
||
командой работает, но 3.1-спека до «любого ЯП без правок» не дотягивает
|
||
(8 операций требуют raw-обхода).
|
||
|
||
## Что делал / ожидал / получил
|
||
|
||
| | |
|
||
|---|---|
|
||
| Что | 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"
|
||
.\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
|
||
```
|
||
|
||
Стенд раунда: published `@sched/daemon` 0.3.4, `--admin-port 8127`, NO AUTH,
|
||
scratch sqlite (`/tmp/sched-acpy-stand/acpy.db`). Письменный `:8080` — под ключом
|
||
(`SCHED_ADMIN_KEY=dev-key`), `:8123` — стейл-билд (health 0.1.8, нет POST /tasks).
|