From 286c5ab68003e94db6c7cbb17121b1e500536775 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Wed, 29 Jul 2026 11:12:25 +0400 Subject: [PATCH] =?UTF-8?q?docs:=20Sonnet=20new=20chat=20=E2=80=94=20full?= =?UTF-8?q?=20context=20for=20missing=20required=20params?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DOCS/sonnet-new-chat.md | 77 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 DOCS/sonnet-new-chat.md diff --git a/DOCS/sonnet-new-chat.md b/DOCS/sonnet-new-chat.md new file mode 100644 index 0000000..8b2325e --- /dev/null +++ b/DOCS/sonnet-new-chat.md @@ -0,0 +1,77 @@ +# Полный код-ревью и вопрос: CREATE пропускает required-параметры + +## Что такое autotest + +Flask 3.0 + gunicorn + vanilla JS. Тестирует Nubes REST API — создаёт/удаляет инстансы облачных сервисов (Redis, PostgreSQL, S3, etc.). Всё через API: POST /instances, POST /instanceOperations, POST /instanceOperationCfsParams, POST /run. + +## Текущий CREATE-флоу (код) + +Файл: `/home/naeel/nubes/autotest/app-autotest/site/routes/api_test.py`, функция `api_test()`, строки 209-225: + +```python +display_name = _unique_display_name(client, display_name) +descr = f"created by autotest v{current_app.config.get('VERSION', '')}" +payload = {"serviceId": svc_id, "displayName": display_name, "descr": descr} +resp = client.post("/instances", payload) # шаг 1 +instance_uid = resp.get("instanceUid") or _find_uid(resp) ... + +op_payload = {"instanceUid": instance_uid, "operation": "create"} +op_resp = client.post("/instanceOperations", op_payload) # шаг 2 +op_uid = _find_uid(op_resp) ... + +tracker_add(...) + +for pid, pval in params.items(): # шаг 3 — ТОЛЬКО пользовательские + client.post("/instanceOperationCfsParams", + {"instanceOperationUid": op_uid, "svcOperationCfsParamId": int(pid), "paramValue": str(pval)}) +client.post(f"/instanceOperations/{op_uid}/run") # шаг 4 +``` + +## Эталонный флоу (Terraform-провайдер) + +Файл: `/home/naeel/nubes/autotest/DOCS/terraform-operations-full-logic.md` (скопирован из репы tf_provider) + +``` +Шаг 1: POST /instances {serviceId, displayName, descr} +Шаг 2: POST /instanceOperations {instanceUid, operation:"create"} +Шаг 3: GET /instanceOperations/{opUid}?fields=cfsParams ← получить ВСЕ params с defaults +Шаг 4: resolveRefSvcParamValues ← резолв refSvcId +Шаг 5: POST /instanceOperationCfsParams ← пользовательские params (×N) +Шаг 6: POST /instanceOperationCfsParams ← required params с defaultValue, не переданные в шаге 5 (×M) ⬅ НЕТ В AUTOTEST +Шаг 7: GET /instanceOperations/{opUid}/validate-cfs +Шаг 8: POST /instanceOperations/{opUid}/run {} +Шаг 9: поллинг dtFinish +``` + +## Баг + +PostgreSQL (сервис 90, create opId=19) имеет **8 map-fixed параметров**, все required: +- startupConfiguration (id=789) +- clusterConfiguration (id=788) +- accessConfiguration (id=790) +- postgresConfiguration (id=791) +- postgresConf (id=792) — array-map-fixed +- backupConfiguration (id=793) +- autoscaleConfiguration (id=794) +- mtlsConfiguration (id=1094) + +Пользователь в UI заполняет первые 3-4. Остальные 4-5 **не отправляются** → Nubes возвращает: «Не передан параметр: serviceInstanceUid». + +Redis (3 параметра), Болванка (все заполняются) — работают. + +## Нужное решение + +Добавить **шаг 6** в CREATE-ветку: после отправки пользовательских `params`, дослать required-параметры с их `defaultValue`, которые не были в пользовательском вводе. + +## Вопросы + +1. **Где брать список required-параметров с defaultValue?** + - Вариант А: сделать `GET /instanceOperations/default/{svcOperationId}` (тот же что для /api/params) — там есть все params с `isRequired` и `defaultValue`. Взять те, где `isRequired=True` и `svcOperationCfsParamId` нет в `params.keys()`. + - Вариант Б: сделать `GET /instanceOperations/{opUid}?fields=cfsParams` как Terraform (шаг 3) — после создания операции, получить cfsParams от сервера. Но это доп. запрос. + - Какой правильнее? + +2. **Как отличить «пользователь заполнил» от «не заполнил»?** Сейчас params приходят из фронтенда как `{"788": "{\"cpu\":\"500\",...}"}`. Если поле не в params.keys() — значит юзер не заполнил. Но что если юзер оставил пустую строку? Достаточно проверки `pid not in params` или нужно проверять значение? + +3. **Нужны ли шаги 3 (GET cfsParams) и 7 (validate)?** Terraform их делает. Без validate-cfs мы пропускаем серверную валидацию до /run. Это критично или нет? + +4. **Не сломает ли это существующие сервисы?** Если добавить досылку required+default для ВСЕХ сервисов — не навредит ли это Redis/Болванке где и так всё работает?