diff --git a/DOCS/sonnet-state-out-valuelist.md b/DOCS/sonnet-state-out-valuelist.md new file mode 100644 index 0000000..9e0c6cf --- /dev/null +++ b/DOCS/sonnet-state-out-valuelist.md @@ -0,0 +1,85 @@ +# Sonnet 4.6 — valueList из state.out для внутренних операций инстанса + +Дата: 2026-07-30 +Версия: v1.1.38 + +## Проблема + +PostgreSQL создан. `create_user` отработал успешно (HTTP 201). Но при вызове `delete_user` — поле `username` показывает пустой выпадающий список (`valueList=[]`). Созданный юзер `uuu8` не виден. + +## Что нашли + +**GET /instances/{uid}** возвращает `state.out` с актуальными данными: + +```json +"state": { + "out": { + "users": {"uuu8": {"username": "uuu8", "role": "ddl_user", "rights": ["createdb", "createrole"]}}, + "databases": {}, + "backups": [], + ... + } +} +``` + +**Шаблон** (`/instanceOperations/default/244` — delete_user) возвращает `valueList=[]`. + +**Текущий код** — файл `/home/naeel/nubes/autotest/app-autotest/site/operations/get_params.py` + +```python +def get_params_with_current_values(client, op_id, instance_uid): + inst_data = client.get(f"/instances/{instance_uid}") + state_params = inst_data.get("instance", {}).get("state", {}).get("params", {}) or {} + + tmpl_data = client.get(f"/instanceOperations/default/{op_id}") + tmpl_params = tmpl_data.get("svcOperation", {}).get("cfsParams", []) or [] + + for p in tmpl_params: + ... + result.append({ + ... + "valueList": value_list, # ← из шаблона, всегда [] + }) +``` + +Читает `state.params` (конфигурация кластера), но НЕ читает `state.out` (пользователи, базы). + +## Предлагаемое решение + +После получения `inst_data`, извлечь `state.out`: + +```python +state_out = inst_data.get("instance", {}).get("state", {}).get("out", {}) or {} +``` + +В цикле слияния, если `valueList` пустой — попробовать заполнить из `state.out`: + +```python +value_list = p.get("valueList") +# Заполнить пустые valueList из state.out +if value_list is not None and not value_list: + code = p.get("svcOperationCfsParam", "").lower() + if "user" in code and isinstance(state_out.get("users"), dict): + value_list = sorted(state_out["users"].keys()) + elif ("db" in code or "owner" in code) and isinstance(state_out.get("databases"), dict): + value_list = sorted(state_out["databases"].keys()) +``` + +## Вопросы + +1. **Правильный ли подход?** Смотреть в `state.out.users` / `state.out.databases` для заполнения пустых valueList? Или есть другой источник? + +2. **Какие ещё поля из state.out могут понадобиться?** Для других сервисов (MongoDB, Redis, Kafka) — есть ли там аналогичные подресурсы? + +3. **Универсальность:** Достаточно ли проверки по имени параметра (`"user" in code`, `"db" in code`)? Или нужен более общий механизм (например, проверять все ключи state.out и матчить по имени)? + +4. **Кеширование:** `get_params_with_current_values` вызывается при каждом открытии формы. GET /instances/{uid} — дорогой запрос. Стоит ли кешировать state.out? + +5. **Есть ли другие баги** в этой же области, которые мы упустили? + +## Файлы для анализа + +- `/home/naeel/nubes/autotest/app-autotest/site/operations/get_params.py` — основной файл +- `/home/naeel/nubes/autotest/app-autotest/site/routes/api_test.py` — api_params (строка 120-155) +- `/home/naeel/nubes/autotest/app-autotest/site/static/app.js` — showParams (строка 145-260) +- Пример API-ответа: `curl -H "Authorization: Bearer $TOKEN" /instances/0a42bef3-7ce1-42b7-aa80-4274c4d9568f`