fix: destroy route cleanup bug — delete Service+Ingress on trigger/function deletion

- controllers/trigger_controller.go: handleTriggerDeletion теперь удаляет Service
  и Ingress из sless-fn-{ns} при удалении HTTP-триггера
- controllers/function_controller.go: handleDeletion теперь удаляет Service и Ingress
  (имена совпадают с fn.Name); добавлен импорт netv1
- terraform/provider trigger_resource.go: Delete ждёт пока GetTrigger вернёт 404
  (до 90с) — провайдер не возвращает успех раньше чем cleanup завершён
- examples: версия провайдера обновлена до ~> 0.1.11

Operator: naeel/sless-operator:v0.1.17
Provider: v0.1.11

Fixes DESTROY_ROUTE_CLEANUP_BUG.md
This commit is contained in:
“Naeel”
2026-03-09 19:23:28 +04:00
parent 9b4ec729b5
commit 1676bf3c5a
7 changed files with 56 additions and 8 deletions
@@ -209,9 +209,28 @@ func (r *TriggerResource) Delete(ctx context.Context, req resource.DeleteRequest
return
}
if err := r.client.DeleteTrigger(ctx, r.client.Namespace, state.Name.ValueString()); err != nil {
name := state.Name.ValueString()
if err := r.client.DeleteTrigger(ctx, r.client.Namespace, name); err != nil {
resp.Diagnostics.AddError("delete trigger", err.Error())
return
}
// Ждём, пока триггер исчезнет из API.
// Финалайзер контроллера снимается ПОСЛЕ того, как Service+Ingress удалены,
// поэтому когда GetTrigger возвращает nil (404) — маршрут уже убран и endpoint мёртв.
deadline := time.Now().Add(90 * time.Second)
for time.Now().Before(deadline) {
tr, err := r.client.GetTrigger(ctx, r.client.Namespace, name)
if err != nil {
resp.Diagnostics.AddError("wait trigger gone", err.Error())
return
}
if tr == nil {
return // триггер исчез — cleanup завершён
}
time.Sleep(3 * time.Second)
}
resp.Diagnostics.AddError("wait trigger gone", fmt.Sprintf("trigger %s still exists after 90s", name))
}
// trToModel конвертирует API-ответ → state модель.