refactor(yaml-gen): убрать вплетение модификаторов — YAML = чистая полная выгрузка из API
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user