From d5dc1212ba7869d6ad1ea831a7cd1c37ad512257 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Wed, 23 Sep 2026 08:42:01 +0300 Subject: [PATCH] =?UTF-8?q?refactor(yaml-gen):=20=D1=83=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20=D0=B2=D0=BF=D0=BB=D0=B5=D1=82=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BC=D0=BE=D0=B4=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BE=D0=B2=20=E2=80=94=20YAML=20=3D=20=D1=87?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D0=B0=D1=8F=20=D0=BF=D0=BE=D0=BB=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=B2=D1=8B=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B8=D0=B7=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TOOLS/yaml-generator/main.go | 65 +++++++++--------------------------- 1 file changed, 16 insertions(+), 49 deletions(-) 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,