# Terraform Provider Fission (MVP) Текущий MVP провайдера управляет Fission CRD через Kubernetes API: - `fission_environment` - `fission_package` - `fission_function` - `fission_http_trigger` Все ресурсы поддерживают `terraform import` в формате `namespace/name`. ## Быстрый запуск (dev override) 1. Собрать бинарник провайдера: ```bash cd terraform/provider go build -o bin/terraform-provider-fission . ``` 2. Положить бинарник в локальный каталог dev plugins: ```bash mkdir -p ~/.terraform.d/dev-plugins/Nail/fission cp terraform/provider/bin/terraform-provider-fission ~/.terraform.d/dev-plugins/Nail/fission/ ``` 3. Создать файл Terraform CLI config (пример `/tmp/terraformrc-fission`): ```hcl provider_installation { dev_overrides { "nail/fission" = "/home/naeel/.terraform.d/dev-plugins/Nail/fission" } direct {} } ``` 4. Запустить пример: ```bash cd examples/hello-python TF_CLI_CONFIG_FILE=/tmp/terraformrc-fission terraform plan TF_CLI_CONFIG_FILE=/tmp/terraformrc-fission terraform apply -auto-approve ``` ## Тесты Unit-тесты: ```bash cd terraform/provider go test ./... ``` Acceptance-тест (реальный кластер, опционально): ```bash cd terraform/provider ACCEPTANCE_TEST=1 KUBECONFIG=/home/naeel/.kube/config go test ./internal/client -run TestAcceptanceFissionCRUD -v ``` Импорт существующего ресурса (пример): ```bash terraform import fission_environment.python default/tf-python-env terraform import fission_package.hello default/tf-hello-pkg terraform import fission_function.hello default/tf-hello-fn terraform import fission_http_trigger.hello default/tf-hello-route ``` ## Ограничения MVP - `fission_package.source_dir` в текущей реализации ожидает один из файлов: `main.py`, `main.js`, `main.go`. - Реализация ориентирована на Python flow через `spec.deployment.literal`. - Дополнительные сценарии сборки (`build_command`, многофайловые архивы и т.д.) будут расширены в следующих этапах. ## Stress Suite (много функций + нагрузка) Добавлен отдельный пример `examples/stress-suite`: - 3 функции: `fast`, `cpu`, `json` - 3 endpoint-а: `/stress/fast`, `/stress/cpu`, `/stress/json` - Terraform разворачивает полный набор ресурсов для каждого endpoint. Суровый нагрузочный прогон: ```bash cd examples/stress-suite TF_CLI_CONFIG_FILE=/tmp/terraformrc-fission terraform apply -auto-approve ./scripts/load_test.sh https://fission.kube5s.ru 900 90 ``` Где: - `900` — число запросов на endpoint - `90` — параллелизм --- # fission-console Backend сервис для управления serverless-функциями поверх Fission. Предоставляет REST API + embedded Web UI. Каждый пользователь изолирован в отдельном Kubernetes namespace. ## Деплой | Параметр | Значение | |---|---| | Кластер | `kube5s.ru` | | Namespace | `fission` | | URL | `https://fission.kube5s.ru/console/` | | Образ | `naeel/fission-console:` | | Порт | `8090` | | Текущая версия | `v0.6.7` | ## Переменные окружения | Переменная | По умолчанию | Описание | |---|---|---| | `PORT` | `8090` | Порт HTTP-сервера | | `FISSION_ROUTER_URL` | `http://router.fission.svc.cluster.local` | URL Fission Router для invoke | | `FISSION_INVOKE_TIMEOUT` | `20s` | Таймаут вызова функции | | `REAPER_INTERVAL` | `5m` | Интервал очистки истёкших TTL | | `FISSION_TEST_MODE` | `false` | Тестовый режим — отключает JWT, включает `X-Test-Sub` | | `FISSION_SYSTEM_NAMESPACE` | `fission` | Namespace самого Fission | | `KUBECONFIG` | — | Путь к kubeconfig (если не in-cluster) | ## Аутентификация **Production:** `Authorization: Bearer ` через `/console/api/auth`. **Test Mode** (`FISSION_TEST_MODE=true`): ```bash curl -H "X-Test-Sub: user@example.com" https://fission.kube5s.ru/console/api/functions ``` ## Изоляция по namespace ``` sub → SHA256(sub)[:8] → namespace = "fission-{16 hex chars}" ``` При первом обращении namespace + RoleBinding-и создаются автоматически. Namespace регистрируется в `FISSION_RESOURCE_NAMESPACES` всех Fission deployments. ## API Базовый путь: `/console/api` | Метод | Путь | Описание | |---|---|---| | `GET` | `/console/api/functions` | Список функций | | `POST` | `/console/api/functions` | Создать функцию | | `GET` | `/console/api/functions/{name}` | Получить функцию | | `DELETE` | `/console/api/functions/{name}` | Удалить функцию | | `PUT` | `/console/api/functions/{name}/code` | Обновить код | | `POST` | `/console/api/functions/{name}/invoke` | Вызвать функцию | | `GET` | `/console/api/environments` | Список environments | | `GET` | `/console/api/packages` | Список packages | | `GET` | `/console/api/httptriggers` | Список HTTP triggers | ### Создать функцию ```bash curl -X POST https://fission.kube5s.ru/console/api/functions \ -H "X-Test-Sub: user@example.com" \ -H "Content-Type: application/json" \ -d '{ "name": "hello", "language": "nodejs", "ttl": "1h", "code": "module.exports = async function(ctx) { return { body: \"Hello!\" }; };" }' ``` **Поля запроса:** | Поле | Обязательно | Описание | |---|---|---| | `name` | да | Имя функции | | `language` | да* | Язык: `nodejs`, `python`, `go`, `php`, `ruby`, `perl` | | `environment` | да* | Имя существующего Environment CRD | | `code` | да | Исходный код | | `ttl` | нет | Время жизни: `30m`, `1h`, `7d`, `2m` | | `entrypoint` | нет | Точка входа (auto-detect по языку) | \* Одно из двух. **Ответ:** ```json { "name": "hello", "route": "/hello", "httptrigger": "hello-route", "package": "hello-pkg", "expires_at": "2026-04-19T15:00:00Z" } ``` ### Вызвать функцию ```bash curl -X POST https://fission.kube5s.ru/console/api/functions/hello/invoke \ -H "X-Test-Sub: user@example.com" \ -H "Content-Type: application/json" \ -d '{}' ``` **Ответ:** ```json { "invoke_url": "http://router.fission.svc.cluster.local/hello", "latency_ms": 268, "status": 200, "response_raw": "Hello!" } ``` ## Языки и формат кода ### NodeJS (рекомендуется) ```js module.exports = async function(ctx) { return { body: JSON.stringify({ ok: true }) }; }; ``` - Node.js 22, ESM mode - `status: 200` добавляется автоматически, если не указан - Код изолируется через `new Function('module', 'exports', code)` - Поддерживается `module.exports.handler`, `.main`, `.default` ### Python ```python def main(): return {"body": '{"ok": true}', "status": 200} ``` ### Go ```go func Handler(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello!")) } ``` ## TTL | Пример | Значение | |---|---| | `30m` | 30 минут | | `1h` | 1 час | | `7d` | 7 дней | | `2m` | 2 минуты | По истечении TTL функция + package + httptrigger удаляются reaperом. Пустой environment удаляется вместе с последней функцией. ## Health ```bash curl https://fission.kube5s.ru/health curl https://fission.kube5s.ru/console/health ``` ## Сборка образа ```bash cd console/ go build . # проверка компиляции docker build -t naeel/fission-console:vX.Y.Z . docker push naeel/fission-console:vX.Y.Z kubectl set image deployment/fission-console console=naeel/fission-console:vX.Y.Z -n fission ``` ## Changelog ### v0.6.7 - NodeJS: однофайловый zip (`main.js` с `new Function` wrapper) - NodeJS: автоматический `status: 200` если функция не возвращает его ### v0.6.6 - NodeJS: упаковка кода в zip (ESM mode требует `.js`) - NodeJS: исправлена точка входа (`main.main` → `main`) - Namespace isolation: SHA256(sub)[:8] - TTL + expiry reaper - TEST_MODE - Lazy Environment creation / cleanup