3.6 KiB
3.6 KiB
2026-04-20 — fission_simple_function
Задача
Добавить составной ресурс fission_simple_function, который позволяет описать serverless-функцию одним HCL-блоком вместо четырёх отдельных ресурсов.
Мотивация
До: пользователь обязан вручную объявлять fission_environment + fission_package + fission_function + fission_http_trigger.
После: достаточно одного блока:
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
findOrCreateSimpleEnv— ищетsimple-<runtime>-env; если нет — создаёт с параметрами изruntimeRegistry.loadPackageContent(code_dir, "", deployType)— загружает код (JS получает ESM zip, Go — source zip, остальные — literal bytes).CreatePackage→CreateFunction→CreateHTTPTrigger(опционально).- 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().
Статус
- Реализация написана и скомпилирована (
go build ./...— OK) - Тест на real cluster