13 KiB
13 KiB
Резюме сессии: VDC create-flow, диалог с Opus и правка fallback (2026-09-21)
1. Контекст задачи
- Цель: довести до рабочего состояния создание
nubes_vc_vdcвFullPipe. - Симптом: при создании VDC провайдер падал на
GET /instanceOperations/{opUid}?fields=cfsParamsс HTTP 500. - В ходе разбора было подтверждено, что обычные сервисы через тот же провайдер работали, а VDC попадал в отдельную проблемную ветку backend-обработки.
2. Диагностика проблемы
2.1. Что ломалось
- В
provider/internal/core/client.gocreate-flow делалGET /instanceOperations/{opUid}?fields=cfsParamsсразу после создания операции. - Для VDC этот запрос приводил к ошибке backend’а:
Invalid call of the function [getResourceRealmConfig]Cannot cast Object type [Struct] to a value of type [string]- источник ошибки:
/app/api/v1/resources/instance_operation_cfs_param.cfc
- Причина по отчету: для
vc_vdcвычислялся динамическийdescrуstorageConfig.name, и backend падал наresourceRealm, который в DEV хранится какStruct, а неstring.
2.2. Почему обычные сервисы не ломались
- На обычных сервисах этот
GETлибо не попадал в проблемный backend-код, либо не требовал вычисленияresourceRealm. - Для VDC в YAML есть специфическая зависимость:
generated/dev/resources_yaml/21_vc_vdc.yamlstorageConfig.nameсодержит вычисляемыйdescrсgetResourceRealmConfig(...resourceRealm...).
- Для обычных сервисов, например
vappиpostgres, такого вычисляемогоresourceRealm-контекста нет.
2.3. Почему hasUnresolvedParams мешал
- Эвристика проверяла все строковые параметры, а не только параметры с
ref_svc_id. - Для VDC это ломало fallback на обычных литералах вроде:
providerVdc = fast-2.8networkProvider = default
- Эти значения не UUID и не JSON, но и резолвить их не нужно.
- В результате при падении GET провайдер вместо продолжения переходил в ошибку.
3. Диалог с Opus
3.1. Что просили у Opus
- Проверить только:
provider/internal/core/client.godocs/DEBUG_REPORT_VC_VDC_500.mdgenerated/dev/resources_yaml/21_vc_vdc.yamlgenerated/dev/resources_yaml/26_vapp.yamlgenerated/dev/resources_yaml/90_postgres.yaml
- Вопросы к Opus были узкими:
- почему обычные сервисы работали, а VDC начал падать на
GET ?fields=cfsParams - есть ли в VDC специфическая структура или зависимость, которой нет у обычных сервисов
- является ли
hasUnresolvedParamsневерной эвристикой именно в этом месте - что именно надо исправить
- почему обычные сервисы работали, а VDC начал падать на
3.2. Что ответил Opus по сути
- Root cause — не данные Terraform и не сами строки
fast-2.8/default, а backend-ошибка наGET /instanceOperations/{opUid}?fields=cfsParamsименно для VDC. - VDC отличается от обычных сервисов тем, что в его YAML есть динамический
descrдляstorageConfig.name, который тянетresourceRealm. hasUnresolvedParamsбыла признана лишней и хрупкой эвристикой: она может ломать fallback на обычных строках.- Итоговое решение Opus: при ошибке GET идти дальше по браузерному flow, без условий по всем строковым параметрам.
3.3. Дополнительные уточнения в диалоге
- Был отдельный спор по формулировке про Lucee / ColdFusion backend.
- В итоге было зафиксировано, что этот термин — не отдельная гипотеза, а просто обозначение backend-слоя, который уже фигурировал в отчетах и traceback’ах.
- Opus также подтвердил, что для VDC этот GET нужен только как вспомогательный шаг для
resolveRefSvcParamValues, а не как обязательный бизнес-этап.
4. Что изменили в коде
4.1. provider/internal/core/client.go
- В
CreateGenericInstanceUniversalV6удалён gate поhasUnresolvedParams. - Теперь логика такая:
- если
GET /instanceOperations/{opUid}?fields=cfsParamsуспешен — парсим и резолвимref_svc_id - если GET падает — просто продолжаем POST’ить параметры, а потом идём в
validate-cfsиrun
- если
- Функция
hasUnresolvedParamsудалена полностью. - После удаления была убрана осиротевшая документационная строка, оставшаяся над
isHexDigit.
4.2. provider/internal/core/client_test.go
- Добавлен тест:
TestCreateGenericInstanceUniversalV6_ContinuesWhenOpDetailsGETFails
- Тест моделирует:
POST /instancesPOST /instanceOperationsGET /instanceOperations/{opUid}?fields=cfsParams→ 500POST /instanceOperationCfsParamsGET /instanceOperations/{opUid}/validate-cfsPOST /instanceOperations/{opUid}/run- финальный
GET /instances/{uid}
- Проверка теста:
- create-flow завершился успешно
- все 7 параметров были отправлены с ожидаемыми значениями
- polling по операции был ровно один раз
5. Проверка после правки
cd /home/naeel/TF/tf_provider/provider && go test ./internal/core— успешно.- После ревью был пойман и исправлен только косметический хвост:
- старый комментарий над
isHexDigit, оставшийся после удаленияhasUnresolvedParams.
- старый комментарий над
- После этого пакет
internal/coreснова прошёл тесты.
6. Вывод по итогам сессии
- Проблема была не в обычных сервисах как таковых, а в специфике VDC-данных и backend-пути, который срабатывал на
GET ?fields=cfsParams. hasUnresolvedParamsбыла неверной эвристикой именно в create-flow VDC и ломала рабочий fallback.- Правильное поведение: если GET падает, не гадать по строковым параметрам, а продолжать browser-like flow через POST параметров, validate и run.
7. Что дальше
- Следующий этап — уже не правка логики, а публикация и стендовая проверка при необходимости.
- DEV-релиз
2.0.3успешно собран и загружен в registrynubes-devчерезTOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/dev. - Перед этим уже был подготовлен короткий запрос на ревью для Opus и получен ответ, который подтвердил направление правки.
8. Отдельный диалог про organization_uid, refSvcId и универсальное поведение
8.1. Что стало проблемой
- В
vc_vdcполеorganization_uidможно передавать как display name (kontora), так и как UUID организации. - В коде
provider/internal/resources_gen/21_vc_vdc_resource.goэто поле сейчас резолвится черезResolveRefSvcParamValue(...)в UUID. - После
applyTerraform видит расхождение: в конфиге было имя, в state оказался UUID, и появляется ошибкаProvider produced inconsistent result after apply. - Параллельно в этом же ресурсе остаются ручные
EqualFold-хаки, которые пытаются сохранить старое значение, но не решают кейс "имя vs UUID".
8.2. Почему это сравнивали с S3
- Для
nubes_s3_bucketпохожее поведение уже работает: ref-полеs3_user_uidпроходит через общий механизм refSvc-резолва и state-refresh. - В S3 есть симметричный путь: UUID можно принимать на вход, а состояние при чтении синхронизируется через общий mapping-слой.
- Поэтому S3 не падает на inconsistency, а VDC падает из-за локальных restore-хаков и разного поведения на create/read/update.
8.3. Что выяснили по коду
- Ключевой участок VDC:
- В S3 аналогичный слой устроен аккуратнее:
8.4. Что решил сделать дальше
- Пользователю нужен не частный фикс только для VDC, а универсальная схема для всех refSvcId-полей.
- Была сформулирована задача для Opus: определить, какой канон выбрать для state, где делать name→UUID и UUID→display_name, и как убрать ручные
EqualFold-хаки без поломки S3 и других уже рабочих ресурсов. - Отдельно зафиксировано требование: ответ Opus нужен короткий, но сам вопрос должен быть подробным и однозначным.
8.5. Важный вывод на сейчас
- Универсальное решение пока не внедрено.
- Текущий безопасный путь — сначала получить короткий архитектурный ответ от Opus, а уже потом править генератор и пересобирать ресурсы.
9. Детерминированная пересборка генератора
- После отдельного разбора
kind: modifierвыяснилось, что падение генерации было эксплуатационным: запускался устаревший бинарникresource-generator, а не текущие исходники. - В
TOOLS/scripts/02_generate_resources_and_docs_v2.shубранmtime-гард черезfind ... -newer; генераторы теперь всегда собираются заново перед прогоном. - Это сделано специально, чтобы старый бинарник больше не мог скрыть поддержку новых
kind-веток в YAML-спеках. - Дополнительно
TOOLS/resource-generator/bin/добавлен в ignore, чтобы локальный stale-артефакт не путал следующий запуск.