refactor(yaml-gen): убрать вплетение модификаторов — YAML = чистая полная выгрузка из API
This commit is contained in:
@@ -17,45 +17,8 @@ import (
|
|||||||
"yaml-generator/internal/normalize"
|
"yaml-generator/internal/normalize"
|
||||||
"yaml-generator/internal/spec"
|
"yaml-generator/internal/spec"
|
||||||
"yaml-generator/internal/types"
|
"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() {
|
func main() {
|
||||||
cfg, err := config.Load()
|
cfg, err := config.Load()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -104,22 +67,26 @@ func main() {
|
|||||||
|
|
||||||
fmt.Fprintf(os.Stderr, " %d operations to fetch...\n", len(info.Operations))
|
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)
|
ops, hasSuspend, _, _, err := cli.CollectOperations(info.Operations)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
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{
|
specYAML := types.ServiceSpec{
|
||||||
Name: name,
|
Name: name,
|
||||||
|
|||||||
Reference in New Issue
Block a user