Files
fission-console/doc/thinking/2026-04-20.md
T

86 lines
3.6 KiB
Markdown

# 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 | `<name>-pkg` |
| `trigger_name` | computed string | `<name>-trigger` или "" |
| `code_hash` | computed string | SHA-256 кода из code_dir |
### Логика Create
1. `findOrCreateSimpleEnv` — ищет `simple-<runtime>-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