# 2026-04-20 — fission_simple_function ## Задача Добавить составной ресурс `fission_simple_function`, который позволяет описать serverless-функцию одним HCL-блоком вместо четырёх отдельных ресурсов. ## Мотивация До: пользователь обязан вручную объявлять `fission_environment` + `fission_package` + `fission_function` + `fission_http_trigger`. После: достаточно одного блока: ```hcl resource "fission_simple_function" "health" { name = "health" runtime = "nodejs" code_dir = "./code/health" url = "/ecom/health" methods = ["GET"] } ``` ## Реализация **Файл:** `terraform/provider/internal/resources/simple_function_resource.go` ### Схема ресурса | Атрибут | Тип | Поведение | |---------|-----|-----------| | `name` | required string | RequiresReplace | | `runtime` | required string | RequiresReplace; допустимые: nodejs, python, go, ruby, php, perl | | `code_dir` | required string | путь к директории с исходниками | | `url` | optional string | если задан — создаётся HTTPTrigger | | `methods` | optional+computed list(string) | дефолт `["GET"]` | | `namespace` | optional+computed string | дефолт из провайдера | | `environment_name` | computed string | имя созданного/найденного env | | `package_name` | computed string | `-pkg` | | `trigger_name` | computed string | `-trigger` или "" | | `code_hash` | computed string | SHA-256 кода из code_dir | ### Логика Create 1. `findOrCreateSimpleEnv` — ищет `simple--env`; если нет — создаёт с параметрами из `runtimeRegistry`. 2. `loadPackageContent(code_dir, "", deployType)` — загружает код (JS получает ESM zip, Go — source zip, остальные — literal bytes). 3. `CreatePackage` → `CreateFunction` → `CreateHTTPTrigger` (опционально). 4. Rollback при ошибке: если Function не создалась — удаляет Package; если Trigger — удаляет Function + Package. ### runtimeRegistry | Runtime | deployType | entrypoint | builderImage | |---------|-----------|------------|-------------| | nodejs | literal | "" (default export) | — | | python | literal | main.main | — | | go | source | Handler | ghcr.io/fission/go-builder:latest | | ruby | literal | main.main | — | | php | literal | main.main | — | | perl | literal | main.main | — | ### ModifyPlan Пересчитывает `code_hash` при каждом plan, чтобы Terraform обнаруживал изменения кода без force-replace. ### Update - Если `code_hash` изменился → `UpdatePackage` (patch content, preserve resourceVersion). - URL добавлен/удалён → `CreateHTTPTrigger` / `DeleteHTTPTrigger`. - URL изменился → `UpdateHTTPTrigger`. ### Delete Порядок: HTTPTrigger → Function → Package. Environment намеренно НЕ удаляется (shared). ### Import Формат: `namespace/name`. После import читается из Kubernetes через `Read`. ## Регистрация `terraform/provider/internal/provider/provider.go` — добавлено `resources.NewSimpleFunctionResource` в `Resources()`. ## Статус - [x] Реализация написана и скомпилирована (`go build ./...` — OK) - [ ] Тест на real cluster