4.0 KiB
4.0 KiB
Задача: спроектировать ПРОСТУЮ логику «изменяемости» параметров (CreateOnly vs Modifiable)
Проблема
Генератор terraform-провайдера строит проверку «Нельзя изменить X» (CreateOnly) на основе только instance-modify. Из-за этого возникают противоречивые и сломанные ситуации:
generated/dev/resources_yaml/22_vc_nsxt.yaml:
- create (id 10), param
needEnableAVI(id 340) — помеченis_modifiable: true; - instance-modify у
vc_nsxtНЕТ (modify 111 — это modifiervc_nsxt.network).
Генератор:
ComputeCreateOnly(createParams, instanceModifyParams):
поле считается CreateOnly, если его code нет в instance-modify
Следствие: needEnableAVI попадает в CreateOnly → генерится жёсткая проверка
«Нельзя изменить need_enable_avi», хотя по YAML параметр is_modifiable: true.
Плюс ConvertParams вообще не переносит is_modifiable из ParamSpec в Param —
поле теряется, логика его учесть не может.
Ключевые файлы (текущая логика)
TOOLS/lib/types.go—ParamSpec.IsModifiable(есть,is_modifiableсериализуется в YAML)TOOLS/resource-generator/internal/types/types.go—Param(НЕТ поля IsModifiable)TOOLS/resource-generator/internal/loader/loader.go—ConvertParams(не переносит IsModifiable)TOOLS/resource-generator/internal/params/params.go—ComputeCreateOnly(игнорирует is_modifiable и modifier)TOOLS/resource-generator/internal/templates/instance.go— шаблон, рендерит «Нельзя изменить» из.CreateOnlyParams- YAML:
generated/dev/resources_yaml/22_vc_nsxt.yaml(modify 111 —kind: modifier)
Существующие понятия операции
В YAML операции бывают видов:
kind: instance(create/modify/suspend/resume/delete)kind: modifier(отдельный TF-ресурс,modifyна родительском инстансе, напримерvc_nsxt.network)kind: subresourcekind: action
Цель
Спроектировать единую, простую и понятную модель «изменяемости» параметра, чтобы:
- параметр считался изменяемым, если он изменяем ХОТЯ БЫ через один канал (instance-modify ИЛИ modifier);
- «Нельзя изменить» генерировалось ТОЛЬКО для реально create-only параметров;
is_modifiableиз YAML был единственным источником правды (или явно согласован с каналами modify);- не было противоречий вида «в YAML is_modifiable:true, а в коде «Нельзя изменить»».
Вопросы к Opus
- Какая каноническая модель: вычислять изменяемость по
is_modifiable(флаг из YAML), по наличию кода в любом modify (instance + modifier), или по комбинации? - Где именно проставлять/вычислять флаг — в yaml-generator (при генерации YAML), или в resource-generator (при генерации Go)?
- Как связать modifier-параметры (
vc_nsxt.network) с parent-инстансом (vc_nsxt), чтобы instance знал, чтоneedEnableAVIизменяется через modifier? - Минимальный, без legacy-наслоений, набор правил.
Ответ — кратко, с конкретной архитектурой и точками правки (файл + функция).