diff --git a/TOOLS/yaml-generator/main.go b/TOOLS/yaml-generator/main.go index 303e8e7..7c74b28 100644 --- a/TOOLS/yaml-generator/main.go +++ b/TOOLS/yaml-generator/main.go @@ -17,45 +17,8 @@ import ( "yaml-generator/internal/normalize" "yaml-generator/internal/spec" "yaml-generator/internal/types" - - "tf-tools/lib" ) -// serviceSpecificModifiers — реестр исключений (ДАННЫЕ, не логика). -// Ключ — стабильное имя сервиса (как в YAML), значение — конфиг modifier-ресурса, -// который генерируется для его операции modify (отложенный modify над инстансом). -// -// ЧТО: операция modify сервиса помечается kind=modifier + modifier=<имя>. -// ЧТО ДЕЛАЕТ: yaml-generator создаёт для неё отдельный ресурс nubes__. -// ПОЧЕМУ: эти modify — отдельный шаг цепочки (аллокация IP / SNAT), их нельзя -// выполнять в том же ресурсе инстанса (чередующаяся зависимость). -// ГДЕ: TOOLS/ARCHITECTURE.md, раздел «Реестр исключений». -// -// DeleteStrategy / Idempotency — поведение модификатора (см. PLAN_modifier_redesign.md). -// DeleteParams — обратные значения (wire-строки) только для DeleteStrategy==inverse. -// -// Добавлять только здесь. Grep-гейт TOOLS/scripts/check_hardcoded_service_ids.sh -// запрещает сравнения svc.ID == N вне этого файла. -type modifierException struct { - ModifierName string - DeleteStrategy string // noop_warn | inverse | error - Idempotency string // none | check_before_run - DeleteParams []lib.DeleteParam -} - -var serviceSpecificModifiers = map[string]modifierException{ - "vc_org": { - ModifierName: "ip_space", - DeleteStrategy: "error", - Idempotency: "check_before_run", - }, - "vc_nsxt": { - ModifierName: "network", - DeleteStrategy: "inverse", - DeleteParams: []lib.DeleteParam{{Code: "needEnableAVI", Value: "false"}}, - }, -} - func main() { cfg, err := config.Load() if err != nil { @@ -104,22 +67,26 @@ func main() { fmt.Fprintf(os.Stderr, " %d operations to fetch...\n", len(info.Operations)) + // === Универсальная выгрузка из API (БЕЗ доменных знаний) === + // + // CollectOperations возвращает операции сервиса ТАКИМИ, КАК ИХ ОТДАЁТ API: + // create/delete/modify/suspend/... с их настоящими действиями и параметрами. + // Здесь НЕЛЬЗЯ привносить доменную семантику (помечать операцию как + // "модификатор", задавать delete_strategy, delete_params и т.п.) — это + // сломало бы главный принцип: YAML должен быть ЧИСТОЙ, ПОЛНОЙ выгрузкой + // того, что доступно по API для сервиса, без каких-либо знаний о слое + // "модификаторов" провайдера. + // + // Раньше (до рефакторинга 2026-09-23) здесь стоял реестр + // `serviceSpecificModifiers`, который помечал отдельные modify как + // kind=modifier. Это было инвазивно: обычные ресурсы зависели от + // доменного реестра, а YAML переставал быть чистой выгрузкой. + // Модификаторы теперь живут ОТДЕЛЬНЫМ оверлеем (см. modifiers.yaml + + // второй проход), базовый YAML их не содержит и не знает о них. ops, hasSuspend, _, _, err := cli.CollectOperations(info.Operations) if err != nil { panic(err) } - for idx := range ops { - if !strings.EqualFold(ops[idx].Action, "modify") { - continue - } - if modCfg, ok := serviceSpecificModifiers[name]; ok { - ops[idx].Kind = "modifier" - ops[idx].Modifier = modCfg.ModifierName - ops[idx].DeleteStrategy = modCfg.DeleteStrategy - ops[idx].Idempotency = modCfg.Idempotency - ops[idx].DeleteParams = modCfg.DeleteParams - } - } specYAML := types.ServiceSpec{ Name: name,