4.3 KiB
4.3 KiB
Inverse-откат модификаторов: анализ ответа Опуса — 2026-09-23
Источник: prompt_for_opus_inverse_architecture.md → ответ Опуса (принят, анализ ниже).
Принятые решения (по Опусу)
- Модель delete_params → заменить плоский
{Code, Value}на{Code, Mode, Value?}:Mode: static— значение изValue(дефолт, обратная совместимость).Mode: zero_count— обнулить integer-поля в элементах array-map-fixed, взяв live.
- Баланс данные/логика: форма преобразования выводится из
dataType(boolean→"false", array-map-fixed→zero integer); сентинелы-значения — ТОЛЬКО данные в реестре. - Маркер поля: явный
zero_fields:["count"](или флаг на sub_param), а НЕ «обнулить все integer» (риск: порт/приоритет/индекс в том же object). - Порядок destroy — обратный порядок создания из
depends_on.
Мои замечания к ответу (что Опуc недоговорил)
- A. Граф уже правильный. Факт:
edge_net(SNAT) зависит отorg_ips(IP),org_ips— отedge. Обратный порядок destroy:edge_net → org_ips → edge → vdcуже корректен. Рекомендация Опуса «сделать ip_space зависимым от edge_net» — перепутана направлением; граф уже такой. - B. Источник live для zero_count в Delete не указан.
Deleteмодификатора имеет только TFstate, а livevIPConfigureнадо читать черезGetInstanceStateParamsв рантайме Delete. - C. Отличие sentinel от имени в valueList не разобрано (valueList без разметки sentinel в данных API).
- D. Идемпотентность zero_count при повторном destroy не поднята (count=0 → снова 0: no-op?).
Открытые вопросы (второй раунд к Опусу) — ЗАКРЫТЫ
- Источник live для zero_count в Delete →
GetInstanceStateParams(не TF state). ✅ - Sentinel в valueList → явный
off_value:"no-needed"в реестре (данные, не логика). ✅ - Идемпотентность zero_count → пропускать
run, если live ужеcount=0(применимо и к static). ✅ - count=0 → канонический inverse; полное удаление ipSpace = отдельный опциональный
Mode:remove(не подменять zero_count). ✅
ИТОГ — финальная модель inverse
delete_params: []{ Code, Mode, Value?, zero_fields?, off_value? }
Mode: static— обратное значение =Value(boolean→"false"; string→off_value).Mode: zero_count— взять live array-map-fixed, обнулить поля изzero_fields:["count"].Mode: remove(опц., не для FullPipe) — полное удаление элемента.
Рантайм: Delete → GetInstanceStateParams → построить inverse → если live уже целевое → no-op (skip run) → иначе modify.
Реестр (yaml-generator main.go):
vc_org.ip_space:inverse, paramvIPConfigureMode:zero_count, zero_fields:[count].vc_nsxt.network:inverse, paramsneedEnableAVI=static"false",ipSpaceName=static off_value"no-needed".
Порядок destroy (уже корректен в .tf): edge_net → org_ips → edge → vdc.
Факты (не менять, проверено)
count=0принимается API (minvalue:1 в схеме — не отвергает), идемпотентно (ORG_IP_MODIFIER_TEST_2026-09-22).- SNAT off =
ipSpaceName="no-needed"(sentinel в valueList, HAR_SNAT_MODIFY_FINDINGS). needEnableAVIboolean → inverse"false".- vc_org.ip_space:
error→ нуженinverse(zero_count). vc_nsxt.network: inverse+staticneedEnableAVI=false, добавитьipSpaceName="no-needed".