diff --git a/HISTORY/2026-07-24-all-failures.md b/HISTORY/2026-07-24-all-failures.md new file mode 100644 index 0000000..387fc63 --- /dev/null +++ b/HISTORY/2026-07-24-all-failures.md @@ -0,0 +1,81 @@ +# 2026-07-24 — Полная хронология провалов (v1.0.6 — v1.0.25) + +## v1.0.6 — Трёхколоночный UI, auto-selectService +- **Что:** три колонки, сервисы грузятся, auto-select на dummy +- **Результат:** «Сервисы: Загрузка...» висит +- **Причина:** заменён ВЕСЬ шаблон вместо добавления. auto-selectService вызывал API до готовности страницы. + +## v1.0.7 — HttpClient.post не существовал +- **Ошибка:** `'HttpClient' object has no attribute 'post'` +- **Причина:** в http_client.py только get(), а api_test.py использовал post() +- **Исправление:** добавлен post() + +## v1.0.8 — r.json() на пустом ответе +- **Ошибка:** `'str' object has no attribute 'get'` +- **Причина:** POST /instances → 201 с пустым телом. r.json() падает. +- **Исправление:** try/except, возвращаем {} + +## v1.0.9 — instanceUid из Location +- **Ошибка:** не находился UUID инстанса +- **Причина:** POST /instances возвращает UID в заголовке Location, не в теле +- **Исправление:** парсинг Location → UUID + +## v1.0.10 — cfsParams в POST /instances +- **Ошибка:** 400 Bad Request +- **Причина:** cfsParams нельзя в POST /instances +- **Исправление:** убраны cfsParams из create + +## v1.0.11 — descr обязателен +- **Ошибка:** 400 Bad Request +- **Причина:** поле descr нужно в POST /instances +- **Исправление:** добавлен descr: "autotest" + +## v1.0.12 — тело ошибки в ответе +- **Добавлено:** показ тела ответа API при ошибке + +## v1.0.13 — displayName не уникален +- **Ошибка:** 400 "Instance Display Name not unique" +- **Причина:** имя autotest-1 уже занято +- **Исправление:** timestamp в имени + +## v1.0.14 — displayName редактируемый +- **Добавлено:** поле ввода displayName в параметрах + +## v1.0.15-1.0.16 — авто-selectService + сломанный шаблон +- **Ошибка:** «Сервисы: Загрузка...» +- **Причина:** заменён рабочий шаблон новым с багами +- **Исправление:** откат к v1.0.12 + +## v1.0.17-1.0.19 — восстановление + displayName +- Восстановлен рабочий шаблон, добавлен только displayName + +## v1.0.20 — traceback в ошибках +- **Добавлено:** traceback для отладки + +## v1.0.21 — r.json() возвращает строку "201" +- **Ошибка:** `'str' object does not support item assignment` +- **Причина:** POST /instances → тело "201" → r.json() = "201" → result = "201" (строка) +- **Исправление:** isinstance(parsed, dict) + +## v1.0.22 — двухшаговый create (без cfsParams) +- **Ошибка:** инстанс создан, но статус "not created" +- **Причина:** только POST /instances, операция create не запущена +- **Исправление:** добавлен POST /instanceOperations + +## v1.0.23 — cfsParams в POST /instanceOperations +- **Ошибка:** 422 "required CFS parameter failInProgress (200) is missing" +- **Причина:** cfsParams нельзя в POST /instanceOperations — они отдельно +- **Исправление:** убраны cfsParams из вызова, добавлены через /params + +## v1.0.24 — /params без instanceOperationUid +- **Ошибка:** /params ожидает {instanceOperationUid, svcOperationCfsParamId, paramValue} +- **Причина:** поле instanceOperationUid пропущено +- **Исправление:** добавлено + +## v1.0.25 — пропущен /validate +- **Ошибка:** операция не запускается +- **Причина:** в Go-клиенте есть шаг validate перед run +- **Исправление:** добавлен POST /validate + +## Итого: 13 итераций, 9 багов +Каждый раз — новый баг, потому что не сверял с Go-клиентом посимвольно. diff --git a/HISTORY/2026-07-24-session-5.md b/HISTORY/2026-07-24-session-5.md new file mode 100644 index 0000000..3fa8537 --- /dev/null +++ b/HISTORY/2026-07-24-session-5.md @@ -0,0 +1,57 @@ +# 2026-07-24 — Финальный поток создания инстанса + +## Поток API (1:1 с Go-клиентом Terraform) + +### Шаг 1: Создать инстанс +``` +POST /instances +{"serviceId": 1, "displayName": "autotest-1-xxx", "descr": "autotest"} +→ 201, Location: /instances/{instanceUid} +→ извлечь instanceUid из Location +``` + +### Шаг 2: Создать операцию +``` +POST /instanceOperations +{"instanceUid": "...", "operation": "create"} +→ 201, Location: /instanceOperations/{opUid} +→ извлечь opUid из Location +``` + +### Шаг 3: Задать параметры (по одному) +``` +POST /instanceOperations/{opUid}/params +{"instanceOperationUid": "{opUid}", "svcOperationCfsParamId": 200, "paramValue": "false"} +``` +Повторить для каждого cfsParam (12 штук для dummy). + +### Шаг 4: Валидация +``` +POST /instanceOperations/{opUid}/validate +(пустое тело) +``` + +### Шаг 5: Запуск +``` +POST /instanceOperations/{opUid}/run +(пустое тело) +``` + +### Шаг 6: Поллинг +``` +GET /instances?pageSize=200&page=1 +→ искать instanceUid → ждать !operationIsInProgress && status не "creating" +→ если не нашли — page++ +``` + +## Баг 8: `/params` без instanceOperationUid (v1.0.24-1.0.25) +- **Пропущенное поле:** `instanceOperationUid` в POST /params +- **Пропущенный шаг:** `/validate` перед `/run` +- **Исправление:** добавлены `instanceOperationUid` + `/validate` + +## Баг 9: пропущен `/run` (v1.0.20-1.0.22) +- Операция создавалась но не запускалась +- Исправлено: POST /instanceOperations/{opUid}/run + +## Итого: 5 шагов API + поллинг +Идентично Go-клиенту `CreateGenericInstanceUniversalV6`.