Return native JSON with the missing id in the message, clear stale sessions on 401, and document ingress-nginx annotations so branded HTML 404/405 pages do not rewrite simulator bodies.
6.5 KiB
Language / Язык: English | Русский
Устранение неполадок
Ready остаётся недоступным
- Проверьте Postgres:
make logs/ health в Compose. - Выполните
make db-migrate. - Снова вызовите
/health/ready.
Task workers могут повторять попытки, пока миграции не догонят после позднего migrate.
Неожиданный HTTP 501
У каждого зарегистрированного маршрута должен быть реальный обработчик или DB-backed стаб — 501 не должен появляться для известного пути. Если вы его видите:
- Убедитесь, что вызываете точный зарегистрированный path/verb (проверьте
app/vsphere/rest/coverage.pyили/docs). - 501 от опционального legacy-стаба (
ENABLE_PVE_STUB=true) ожидается для необъявленных методов в стиле PVE, когдаCONTRACT_FALLBACK=error; это не относится к native vSphere-поверхности. - Сообщите о регрессии — на native vSphere-плоскости ожидается полное покрытие реестра.
401 / 403
- Сессия истекла (скользящий TTL 2 часа) или заголовок/cookie
vmware-api-session-idне отправлен. - Некорректный Basic auth на
/api/session(отсутствует заголовок, неверный base64 отuser:password). - Отказ по правам — попробуйте сравнить
administrator@vsphere.localиreadonly@vsphere.local(см. Авторизация). - В Web UI ответ 401 очищает сохранённую сессию и переключает бейдж в шапке на Guest с toast «Session expired — sign in again».
Ingress возвращает брендированный HTML 404 / nginx 405 вместо JSON
Симулятор отвечает на API-ошибки JSON (detail / error_type /
messages). Если вы видите HTML «page not found» сайта или голую страницу
nginx 405, Ingress / reverse proxy подменил тело upstream (часто через
custom-http-errors у ingress-nginx).
Исправьте аннотации Ingress для этого хоста (см.
helm/vmware-api-simulator/values-ingress-example.yaml):
annotations:
nginx.ingress.kubernetes.io/proxy-intercept-errors: "false"
nginx.ingress.kubernetes.io/custom-http-errors: "502,503"
Затем перепроверьте с Accept: application/json. Отсутствующий host должен
выглядеть так:
{
"detail": {
"error_type": "not_found",
"messages": [
{
"default_message": "No such host ('host-999')",
"id": "com.vmware.vapi.std.errors.not_found",
"args": ["host-999"]
}
],
"data": { "host": "No such host ('host-999')" }
}
}
Seeded id хостов для small / large / big начинаются с host-11.
Cookbook-ВМ включают vm-101 (web-01).
Корректная authenticated-мутация (vSphere Automation)
Сессия в заголовке/cookie + JSON-тело (не form-urlencoded):
SID=$(curl -sk -u 'administrator@vsphere.local:VMware1!' -X POST \
"https://HOST/api/session" | tr -d '"')
curl -sk -X POST "https://HOST/api/vcenter/vm" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "vmware-api-session-id: $SID" \
-d '{"name":"lab-vm","guest_os":"OTHER_GUEST_64","placement":{"folder":"group-v23","host":"host-11","datastore":"datastore-31","resource_pool":"resgroup-22"}}'
Задача никогда не завершается
- Изучите
/api/cis/tasks/{task}. - Проверьте логи worker/симулятора (
make logs). - Убедитесь, что
TASK_WORKER_CONCURRENCY> 0 и аренды в базе данных можно забрать (claim). - Очень высокий
SIMULATION_TIME_SCALEдаёт необычные замедления (больше = быстрее симуляция); чаще виноваты неверно заданные worker-аренды.
Сбои TLS / gateway
- Используйте порт хоста 443 (gateway) для TLS-клиентов — pyvmomi,
govmomi, провайдер Terraform
hashicorp/vsphere, Pulumi. - Устанавливайте
verify_ssl=False/allow_unverified_ssl=trueтолько для локального self-signed development-сертификата. - Внутри Compose обращайтесь напрямую к
simulator:8080(обычный HTTP, без gateway). - Seeded-имена ВМ для
small—web-01,web-02,db-01,app-01,jumpbox, а не Proxmox-stylepve01/VMID.
Drift Terraform / Pulumi / Ansible после reseed
Reseed заменяет инвентарь в PostgreSQL (MOID-ы и имена ВМ могут измениться);
состояние внешних инструментов автоматически не обновляется. Выполните
refresh, import или пересоберите стеки после make seed.
Hot-swap «ничего не сделал»
- Просмотр каталога ≠ apply. Используйте Apply as runtime или
POST /ui/api/contract/apply?major=N. - Применение мажора меняет каталог Web UI / представление evidence, а не живую таблицу маршрутов — runtime всегда обслуживает полную зарегистрированную поверхность. См. Версии API.
- Apply локален для процесса; перезапуск Compose возвращает к значению по умолчанию (мажор 9).
Demo unload удивил
POST /ui/api/demo/unload очищает состояние, созданное через API, и
загружает small. Повторите make seed (или снова загрузите
demo-cluster), чтобы восстановить более богатую фикстуру.