Files
inecs f8d3cbdd59 Initial commit: VMware vSphere API simulator scaffold.
Add the FastAPI app, PostgreSQL migrations, Docker/Helm packaging, API
contracts, docs, client examples, and the unit/integration/compatibility
test suite for local client and tooling labs without a real vCenter.
2026-07-18 04:42:11 +03:00

92 lines
5.6 KiB
Markdown

**Language / Язык:** [English](../api-surface.md) | [Русский](api-surface.md)
# Поверхность API
## Путь запроса
1. Middleware назначает или пересылает ID запроса (`REQUEST_ID_HEADER`).
2. FastAPI направляет запрос в роутер vSphere REST (`/api`, `/rest`), роутер
SOAP (`/sdk`) или (если `ENABLE_PVE_STUB=true`) в опциональный legacy-стаб.
3. `/api/session` (либо `/rest/com/vmware/cis/session`, либо SOAP `Login`)
определяет принципала и выдаёт `vmware-api-session-id`.
4. Зависимости `require_read` / `require_privilege(...)` проверяют роли
сессии перед раскрытием или мутацией ресурсов.
5. Глубокий обработчик (базовая логика инвентаря/жизненного цикла/тегов/
контента/appliance) или DB-backed поверхность стабов выполняется против
состояния, хранимого в PostgreSQL.
6. Долгие операции (power, clone, relocate, snapshot, деплой OVF) создают
долговечную CIS-задачу и возвращают `{ "task": "task-…" }`.
## Две REST-поверхности в одном реестре
- **Core (глубокие) обработчики** — ~104 комбинации verb+path в
[`app/vsphere/rest/router.py`](../../app/vsphere/rest/router.py),
`vm_ext.py`, `inventory_ext.py`, `platform_rest.py`, `tagging_rest.py`,
`content_rest.py`, `appliance_ext.py`, `nfc_rest.py`, `tasks.py`. Они
читают и мутируют напрямую seeded-таблицы инвентаря/тегов/контента/
appliance.
- **DB-backed поверхность стабов** —
[`app/vsphere/rest/stub_surface.py`](../../app/vsphere/rest/stub_surface.py)
отвечает на оставшиеся маршруты индекса операций Broadcom Automation API
(зарегистрированные из `universe.json`) против `vsphere_api_state`. GET
возвращает живые payload'ы, производные от инвентаря, когда это возможно,
иначе — seeded-строки; PUT/PATCH сохраняются в `vsphere_api_state`; POST
добавляет строки коллекции; DELETE их удаляет. Маркер `"stub": true` не
возвращается — зонды видят реальные seeded-payload'ы.
Обе поверхности используют одну таблицу маршрутов; core-обработчики имеют
приоритет над записями стабов, зарегистрированными для того же verb+path.
## Legacy `/rest`
[`app/vsphere/rest/legacy.py`](../../app/vsphere/rest/legacy.py) оборачивает
чтения vm/host/datastore/network/datacenter/cluster/power/appliance (и
power ВМ) в конверты `{ "value": … }` для более старых клиентов
`com.vmware.vcenter.*`.
## Ошибки ([`app/vsphere/errors.py`](../../app/vsphere/errors.py))
| Статус | `error_type` | Типичная причина |
|---|---|---|
| 400 | `invalid_argument` / `already_exists` | Некорректное тело, дублирующееся имя |
| 401 | `unauthenticated` | Отсутствующая/недействительная/истёкшая сессия |
| 403 | `unauthorized` | У сессии нет требуемой привилегии |
| 404 | `not_found` | Неизвестный параметр MOID/path |
| 409 | (зависит от обработчика) | Недопустимый переход состояния питания, конфликт блокировки |
| 501 | `error` | Достижимо только через fallback опционального legacy-стаба для необъявленных методов |
Все тела ошибок следуют форме vSphere Automation:
`{ "error_type": "...", "messages": [{ "default_message": "...", "id": "...", "args": [] }] }`.
## Задачи
Асинхронная работа (power, clone, snapshot, relocate, деплой OVF, guest
customize) возвращает id задачи. Опрашивайте:
```text
GET /api/cis/tasks/{task}
```
Строки задач фиксируются в `vsphere_tasks`; `progress` равен `100`, как
только `status` становится `SUCCEEDED`/`FAILED`. HTTP 200/201 на запросе
мутации означает «принято», а не «ВМ уже в конечном состоянии». См.
[Задачи](domains/tasks.md).
## Исследование
- Интерактивная документация FastAPI: `/docs`
- Инспектор методов в Web UI: `/` → каталог → метод
- Вспомогательные API UI: `/ui/api/catalog`, `/ui/api/method`,
`/ui/api/compatibility`
- Реестр покрытия: [`app/vsphere/rest/coverage.py`](../../app/vsphere/rest/coverage.py)
- Матрица уровней пути / каталога: [`app/vsphere/contracts/matrix.py`](../../app/vsphere/contracts/matrix.py)
## Эндпоинты совместимости
| Path | Формат |
|---|---|
| `/ui/api/compatibility?major=N` | JSON |
См. [Совместимость](compatibility.md) и [Покрытие API](api-coverage.md) для
полной разбивки Broadcom-universe в сравнении с реализованным.