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

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

  1. findOrCreateSimpleEnv — ищет simple-<runtime>-env; если нет — создаёт с параметрами из runtimeRegistry.
  2. loadPackageContent(code_dir, "", deployType) — загружает код (JS получает ESM zip, Go — source zip, остальные — literal bytes).
  3. CreatePackageCreateFunctionCreateHTTPTrigger (опционально).
  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().

Статус

  • Реализация написана и скомпилирована (go build ./... — OK)
  • Тест на real cluster