docs: аудит lifecycle от Соннета — 2 крит. бага (HasError guard, not_created)

This commit is contained in:
“Naeel”
2026-07-16 14:48:10 +04:00
parent d7e75c78b4
commit f31bedfe05
@@ -279,3 +279,43 @@ type PostgresClusterConfigurationModel struct {
Подполя имеют `value_list` (например `replicas: [1,3,5,7]`, `version: ["17","16"]`).
Генерация enum-валидаторов — на этом этапе не делать. Оставить на будущее.
---
## Блок 5. Аудит lifecycle-логики (Соннет, 2026-07-16)
**Вывод: база корректна, но есть 2 критичных бага.**
### 5.1 — ПРОБЛЕМА A: нет HasError()-guard в Create (КРИТИЧНО)
**Где:** `instance.go`, функция Create, строка ~260.
После вызова `resp.Diagnostics.Append(resources_core.CreateExistingResourceDiagnosticsWithDomainAndServices(...))`
код сразу идёт к `CreateResourceWithTimeout` **без проверки `HasError()`**.
При hard-error (running без adopt, suspend без adopt, not created) побочный API-вызов
всё равно выполнится — сайд-эффект уже случился.
**Как должно быть:** после append диагностик — `if resp.Diagnostics.HasError() { return }`.
### 5.2 — ПРОБЛЕМА B: not created → auto-delete+create (КРИТИЧНО)
**Где:** `resources_core/crud.go`, `adoptExistingInstanceOnCreate`.
Философия (раздел 8): `not created → hard error «проверьте ресурс в ЛК», без auto-create`.
Но `adoptExistingInstanceOnCreate` при статусе `StateNotCreated` **авто-удаляет orphan и создаёт заново**.
В сочетании с Проблемой A этот destructive сайд-эффект может выполниться несмотря на ошибку в диагностиках.
**Как должно быть:** либо убрать ветку (следовать философии), либо развести `not created` и `orphaned`.
### 5.3 — Комментарий «returns warnings» (минор)
`CreateExistingResourceDiagnostics` комментирует «returns warnings», но делает `AddError`.
Это корень путаницы с отсутствующим guard. Исправить комментарий.
### Рекомендация Соннета:
**Сначала закрыть A и B, потом продолжать SubParams.**
Строить вложенные параметры поверх Create, который выполняет сайд-эффекты
вопреки собственным диагностикам — рискованно.