diff --git a/TOOLS/resource-generator/internal/templates/instance.go b/TOOLS/resource-generator/internal/templates/instance.go index 3e7d521..9c93bcc 100644 --- a/TOOLS/resource-generator/internal/templates/instance.go +++ b/TOOLS/resource-generator/internal/templates/instance.go @@ -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 } ` - diff --git a/docs/TODO/resource_generator_refactor_plan.md b/docs/TODO/resource_generator_refactor_plan.md index 4f4f18c..31126a8 100644 --- a/docs/TODO/resource_generator_refactor_plan.md +++ b/docs/TODO/resource_generator_refactor_plan.md @@ -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` | ✅ исправлен | diff --git a/provider/internal/resources_core/crud.go b/provider/internal/resources_core/crud.go index 3c7ac07..f18cb02 100644 --- a/provider/internal/resources_core/crud.go +++ b/provider/internal/resources_core/crud.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) diff --git a/provider/internal/resources_core/resource_diagnostics.go b/provider/internal/resources_core/resource_diagnostics.go index 5c0fc81..3299c15 100644 --- a/provider/internal/resources_core/resource_diagnostics.go +++ b/provider/internal/resources_core/resource_diagnostics.go @@ -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, "") } diff --git a/provider/main.go b/provider/main.go index 6ce236b..f381513 100644 --- a/provider/main.go +++ b/provider/main.go @@ -17,7 +17,7 @@ import ( ) var ( - version string = "5.0.71" + version string = "5.0.72" ) func main() {