From 871e6e8a1dc2e488a2775c8038ec73179792f648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Wed, 11 Mar 2026 17:23:32 +0400 Subject: [PATCH] =?UTF-8?q?docs:=20progress.md=20=E2=80=94=20harbor=20inte?= =?UTF-8?q?gration=20+=20UX=20fixes=20(v0.1.24=E2=80=93v0.1.28)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/progress.md | 93 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/doc/progress.md b/doc/progress.md index dcf3fda..f9ae568 100644 --- a/doc/progress.md +++ b/doc/progress.md @@ -230,3 +230,96 @@ | 6 | `replicas` field в FunctionSpec | Низкий (v1.1) | | 7 | RabbitMQ event triggers | Низкий (v2) | | 8 | Метрики → Victoria Metrics | Низкий | + +--- + +## 2026-03-11 — Harbor integration + Go 1.23 runtime (v0.1.24–v0.1.26) + +### Что сделано + +| # | Компонент | Изменение | +|---|-----------|-----------| +| 1 | `internal/harbor/` | Harbor-клиент: `EnsureProject` создаёт проект перед push образа | +| 2 | `internal/builder/builder.go` | Поддержка `HarborClient`, push в `pearlharbor.registryk8s.services.ngcloud.ru` | +| 3 | `runtimes/go1.23/` | Новый Go 1.23 runtime: `server.go` + `runner.go` + Dockerfile | +| 4 | `internal/builder/context.go` | Go 1.23 в switch; `COPY . /app/handler/` вместо `COPY handler/` | +| 5 | `api/v1alpha1/function_types.go` | `go1.23` в enum поддерживаемых рантаймов | +| 6 | `terraform/provider/` | v0.1.14: `go1.23` в `stringvalidator.OneOf` | +| 7 | `deployments/k8s/operator.yaml` | v0.1.26 | +| 8 | `examples/hello-go/` | Новый пример: HTTP + job на Go 1.23 | +| 9 | `examples/hello-go/code/greeting.go` | Переименован из handler.go, функция `buildGreeting(guestName)` | +| 10 | `examples/pg-list-python/` | Новый пример: Python + PostgreSQL, только HTTP, без job | + +### Docker Hub auth на 192.168.1.220 +- Токен: `dckr_pat_aElN35tdXMBrtOAPraV5Fi0o58s` (сохранён в `secrets/dockerhub.env`, chmod 600) +- `docker login -u naeel --password-stdin` выполнен на remote machine + +### Исправленные баги +- kaniko `COPY handler/ /app/handler/` — файлы в tar-контексте без prefix → исправлено на `COPY .` +- `Decimal` из psycopg2 не сериализуется → `float(row[2])` в `catalog.py` +- Formatter добавил дублирующий `package code` в `greeting.go` — удалён вручную +- CRD в кластере имел только `go1.21` в enum → `kubectl apply` обновлён CRD +- Provider v0.1.13 имел только `go1.21` → пересобран v0.1.14 + +### Git HEAD +``` +d6a2e22 fix: восстановлен requirements.txt после теста +5c6a373 docs: переработан examples/README.md + комментарии function.tf +2ca3137 feat: пример pg-list-python +c4559dd fix: go1.23 build context +78d11ae refactor: rename handler.go→greeting.go +a709b38 feat: go1.23 runtime support +babd8e6 feat: harbor integration +``` + +--- + +## 2026-03-11 — UX улучшения: build logs + JSON для всех HTTP методов (v0.1.27–v0.1.28) + +### Проблемы до исправления + +| Проблема | Симптом | +|---|---| +| Ошибка сборки без деталей | `terraform apply` показывал только `function build failed: build job failed` без причины | +| HTML 501 при DELETE/HEAD/PUT | Python runtime `http.server` не обрабатывал эти методы → HTML-ответ вместо JSON | + +### Что изменили + +#### `controllers/function_controller.go` +- `FunctionReconciler` получил поле `KubeClient kubernetes.Interface` +- Добавлен `getBuildPodLogs(ctx, kube, namespace, jobName)` — читает логи kaniko-пода (последние 50 строк) +- При сбое сборки (`case "failed"`) вызывает `getBuildPodLogs` и включает вывод в `Function.Status.Message` +- Провайдер пробрасывает `Message` в ошибку `terraform apply` — разработчик видит точную причину + +#### `runtimes/python3.11/server.py` +- Выделен `_handle_with_body()` — общий обработчик для методов с телом +- `do_PUT`, `do_DELETE`, `do_PATCH` = `_handle_with_body` — вызывают функцию пользователя +- `do_HEAD` — отдаёт заголовки без тела (HTTP-стандарт; тело вычисляется но не отправляется) +- `send_error()` переопределён → JSON `{"error": "...", "code": N}` вместо HTML 501 +- Runtime пересобран: `naeel/sless-runtime-python3.11:v0.1.2` + +#### `main.go` +- `KubeClient: kubernetes.NewForConfigOrDie(mgr.GetConfig())` передаётся в `FunctionReconciler` + +#### `internal/builder/context.go` +- python3.11 runtime: `v0.1.1` → `v0.1.2` + +### Версии после исправления +- Оператор: `naeel/sless-operator:v0.1.28` +- Python runtime: `naeel/sless-runtime-python3.11:v0.1.2` +- Provider: `terra.k8c.ru/naeel/sless v0.1.14` (без изменений) + +### Результат тестирования + +| Тест | До | После | +|---|---|---| +| `DELETE /fn/...` | HTML 501 | ✅ JSON 200, функция вызывается | +| `HEAD /fn/...` | HTML 501 | ✅ HTTP 200, Content-Type: application/json | +| `PUT /fn/...` | HTML 501 | ✅ JSON 200, функция вызывается | +| Невалидный `requirements.txt` | `build job failed` | ✅ Полный вывод pip включая строку с ошибкой | + +### Git коммиты +``` +6de90ac chore: python runtime v0.1.2 + operator v0.1.28 +3372cb1 fix: build logs in status + JSON for all HTTP methods in python runtime +```