docs: update progress.md, errors/log.md; add gitignore for dist/ and tfstate backups
- doc/progress.md: обновлена версия до operator v0.1.18 / provider v0.1.11, добавлен блок source_dir + fix destroy cleanup (2026-03-09), уточнены комментарии к контроллерам и trigger_resource - doc/errors/log.md: добавлены две записи — source_dir/hashicorp/archive, destroy route cleanup bug (три причины + решения) - .gitignore: добавлены examples/*/dist/ и terraform.tfstate.*.backup - examples/: удалены dist/ zip и tfstate.*.backup из трекинга
This commit is contained in:
@@ -78,6 +78,37 @@ if tr.Schedule != "" {
|
||||
|
||||
---
|
||||
|
||||
## 2026-03-09 — source_dir: hashicorp/archive недоступен без VPN
|
||||
|
||||
**Проблема:** С VPN недоступен `kube5s.ru` (registry провайдера), без VPN — `registry.terraform.io` (hashicorp/archive). Примеры не работали ни с VPN ни без.
|
||||
|
||||
**Причина:** Зависимость от внешнего провайдера `hashicorp/archive` для создания zip.
|
||||
|
||||
**Решение:** Добавить атрибут `source_dir` в `sless_function`. Провайдер сам упаковывает директорию в zip (`archive/zip` in-memory), считает SHA256 (`crypto/sha256`). Файлы сортируются для детерминированного хэша. `hashicorp/archive` убран из всех примеров.
|
||||
|
||||
**Provider:** v0.1.10.
|
||||
|
||||
---
|
||||
|
||||
## 2026-03-09 — Destroy route cleanup bug: endpoint 502 после terraform destroy
|
||||
|
||||
**Проблема:** После `terraform destroy` публичный HTTP-эндпоинт продолжал отвечать — сначала 200, затем 502 `function unreachable`. Тестовый скрипт ждал 120 секунд и падал.
|
||||
|
||||
**Причина:** Три независимые проблемы в связке:
|
||||
1. `trigger_controller.go` `handleTriggerDeletion` намеренно не удалял Service и Ingress (комментарий «оставляем — могут быть нужны другим триггерам»). Неверно: имена Service/Ingress совпадают с именем функции, а не триггера.
|
||||
2. `function_controller.go` `handleDeletion` удалял только Deployment, не трогал Service и Ingress.
|
||||
3. `invoke.go` при DNS NXDOMAIN (`no such host`) возвращал 502, а тестовый скрипт ждёт 404. Итог: Ingress висел вечно → 502 висел 120с.
|
||||
|
||||
**Решение:**
|
||||
1. `handleTriggerDeletion`: для HTTP-триггеров явно удалять `Service` и `Ingress` с именем `fn.Spec.FunctionRef` в `sless-fn-{ns}`.
|
||||
2. `handleDeletion`: добавить удаление `Service` и `Ingress` с именем `fn.Name` в `sless-fn-{ns}` (импорт `netv1`).
|
||||
3. `trigger_resource.go` Delete: polling `GetTrigger` каждые 3с до 90с — провайдер не возвращает успех раньше завершения cleanup.
|
||||
4. `invoke.go`: `no such host` → HTTP 404 вместо 502 — Service удалён, эндпоинт мёртв.
|
||||
|
||||
**Operator:** v0.1.17 (контроллеры), v0.1.18 (invoke.go). **Provider:** v0.1.11.
|
||||
|
||||
---
|
||||
|
||||
## 2026-03-07 — Terraform Provider: "Resource Import Not Implemented"
|
||||
|
||||
**Проблема:** После failed `terraform apply` (Function создалась, Trigger упал) state не содержал созданных ресурсов. Повторный apply падал с `status 409: function already exists`. `terraform import` тоже не работал:
|
||||
|
||||
+16
-5
@@ -1,6 +1,6 @@
|
||||
# Прогресс разработки
|
||||
|
||||
Последнее обновление: 2026-03-08 (operator v0.1.12, provider v0.1.5)
|
||||
Последнее обновление: 2026-03-09 (operator v0.1.18, provider v0.1.11)
|
||||
|
||||
## Статусы: ✅ готово | 🔄 в процессе | ⏳ не начато
|
||||
|
||||
@@ -19,10 +19,10 @@
|
||||
| 5 | internal/storage/postgres | ✅ | store.go: SaveInvocation, ListInvocations, RunMigrations |
|
||||
| 6 | internal/storage/s3 | ✅ | client.go: Upload, Download, Delete, EnsureBucket (Ceph S3) |
|
||||
| 7 | internal/builder | ✅ | builder.go: kaniko Jobs для сборки образов функций |
|
||||
| 8 | controllers/function_controller.go | ✅ | Pending→Building(kaniko)→Ready/Failed, Deployment, finalizer |
|
||||
| 9 | controllers/trigger_controller.go | ✅ | HTTP→Service+Ingress (fallback) или прокси через ExternalURL, Cron→CronJob, finalizer |
|
||||
| 8 | controllers/function_controller.go | ✅ | Pending→Building(kaniko)→Ready/Failed, Deployment, finalizer; handleDeletion удаляет Service+Ingress |
|
||||
| 9 | controllers/trigger_controller.go | ✅ | HTTP→Service+Ingress (fallback) или прокси через ExternalURL, Cron→CronJob, finalizer; handleTriggerDeletion удаляет Service+Ingress |
|
||||
| 10 | internal/api/router.go | ✅ | gorilla/mux, /v1/namespaces/{ns}/... (auth), /fn/{ns}/{name} (публичный прокси) |
|
||||
| 11 | internal/api/handler/ | ✅ | functions.go, triggers.go, invocations.go, invoke.go (proxy), handler.go (slog) |
|
||||
| 11 | internal/api/handler/ | ✅ | functions.go, triggers.go, invocations.go, invoke.go (proxy — no such host → 404), handler.go (slog) |
|
||||
| 12 | internal/api/middleware/ | ✅ | auth.go (Bearer token), logging.go (slog) |
|
||||
| 13 | main.go | ✅ | operator manager + HTTP сервер параллельно, wire всех зависимостей |
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
| 2 | internal/client/client.go | ✅ | HTTP-клиент sless API, готов к переносу в nubes |
|
||||
| 3 | internal/provider/provider.go | ✅ | паттерн идентичен nubes NubesProvider |
|
||||
| 4 | sless_function resource | ✅ | CRUD + upload zip + WaitReady (kaniko) |
|
||||
| 5 | sless_trigger resource | ✅ | CRUD (http/cron) |
|
||||
| 5 | sless_trigger resource | ✅ | CRUD (http/cron); Delete ждёт исчезновения CR (WaitGone, 90с) |
|
||||
| 6 | hack/build-and-publish.sh | ✅ | GPG-подпись + mc upload в S3 |
|
||||
| 7 | Публикация в terra.k8c.ru | ✅ | v0.1.3, key CB3A0DF161ECC416 |
|
||||
| 8 | terraform init | ✅ | Installed terra.k8c.ru/naeel/sless v0.1.3 |
|
||||
@@ -79,6 +79,17 @@
|
||||
**Примечание:** Код провайдера писался с прицелом на перенос в nubes провайдер.
|
||||
`internal/client/` → `internal/core/` nubes, ресурсы → `internal/resources_gen/`.
|
||||
|
||||
### source_dir + fix destroy cleanup (2026-03-09)
|
||||
|
||||
| # | Компонент | Статус | Заметки |
|
||||
|---|-----------|--------|----------|
|
||||
| 1 | provider: source_dir атрибут | ✅ | zip в памяти, SHA256 автоматически; hashicorp/archive не нужен |
|
||||
| 2 | fix: trigger_controller handleTriggerDeletion | ✅ | удаляет Service+Ingress из sless-fn-{ns} |
|
||||
| 3 | fix: function_controller handleDeletion | ✅ | удаляет Service+Ingress из sless-fn-{ns} |
|
||||
| 4 | fix: trigger_resource.go Delete WaitGone | ✅ | polling GetTrigger до 404, таймаут 90с |
|
||||
| 5 | fix: invoke.go no such host → 404 | ✅ | после destroy DNS NXDOMAIN → 404 вместо 502 |
|
||||
| 6 | E2E тест run_terraform_examples.sh | ✅ | все 4 примера: hello-node, simple-node, simple-python, notes-python |
|
||||
|
||||
### Что ещё не сделано
|
||||
|
||||
| # | Компонент | Статус | Заметки |
|
||||
|
||||
Reference in New Issue
Block a user