diff --git a/TOOLS/resource-generator/internal/templates/instance.go b/TOOLS/resource-generator/internal/templates/instance.go index 7e2c617..50dd4de 100644 --- a/TOOLS/resource-generator/internal/templates/instance.go +++ b/TOOLS/resource-generator/internal/templates/instance.go @@ -218,57 +218,16 @@ func (r *{{ToCamel .Name}}Resource) ModifyPlan(ctx context.Context, req resource {{- end }} {{- end }} - if config.ResourceName.IsNull() || config.ResourceName.IsUnknown() { - return - } - adoptExistingOnCreate := false - if !config.AdoptExistingOnCreate.IsNull() && !config.AdoptExistingOnCreate.IsUnknown() { - adoptExistingOnCreate = config.AdoptExistingOnCreate.ValueBool() - } - {{- if .HasRefSvcParams }} - {{- range .CreateParams }} - {{- if and (gt .RefSvcId 0) (eq (ParamType .) "types.String") }} - // refSvc-поле резолвим только для API-запроса. - // config не перезаписываем: пользовательский display name или UUID должен - // пройти в state ровно в том виде, в котором его передал Terraform. - resolved{{ToCamel .Code}} := config.{{ToCamel .Code}}.ValueString() - if !config.{{ToCamel .Code}}.IsNull() && !config.{{ToCamel .Code}}.IsUnknown() { - var err error - resolved{{ToCamel .Code}}, err = r.client.ResolveRefSvcParamValue(ctx, {{.RefSvcId}}, config.{{ToCamel .Code}}.ValueString()) - if err != nil { - resp.Diagnostics.AddWarning("Failed to resolve {{ToSnake .Code}}", err.Error()) - } - } - {{- end }} - {{- end }} - {{- end }} - params := map[int]string{ - {{- range .CreateParams }} - {{- if not (IsNested .) }} - {{- if and (gt .RefSvcId 0) (eq (ParamType .) "types.String") }} - {{.ID}}: resolved{{ToCamel .Code}}, - {{- else }} - {{.ID}}: {{ParamFormat . (printf "config.%s" (ToCamel .Code))}}, - {{- end }} - {{- end }} - {{- end }} - } - {{- range .CreateParams }} - {{- if (IsNested .) }} - if config.{{ToCamel .Code}} != nil { - params[{{.ID}}] = {{NestedJSONExpr . "config"}} - } - {{- end }} - {{- end }} - desiredDomain := "" - {{- if .HasDomainParam }} - if !config.Domain.IsNull() && !config.Domain.IsUnknown() { - desiredDomain = config.Domain.ValueString() - } - {{- end }} - domainServiceIDs := []int{ {{- range .DomainServiceIDs }}{{.}}, {{- end }} } - - resp.Diagnostics.Append(resources_core.PlanExistingResourceDiagnosticsWithParamsAndDomainAndServices(ctx, r.client, {{.ServiceID}}, config.ResourceName.ValueString(), adoptExistingOnCreate, params, desiredDomain, domainServiceIDs, {{.SupportsSuspendDestroy}})...) + // ⛔ Create-time проверка существования/усыновления здесь СОЗНАТЕЛЬНО НЕ вызывается. + // + // Причина: при tainted-ресурсе Terraform планирует ЗАМЕНУ (destroy+create), и + // create-узел замены приходит в ModifyPlan с prior state = null — ровно как у + // нового ресурса. Отличить «замену» от «создания» на этом уровне невозможно, + // поэтому проверка «РЕСУРС С ТАКИМ ИМЕНЕМ УЖЕ СУЩЕСТВУЕТ» ложно срабатывала на + // ещё не удалённый инстанс и блокировала plan/destroy. + // + // Проверка осталась в Create (CreateExistingResourceDiagnosticsWithDomainAndServices): + // на apply она выполняется ПОСЛЕ удаления старого инстанса, поэтому конфликта уже нет. } func (r *{{ToCamel .Name}}Resource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {