86 lines
3.6 KiB
Markdown
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
|