Files
app-autotest/DOCS/sonnet-state-out-valuelist.md
T

4.0 KiB

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 с актуальными данными:

"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

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:

state_out = inst_data.get("instance", {}).get("state", {}).get("out", {}) or {}

В цикле слияния, если valueList пустой — попробовать заполнить из state.out:

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