refactor(yaml-gen): убрать вплетение модификаторов — YAML = чистая полная выгрузка из API

This commit is contained in:
Repinoid
2026-09-23 08:42:01 +03:00
parent 016b7d246a
commit d5dc1212ba
+16 -49
View File
@@ -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_<svc>_<modifier>.
// ПОЧЕМУ: эти 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,