fix: lifecycle bugs A+B (HasError guard, not_created hard error) + bump 5.0.72
This commit is contained in:
@@ -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` | ✅ исправлен |
|
||||
|
||||
@@ -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
@@ -17,7 +17,7 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
version string = "5.0.71"
|
||||
version string = "5.0.72"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
Reference in New Issue
Block a user