fix: lifecycle bugs A+B (HasError guard, not_created hard error) + bump 5.0.72

This commit is contained in:
“Naeel”
2026-07-16 14:51:01 +04:00
parent f31bedfe05
commit 6929562fc9
5 changed files with 19 additions and 11 deletions
@@ -282,6 +282,11 @@ func (r *{{ToCamel .Name}}Resource) Create(ctx context.Context, req resource.Cre
{{- end }}
domainServiceIDs := []int{ {{- range .DomainServiceIDs }}{{.}}, {{- end }} }
resp.Diagnostics.Append(resources_core.CreateExistingResourceDiagnosticsWithDomainAndServices(ctx, r.client, {{.ServiceID}}, resourceName, data.AdoptExistingOnCreate.ValueBool(), desiredDomain, domainServiceIDs)...)
// ⛔ Проверяем HasError ДО create — при hard-error (running без adopt, suspend без adopt,
// not created, конфликт) сайд-эффект create не должен выполняться.
if resp.Diagnostics.HasError() {
return
}
params := map[int]string{
{{- range .CreateParams }}
@@ -607,4 +612,3 @@ func (r *{{ToCamel .Name}}Resource) Configure(_ context.Context, req resource.Co
r.client = client
}
`
@@ -319,3 +319,11 @@ type PostgresClusterConfigurationModel struct {
**Сначала закрыть A и B, потом продолжать SubParams.**
Строить вложенные параметры поверх Create, который выполняет сайд-эффекты
вопреки собственным диагностикам — рискованно.
### Статус исправлений (2026-07-16):
| Баг | Файл | Статус |
|-----|------|--------|
| A: HasError guard | `instance.go` (шаблон Create) | ✅ исправлен |
| B: not_created → hard error | `provider/internal/resources_core/crud.go` | ✅ исправлен |
| Комментарий «warnings» | `resource_diagnostics.go` | ✅ исправлен |
+4 -8
View File
@@ -153,14 +153,10 @@ func adoptExistingInstanceOnCreate(ctx context.Context, client *core.UniversalCl
switch state {
case StateNotCreated:
// P0.2: авто-cleanup orphan-инстанса при adopt_existing_on_create=true.
unlock := client.LockInstance(existing.InstanceUid)
defer unlock()
if err := client.RunInstanceOperationUniversal(ctx, existing.InstanceUid, "delete", nil); err != nil {
return "", fmt.Errorf("не удалось авто-удалить orphan-инстанс %s (статус: %s): %w. %s",
existing.InstanceUid, statusText, err, formatInstanceDetails(existing, serviceID, displayName))
}
return client.CreateGenericInstanceUniversalV6(ctx, serviceID, displayName, params)
// Философия (provider_philosophy.md раздел 8): not created → hard error,
// без auto-adopt/create. Пользователь должен проверить ресурс в ЛК.
return "", fmt.Errorf("инстанс %s в статусе 'not created' — проверьте ресурс в личном кабинете Nubes. %s",
existing.InstanceUid, formatInstanceDetails(existing, serviceID, displayName))
case StateRunning, StateRunningPending:
refIssues, err := ValidateRefParamsOnAdopt(ctx, client, serviceID, params, existing.InstanceUid)
@@ -61,7 +61,7 @@ func PlanExistingResourceDiagnostics(ctx context.Context, client *core.Universal
return diags
}
// CreateExistingResourceDiagnostics returns warnings for existing resources during create.
// CreateExistingResourceDiagnostics returns diagnostics (errors for conflicts, warnings for adopt) during create.
func CreateExistingResourceDiagnostics(ctx context.Context, client *core.UniversalClient, serviceID int, resourceName string, adoptExistingOnCreate bool) diag.Diagnostics {
return CreateExistingResourceDiagnosticsWithDomain(ctx, client, serviceID, resourceName, adoptExistingOnCreate, "")
}
+1 -1
View File
@@ -17,7 +17,7 @@ import (
)
var (
version string = "5.0.71"
version string = "5.0.72"
)
func main() {