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 }}
|
{{- end }}
|
||||||
domainServiceIDs := []int{ {{- range .DomainServiceIDs }}{{.}}, {{- end }} }
|
domainServiceIDs := []int{ {{- range .DomainServiceIDs }}{{.}}, {{- end }} }
|
||||||
resp.Diagnostics.Append(resources_core.CreateExistingResourceDiagnosticsWithDomainAndServices(ctx, r.client, {{.ServiceID}}, resourceName, data.AdoptExistingOnCreate.ValueBool(), desiredDomain, domainServiceIDs)...)
|
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{
|
params := map[int]string{
|
||||||
{{- range .CreateParams }}
|
{{- range .CreateParams }}
|
||||||
@@ -607,4 +612,3 @@ func (r *{{ToCamel .Name}}Resource) Configure(_ context.Context, req resource.Co
|
|||||||
r.client = client
|
r.client = client
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
|
|||||||
@@ -319,3 +319,11 @@ type PostgresClusterConfigurationModel struct {
|
|||||||
**Сначала закрыть A и B, потом продолжать SubParams.**
|
**Сначала закрыть A и B, потом продолжать SubParams.**
|
||||||
Строить вложенные параметры поверх Create, который выполняет сайд-эффекты
|
Строить вложенные параметры поверх 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 {
|
switch state {
|
||||||
case StateNotCreated:
|
case StateNotCreated:
|
||||||
// P0.2: авто-cleanup orphan-инстанса при adopt_existing_on_create=true.
|
// Философия (provider_philosophy.md раздел 8): not created → hard error,
|
||||||
unlock := client.LockInstance(existing.InstanceUid)
|
// без auto-adopt/create. Пользователь должен проверить ресурс в ЛК.
|
||||||
defer unlock()
|
return "", fmt.Errorf("инстанс %s в статусе 'not created' — проверьте ресурс в личном кабинете Nubes. %s",
|
||||||
if err := client.RunInstanceOperationUniversal(ctx, existing.InstanceUid, "delete", nil); err != nil {
|
existing.InstanceUid, formatInstanceDetails(existing, serviceID, displayName))
|
||||||
return "", fmt.Errorf("не удалось авто-удалить orphan-инстанс %s (статус: %s): %w. %s",
|
|
||||||
existing.InstanceUid, statusText, err, formatInstanceDetails(existing, serviceID, displayName))
|
|
||||||
}
|
|
||||||
return client.CreateGenericInstanceUniversalV6(ctx, serviceID, displayName, params)
|
|
||||||
|
|
||||||
case StateRunning, StateRunningPending:
|
case StateRunning, StateRunningPending:
|
||||||
refIssues, err := ValidateRefParamsOnAdopt(ctx, client, serviceID, params, existing.InstanceUid)
|
refIssues, err := ValidateRefParamsOnAdopt(ctx, client, serviceID, params, existing.InstanceUid)
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ func PlanExistingResourceDiagnostics(ctx context.Context, client *core.Universal
|
|||||||
return diags
|
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 {
|
func CreateExistingResourceDiagnostics(ctx context.Context, client *core.UniversalClient, serviceID int, resourceName string, adoptExistingOnCreate bool) diag.Diagnostics {
|
||||||
return CreateExistingResourceDiagnosticsWithDomain(ctx, client, serviceID, resourceName, adoptExistingOnCreate, "")
|
return CreateExistingResourceDiagnosticsWithDomain(ctx, client, serviceID, resourceName, adoptExistingOnCreate, "")
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -17,7 +17,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
version string = "5.0.71"
|
version string = "5.0.72"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
Reference in New Issue
Block a user