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
+55 -1
View File
@@ -1,6 +1,6 @@
# API Design
Последнее обновление: 2026-03-18
Последнее обновление: 2026-03-21
## Базовый URL
@@ -23,6 +23,12 @@ DELETE /v1/namespaces/{ns}/functions/{name}
POST /v1/namespaces/{ns}/functions/{name}/upload
GET /v1/namespaces/{ns}/functions/{name}/source ← файлы кода из S3 tar.gz (JSON)
GET /v1/namespaces/{ns}/functions/{name}/invocations
GET /v1/namespaces/{ns}/services
POST /v1/namespaces/{ns}/services
GET /v1/namespaces/{ns}/services/{name}
PUT /v1/namespaces/{ns}/services/{name}
DELETE /v1/namespaces/{ns}/services/{name}
GET /v1/namespaces/{ns}/services/{name}/source ← файлы кода из S3 tar.gz (JSON)
GET /v1/namespaces/{ns}/triggers
POST /v1/namespaces/{ns}/triggers
GET /v1/namespaces/{ns}/triggers/{name}
@@ -33,6 +39,12 @@ GET /v1/namespaces/{ns}/jobs/{name}
DELETE /v1/namespaces/{ns}/jobs/{name}
```
**Вызов функций (публичный, без auth):**
```
POST https://sless.kube5s.ru/fn/{namespace}/{service-name} ← прокси к Deployment
```
**Глобальный сервис funcs (не оператор):**
```
@@ -158,3 +170,45 @@ field: code = <zip-file>
"created_at": "..."
}
```
## Модель Service (sless_service — always-on Deployment)
`sless_service` — долгоживущая функция. Деплоится как Kubernetes Deployment + Service + Ingress.
Вызывается через `POST /fn/{namespace}/{name}` без авторизации (прокси напрямую к поду).
```json
{
"name": "pg-info",
"display_name": "PostgreSQL Info",
"description": "Возвращает список таблиц",
"runtime": "python3.11",
"entrypoint": "handler.handle",
"memory_mb": 128,
"timeout_sec": null,
"env_vars": {"DB_HOST": "..."},
"status": "Ready",
"image_ref": "pearlharbor.../naeel/pg-info:abc123",
"invoke_url": "https://sless.kube5s.ru/fn/sless-ffd1f598c169b0ae/pg-info"
}
```
### Поле `timeout_sec`
| Значение | Поведение |
|----------|-----------|
| `null` / не задано | Без ограничений — функция выполняется любое время |
| `1900` | Таймаут в секундах (+ 5s grace на стороне прокси) |
| `< 0` или `> 900` | HTTP 400 Bad Request |
> **Примечание:** Поле опциональное (Optional в Terraform). Не указывать = без лимита.
> В Terraform state значение `null` означает "лимит не задан" (не путать с `0`).
> В Kubernetes CRD `TimeoutSec: 0` → лимита нет (поле omitempty).
### Invoke прокси (как работает timeout_sec)
Оператор принимает `POST /fn/{ns}/{name}`, находит Service CRD, проксирует запрос
к `http://{name}.sless-fn-{ns}.svc.cluster.local:8080`.
Если `TimeoutSec > 0` — создаёт `http.Client{Timeout: TimeoutSec*s + 5s}`.
Если `TimeoutSec == 0``http.Client{}` (Go: Timeout=0 → отсутствие дедлайна).