12 KiB
Передача контекста: Terraform-провайдер Nubes
Дата: 2026-09-22 | Версия DEV: 2.0.8 | HEAD: 13beb9c (release(dev): 2.0.8)
Документ для старта новой сессии. Прочитать целиком перед любыми действиями.
1. Правила работы (соблюдать строго)
- Никаких действий без прямого разрешения. Правки, сборки, заливки, коммиты, запуск terraform, запросы в API — только по явной команде оператора.
- Вопрос в любой форме = только ответ. Не выполнять действий, не предлагать «а ещё могу».
- Коммитить после каждой правки, разбивая по смыслу. Не копить в рабочем дереве.
- Не расширять область работ. Формулировка «сделай актуальным везде» не даёт права на дополнительные шаги.
- Не догадываться. Не уверен — сказать прямо и спросить. Причину бага доказывать фактами (логи, трассировки, содержимое файлов), а не гипотезами.
- Язык ответов — русский.
2. Проект
- Репозиторий:
/home/naeel/TF/tf_provider - Провайдер:
terraform-provider-nubes, Go,terraform-plugin-framework v1.8.0 - Go-модуль провайдера лежит в
provider/(не в корне).go build ./...из корня падает с «directory prefix . does not contain main module». - Генераторы в
TOOLS/:yaml-generator— из API в YAML-спеки;resource-generator— из YAML в Go (шаблоныtext/templateвTOOLS/resource-generator/internal/templates/);docs-generator— из YAML в Markdown.
- Пайплайн:
TOOLS/scripts/01_generate_yamls.sh→02_generate_resources_and_docs_v2.sh→03_build_and_upload_provider.sh(скрипт03сам прогоняет01и02).
3. Состояние на 2026-09-21 (конец сессии)
- Ветка
master, рабочее дерево чистое, HEAD =13beb9c(release(dev): 2.0.8). - Локальные коммиты в origin не пушились.
- DEV-версия: 2.0.8, залита в
tf-registry.containerk8s.services.ngcloud.ru/nubes-dev/nubes, подпись GPGCB3A0DF161ECC416(tazet@narod.ru, ключsecrets/private_key.asc). - S3:
prod-s3/nubes-terraform-registry/..., endpointhttps://s3.msk-1.ngcloud.ru. - Namespace:
nubes-dev, провайдерnubes. - Terraform v1.9.5 локально.
4. Что починено в этой сессии
| Коммит | Что |
|---|---|
7ecd2aa |
детерминированная пересборка генераторов (удалён устаревший бинарь) |
2286d34 |
destroy-guard в ModifyPlan + универсальный refSvc (имя или UUID) |
1401003 |
release 2.0.4 |
d608fba |
FullPipe: edge.tf, storage_config fast→SATA |
92e04da |
TODO-документ по багу docs-generator |
bffe3d9 |
refSvc-поля без Computed (unset = null, а не unknown) |
61c7e20 |
HISTORY сессии |
54b0baa |
release 2.0.5 |
af2e10b |
docs-generator: map-fixed → = { ... } (аргумент, не блок) |
7c2cc67 |
docs-generator: array-map-fixed → jsonencode([...]) |
3ca0752 |
docs-generator: строковые дефолты в кавычках |
8d405ba |
core: lifecycle-aware подсказки + supportsSuspend в сигнатурах |
c6715e8 |
генератор: supportsSuspend в diagnostics; нет suspend_on_destroy без suspend |
69808bd |
release 2.0.6 |
67c4d2f |
TOOLS/scripts/validate_docs_examples.sh |
14ada09 |
ТЗ для Flash по tainted-replace |
724f5f7 |
убрана create-time проверка существования из ModifyPlan (ломал tainted-replace и destroy) |
25080b7 |
release 2.0.7 |
3c0157a |
ShouldBeOptionalComputed: read-back параметры без Default → Optional+Computed |
4b34cc7 |
core: гарантия known — unknown → null для read-back полей |
13beb9c |
release 2.0.8 |
5. Ключевые архитектурные факты (не переоткрывать заново)
-
Две копии сгенерированного кода.
provider/internal/resources_gen/— в.gitignore, локальный артефакт;generated/dev/go/— актуальный вывод генератора; именно его компилирует релиз (скрипт03копирует его в temp-копиюprovider). Проверять надоgenerated/dev/go, неresources_gen. Проверка не той копии уже приводила к ложным выводам.
-
Рецепт проверки сборки без релиза:
TMP=$(mktemp -d) && cp -R provider "$TMP/provider" && \ find "$TMP/provider/internal/resources_gen" -maxdepth 1 -type f -name '*.go' -delete && \ cp generated/dev/go/*.go "$TMP/provider/internal/resources_gen/" && \ (cd "$TMP/provider" && go build ./...) && echo BUILD_OK && rm -rf "$TMP" -
Версия правится в 3 файлах:
TOOLS/config/dev/profile.env(VERSION),DEV_STAND/FullPipe/versions.tf,VERSIONS.md. Затем коммитrelease(dev): X.Y.Zи./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/dev X.Y.Z. -
Перезаливка той же версии бесполезна — Terraform не перекачает провайдер. Всегда бампать версию.
-
*.tfvarsв.gitignore(реальный токен вterraform.tfvarsбезопасен от коммита). -
Read-back инвариант. Провайдер читает параметр обратно из
state_paramsинстанса (RefreshResourceState+InputField). Такой параметр обязан бытьOptional+Computed, если он неRequiredи безDefault— правилоhelpers.ShouldBeOptionalComputed. Иначеplan=nullvsstate=значение→ «Provider produced inconsistent result after apply». -
RefreshResourceStateпри отсутствии кода вstate_paramsсхлопываетunknown → null(иначе «Provider produced invalid result object after apply: ... was unknown»). -
terraform destroyпри tainted-ресурсе выполняет внутренний обычный plan, который планирует замену (destroy+create); create-узел замены приходит вModifyPlanс prior state = null — отличить замену от создания невозможно. Поэтому create-time проверка существования изModifyPlanубрана (коммит724f5f7), проверка осталась вCreate. -
У сервиса без операции
suspendв YAML:SupportsSuspendDestroy=false→deleteMode := "delete", атрибутsuspend_on_destroyне генерируется, а подсказки в diagnostics не предлагают adopt (он невозможен). -
Вложенные параметры (
map-fixed) —schema.SingleNestedAttribute; в HCL это аргумент= { ... }, не блок.array-map-fixed—schema.StringAttribute(JSON-строка). -
Логи и артефакты отладки:
/tmp/nubes_find_debug.log(пишет только Plan-диагностика),/tmp/plan_trace.txt,/tmp/plan_destroy.txt,/tmp/plan_norefresh.txt. -
Секреты:
secrets/private_key.asc,secrets/public_key.asc,secrets/dev.token. Не выводить содержимое в чат.
6. Файлы, которые нужно прочесть
Обязательно:
.github/copilot-instructions.md— жёсткие правила оператора.VERSIONS.md— что и когда залито.HISTORY/2026-09-21_fullpipe_vdc_nsxt_and_refsvc_fixes.md— журнал предыдущей сессии.TOOLS/resource-generator/internal/templates/instance.go— главный шаблон ресурса инстанса (ModifyPlan / Create / Read / Update / Delete / Schema).TOOLS/resource-generator/internal/helpers/helpers.go—ShouldBeOptionalComputed,ParamDefaultExpr,IsNested, nested-хелперы.provider/internal/resources_core/state_refresh.go— read-back и инвариант known.provider/internal/resources_core/resource_diagnostics_required.go— create-time проверки существования/усыновления,runningConflictHint/suspendConflictHint.TOOLS/scripts/03_build_and_upload_provider.shиTOOLS/scripts/build-provider.sh— релизный пайплайн.DEV_STAND/FullPipe/—versions.tf,vdc.tf,edge.tf,variables.tf,outputs.tf.docs/TODO/docs_generator_nested_attr_syntax.md— описание бага docs-generator (уже исправлен, см. раздел 8).
По необходимости:
TOOLS/resource-generator/internal/templates/{subresource,modifier,action}.goTOOLS/docs-generator/internal/writers/writers.go—formatParamOrBlock,sampleValue,isNestedListParamprovider/internal/resources_core/crud.go— adopt / suspend / deletedocs/prompt_for_flash_fix_tainted_replace.md— разбор tainted-replace (реализован в724f5f7)TOOLS/scripts/validate_docs_examples.sh— прогонterraform validateпо примерам из доков- Память репозитория:
/memories/repo/registry-versions.md
7. Стенд FullPipe (Organization → vDC → Edge)
- Каталог
DEV_STAND/FullPipe, провайдер берётся изversions.tf(сейчас 2.0.8). nubes_vc_vdc.vdc—suspend_on_destroy = true,adopt_existing_on_create = true.nubes_vc_nsxt.edge—routed_net_configurationзадаётся через=(объект), не блоком.- Подхватить новую версию:
terraform init -upgrade. - На 2026-09-21
nubes_vc_nsxt.edgeбыл tainted в state (последствие прошлых неудачных apply). Убираетсяterraform untaint nubes_vc_nsxt.edge.
8. Открытые вопросы
docs/TODO/docs_generator_nested_attr_syntax.mdустарел — баг исправлен (af2e10b,7c2cc67,3ca0752), но в файле статус «не исправлено».- Стенд FullPipe не проверен end-to-end на 2.0.8 — нет подтверждённого успешного
apply(Organization → vDC → Edge) иdestroyпосле фиксов. - Полный прогон
terraform validateпо всем примерам из доков (63 сервиса) не делался — проверен толькоvc_nsxt. Скрипт для прогона готов:TOOLS/scripts/validate_docs_examples.sh. TOOLS/resource-generator/internal/templates/modifier.go:65— та же схемаComputedбез ветки read-back. Для бага «inconsistent result after apply» не критично (Create/Update модификаторов не читают обратно в state), но при работе сkind: modifierдержать в голове.- Пуш локальных коммитов в
origin/masterне делался.