feat(service): timeout_sec без дефолта; 0=нет таймаута; operator v0.1.48

- api/v1alpha1/service_types.go: убрать +kubebuilder:default=30
- invoke.go: TimeoutSec=0 → &http.Client{} (без таймаута)
- services.go: валидация timeout_sec < 0 || > 900 → HTTP 400
- service_resource.go: TF schema Optional (без Computed); 0 → Int64Null()
- deployments/k8s/operator.yaml: v0.1.47 → v0.1.48
- doc/: progress.md + api/design.md (модель Service) + decisions/log.md
- examples/POSTGRES/: bug_hunter.sh, chaos_marathon.sh, chaos_marathon.tf
This commit is contained in:
Naeel
2026-03-21 16:58:43 +03:00
parent 7f7aa44e59
commit b86ff3a62e
37 changed files with 2493 additions and 50 deletions
+35
View File
@@ -2,6 +2,41 @@
---
## 2026-03-21 — timeout_sec для sless_service: 0 = нет лимита (не 30s по умолчанию)
### Контекст
В `api/v1alpha1/service_types.go` поле `TimeoutSec` имело `+kubebuilder:default=30`.
В `invoke.go` при `TimeoutSec == 0` был хардкод `35 * time.Second` как дефолтный клиент.
Пользователь хотел ввести таймаут как **опциональный** параметр: если не указан — длинные/бесконечные функции работают без ограничений. Дефолт 30s ломал это намерение.
### Решение
`TimeoutSec = 0` → «нет ограничения». Убраны все механизмы дефолтного таймаута:
1. `+kubebuilder:default=30` удалён из CRD — поле 0 по умолчанию в Go (zero value)
2. `invoke.go`: `if timeoutSec <= 0 { return &http.Client{} }` — Go Timeout=0 = нет дедлайна
3. `services.go`: валидация `< 0 || > 900` → 400 Bad Request (0 разрешён)
4. Terraform schema: убрано `Computed: true`; `svcToModel`: `0 → Int64Null()` (null в state)
### Почему именно так
- **0 = нет лимита** — стандарт в Go для http.Client.Timeout (явно задокументировано в stdlib)
- **null в Terraform** вместо 0 — чтобы пользователь видел "не задано", а не "0 секунд"
- **Computed убрано** — поле не знает своего значения пока пользователь не задал явно; Computed означало бы "оператор сам решит" что неверно
- **Диапазон 1–900** — верхний предел защищает от бесконечных зависших запросов в Production (15 минут достаточно для любой serverless задачи)
### Затронутые файлы
| Файл | Что изменено |
|------|-------------|
| `api/v1alpha1/service_types.go` | Убран `+kubebuilder:default=30`, добавлен комментарий |
| `internal/api/handler/invoke.go` | `invokeHTTPClient(0)``&http.Client{}` |
| `internal/api/handler/services.go` | Валидация в CreateService и UpdateService |
| `terraform/provider/internal/resources/service_resource.go` | Schema + svcToModel |
---
## 2026-03-21 — Объединить sless_function и sless_service в единый пользовательский листинг
### Контекст