diff --git a/NOTES/10_plans/PLAN_IAC_MODIFY_RESOURCES_2026-09-24.md b/NOTES/10_plans/PLAN_IAC_MODIFY_RESOURCES_2026-09-24.md index 49c9a56..eb3cb11 100644 --- a/NOTES/10_plans/PLAN_IAC_MODIFY_RESOURCES_2026-09-24.md +++ b/NOTES/10_plans/PLAN_IAC_MODIFY_RESOURCES_2026-09-24.md @@ -33,8 +33,8 @@ nubes_k8s_shturval_cluster | Атрибуты | `org_uid` — String, Required; `vip_configure` — String (JSON `[{"name":..,"count":..}]`), Required, нормализация JSON как в `resources_core/json_planmodifier.go`; `keep_on_destroy` — Bool, Optional, default `false` | | ID | `org_uid` (один ресурс на оргу; массив целиком) | | Create/Update | `modify` на инстансе орги: `vIPConfigure` = JSON-массив целиком (replace-семантика). Путь: `core.RunInstanceOperationUniversalByCode` (или обёртка `resources_core`), под `LockInstance(org_uid)` | -| Read | `core.GetInstanceStateParams(org_uid)` → ключ `vIPConfigure`; пустое/`[{}]`/`count=0` → нормализовать; родитель 404/deleted → `RemoveResource` (`resources_core.ShouldRemoveFromState`) | -| Delete | `keep_on_destroy=true` → no-op + Warning. Иначе: родитель жив → modify с `count=0` по каждому элементу (форма **проверена** тестом 09-22) + Warning; родитель мёртв → no-op + Warning | +| Read | `core.GetInstanceStateParams(org_uid)` → ключ `vIPConfigure`; пустое/`[{}]`/`count=0` → нормализовать; родитель 404/deleted → `RemoveResource` (`resources_core.ShouldRemoveFromState`). **Нужен нормализующий planmodifier** (аналог JSON-модификатора), иначе вечный дрейф при плановом 3→0 (ревью Opus, п.3) | +| Delete | `keep_on_destroy=true` → no-op + Warning. Иначе: родитель жив → modify с `count="0"` по каждому элементу (**строкой**, как в HAR; форма проверена тестом 09-22) + Warning; родитель мёртв → no-op + Warning. Массив `[]` НЕ отправлять — не проверен (ревью Opus, п.2) | | Import | passthrough по `org_uid` | ## 4. Ресурс 2 — `nubes_vc_nsxt_snat` @@ -80,6 +80,10 @@ nubes_vc_nsxt → nubes_vc_org_ip_allocation → nubes_vc_nsxt_snat → k8 **Не реализуем в этом этапе** — ждём решения пользователя (правка генератора задевает все сервисы). +> ⚠️ По ревью Opus (2026-09-24) пункт **§7б — обязательное условие**, а не опциональное: +> без исключения modify-only из create-read-back при переходном варианте будет борьба за поле +> между instance-ресурсом и модификатором. Пункт остаётся обязательным follow-up. + ## 8. Вопросы для ревью Opus 1. Верно ли, что `RunInstanceOperationUniversalByCode` дозаполняет незаданные параметры из **live `state.params`** @@ -92,3 +96,31 @@ nubes_vc_nsxt → nubes_vc_org_ip_allocation → nubes_vc_nsxt_snat → k8 когда значение выставил модификатор, а instance-ресурс его только читает? 5. Достаточно ли `depends_on` (SNAT → org-IP) для корректного destroy, если org-IP-модификатор должен уничтожиться **до** эджа? Нужны ли дополнительные рёбра? + +--- + +## 9. Ревью Opus (2026-09-24, отдельный чат) + +**Вердикт фактуры:** оба документа (план и `HAR_FRESH_CREATE_2026-09-24.md`) проверены по коду — факты верны, +ссылки на пути точны. + +**Ответы на вопросы §8:** + +1. **Подтверждено кодом.** `operation_run_bycode.go:108-142` дозаполняет все незаданные параметры по приоритету + **live `state.params` → `paramValue` формы → `defaultValue`**; если ничего нет — параметр пропускается. + SNAT-ресурс может шлать только 372, pre-read+merge НЕ нужен. +2. Слать `[{name, count:"0"}]`. `[]` не проверен, риск пустого payload/reset. +3. `count="0"`, `[{}]`, пустой массив — одно состояние «пусто» при Read. Иначе `[{}]` после create даёт ложный + дрейф; и для случая 3→0 нужен нормализующий planmodifier. +4. **Дрейф возможен** в переходном варианте (борьба за поле с read-back instance-ресурса) → §7б обязателен. +5. `depends_on` достаточно: TF развернёт граф, SNAT уничтожится до org-IP. Доп. рёбер не нужно при условии, + что оба модификатора зависят от `nubes_vc_nsxt`, а кластер — от SNAT. + +**Замечания кодеру:** +- Два новых ресурса **не закрывают** инцидент `inconsistent result` на `nubes_vc_org` (Required-поле остаётся): + §7 — обязательный follow-up, не «потом». +- `count` в payload — **строка** `"0"` (в HAR всегда строка); зафиксировать тип явно. +- Стенд: орга **`saas`**, иначе коллизия `WZ03709-iaas`. + +**Фиксатор:** эпоха `kind: modifier` отменена — ветку не переиспользовать; новые ресурсы hand-written +в `resources_core`, без реестра модификаторов.