From cb8389c17fbe64099fb09004550e31a45c219430 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Thu, 24 Sep 2026 10:04:25 +0300 Subject: [PATCH] =?UTF-8?q?docs(plans):=20=C2=A711=20=E2=80=94=20=D0=BE?= =?UTF-8?q?=D1=82=D0=B2=D0=B5=D1=82=D1=8B=20Opus=20=D1=80=D0=B0=D1=83?= =?UTF-8?q?=D0=BD=D0=B4=203=20(=D0=BA=D1=80=D0=B8=D1=82=D0=B5=D1=80=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=BE=D1=82=D0=B1=D0=BE=D1=80=D0=B0=20=3D=20=D1=8F?= =?UTF-8?q?=D0=B2=D0=BD=D1=8B=D0=B9=20=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA?= =?UTF-8?q?=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D0=B5=20=D0=B3?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=B0,=20?= =?UTF-8?q?=D1=80=D0=B5=D0=BB=D0=B8=D0=B7=20A=20=D1=82=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=BA=D0=BE=20(=D0=B1),=20Deprecated=20=D0=B2=D0=BC=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=BE=20=D0=BF=D0=B0=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PLAN_IAC_MODIFY_RESOURCES_2026-09-24.md | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) 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 e9a4e34..c5f231d 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 @@ -83,6 +83,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. +> +> 📌 Раунд 3: §7б выделяется в **отдельный релиз A** (универсально, схема не меняется, non-breaking, +> полностью закрывает инцидент `inconsistent result` на create vc_org). Пункты §7а + §7в — **релиз B** +> вместе с новыми ресурсами. ## 8. Вопросы для ревью Opus @@ -150,3 +154,31 @@ nubes_vc_nsxt → nubes_vc_org_ip_allocation → nubes_vc_nsxt_snat → k8 ли drift у тех, у кого поле было обязательным и уже заполнено? 5. **Порядок релиза.** Правильно ли разводить: релиз A — только (б) (чинит create орги, ничего больше не трогает), релиз B — (а)+(в) вместе с новыми ресурсами-модификаторами? + +--- + +## 11. Ответы Opus (раунд 3) + +1. **Критерий отбора.** Структурный признак «modify-only = есть в `modifyParams`, нет в `createParams`» + (симметрично `ComputeCreateOnly`) — факт спеки, но он ловит **все 5** сервисов и не отличает + «управляется модификатором» от «рабочий Update-атрибут». «Required только в modify» неполон + (пропускает `ipSpaceName`, `required:false`). **Автопризнака не существует — это доменное знание.** + `owned_by_modifier: true` в пер-сервисном YAML — отвергнуть (нарушает канон); + правильно — **явный список в конфиге генератора**. +2. **Безопасность (б): безопасно для всех 5.** Read-back в create кладёт в state пост-create дефолт + (`[{}]`), которого юзер не задавал — это и есть источник `inconsistent result`. Create их и так не шлёт. + **Steady-state Read и Update read-back их по-прежнему перечитывают**, поэтому дрейф не теряется; + (б) убирает только бессмысленную перезапись сразу после create. s3/postgres/zones не страдают. +3. **Существующие конфиги.** Жёстко падать нельзя (схема общая, «владелец» — доменное знание, сломает state). + Правильно — `Deprecated` с текстом «управляется ресурсом `…ip_allocation`» → warning на каждом plan. + Молчаливое прекращение отправки — плохой UX, не делать. Удаление атрибута — только в следующий major. +4. **Снятие Required.** Затрагивает только `vIPConfigure` (`ipSpaceName` уже Optional). + `Optional+Computed` — штатный безопасный переход; `UseStateForUnknown` гасит unknown и drift не создаёт; + у заполненных полей значение удержится через read-back. Борьба за поле снимается (б)+(в). +5. **Порядок релиза — подтверждён:** + - **A — только (б):** универсально, схема не меняется, non-breaking, **полностью закрывает** инцидент + `inconsistent result` на create `nubes_vc_org`; s3/postgres/zones не трогает. + - **B — (а)+(в) + новые ресурсы** (Deprecated на delegated-параметры, отцеп от read-back/send). + +**Следствие для наших решений:** критерий «кто делегируется» задаётся явным списком в конфиге генератора; +работа разбивается на релиз A (маленький, безопасный) и релиз B (ресурсы + отцепка).