Files
fission-console/doc/thinking/2026-05-01-golang-removal-plan.md
T

11 KiB
Raw Blame History

План удаления golang-интеграции из fission-console

Дата: 2026-05-01
Цель: Полностью убрать хвосты попытки интеграции Go-функций в fission.
Исполнитель: GPT 4.1 (строго по плану, без отсебятины)


Что удаляем и почему

Попытка запустить Go-функции в Fission через build pipeline (go-builder → .so плагин) была отвергнута.
Все упоминания языка "go" в модели, тестах, примерах, terraform — мёртвый код и хвосты.


ПЛАН УДАЛЕНИЯ (шаги строго по порядку)


ШАГ 1. Удалить директорию go-builder/

Содержит:

  • go-builder/Dockerfile — кастомный Docker-образ для компиляции Go-плагинов
  • go-builder/build.sh — скрипт сборки .so-плагина через go build -buildmode=plugin

Действие: удалить всю директорию go-builder/

# через SSH на VM:
rm -rf ~/terra/fission/go-builder/

ШАГ 2. Удалить файл console/internal/runtime/go.go

Содержит: единственную функцию BuildGoSourceZip(code string) ([]byte, error) — упаковывает Go-код в zip для source package Fission.

Действие: удалить файл целиком.

rm ~/terra/fission/console/internal/runtime/go.go

ШАГ 3. Убрать ветку "go" из console/internal/runtime/entrypoint.go

Файл: console/internal/runtime/entrypoint.go

Что убрать: блок case "go": return "Handler" в функции DefaultEntrypoint.

До:

func DefaultEntrypoint(lang string) string {
    switch lang {
    case "nodejs":
        return "main"
    case "php":
        return "main.php::handler"
    case "ruby":
        return "handler"
    case "go":
        // Go: экспортированная функция (заглавная) — go/plugin требует экспорт
        return "Handler"
    default:
        return "main.main"
    }
}

После:

func DefaultEntrypoint(lang string) string {
    switch lang {
    case "nodejs":
        return "main"
    case "php":
        return "main.php::handler"
    case "ruby":
        return "handler"
    default:
        return "main.main"
    }
}

ШАГ 4. Убрать запись "go" из console/internal/model/types.go

Файл: console/internal/model/types.go

Что убрать: строку (и комментарий если есть):

"go":     {Image: "ghcr.io/fission/go-env", BuilderImage: "naeel/go-builder-fast:v1"},

ШАГ 5. Убрать Go-ветку из console/internal/fission/function.go

Файл: console/internal/fission/function.go

Что убрать: блок if req.Language == "go" { ... } else { ... } — заменить на тело else-ветки (без условия).

До:

var pkgSpec map[string]any
if req.Language == "go" {
    srcZip, err := runtime.BuildGoSourceZip(req.Code)
    if err != nil {
        return nil, fmt.Errorf("build go source archive: %w", err)
    }
    literal := base64.StdEncoding.EncodeToString(srcZip)
    pkgSpec = map[string]any{
        "source": map[string]any{
            "type":    "literal",
            "literal": literal,
        },
        "deployment":   map[string]any{},
        "environment":  map[string]any{"name": req.Environment, "namespace": ns},
        "buildcommand": "build",
    }
} else {
    deployBytes, archiveErr := runtime.BuildDeployArchive(req.Language, req.Code)
    if archiveErr != nil {
        return nil, fmt.Errorf("build %s archive: %w", req.Language, archiveErr)
    }
    pkgSpec = map[string]any{
        ...
    }
}

После:

var pkgSpec map[string]any
deployBytes, archiveErr := runtime.BuildDeployArchive(req.Language, req.Code)
if archiveErr != nil {
    return nil, fmt.Errorf("build %s archive: %w", req.Language, archiveErr)
}
pkgSpec = map[string]any{
    ...
}

ВАЖНО: также убрать неиспользуемый import "encoding/base64" если после удаления он больше нигде не нужен в этом файле.


ШАГ 6. Удалить примеры с Go-функциями

Директории для удаления:

  • examples/go-hello/ (целиком)
  • examples/big-suite/code/go-order/ (целиком)
  • examples/big-suite/code/go-report/ (целиком)
  • examples/big-suite/code/go-processor/ (целиком)
rm -rf ~/terra/fission/examples/go-hello/
rm -rf ~/terra/fission/examples/big-suite/code/go-order/
rm -rf ~/terra/fission/examples/big-suite/code/go-report/
rm -rf ~/terra/fission/examples/big-suite/code/go-processor/

ШАГ 7. Убрать блок Go из tests_v2.sh

Файл: tests_v2.sh

Удалить:

7a. Строка 13 — subs+=("${GO_NS}") внутри cleanup_namespaces().

7b. Строки 41-45 — объявление и warmup GO_NS:

# GO_NS фиксированный — namespace создаётся один раз, Fission не рестартует при повторных прогонах.
# Первый прогон занимает ~5 мин (rolling restart Fission), последующие — мгновенно.
GO_NS="go-livetest@test.local"
# Триггерим ensureUserNamespace заранее — Fission начнёт регистрировать NS пока идут остальные тесты.
curl -s -o /dev/null -X GET ${BASE}/functions -H "X-Test-Sub: ${GO_NS}" || true

7c. Строки 785-811 — весь блок БЛОК AE: Go — создание и вызов:

echo ""
echo ">>> БЛОК AE: Go — создание и вызов"

# Go: namespace GO_NS уже прогрет в начале теста (curl в самом верху).
# ...
GO_CODE=$(python3 -c "...")
curl -s -o /dev/null -X DELETE ${BASE}/functions/go-fn -H "X-Test-Sub: ${GO_NS}" || true
R=$(curl ... -d "{\"name\":\"go-fn\",\"language\":\"go\",...}")
...
[ "$STATUS" = "200" ] && pass "Go: invoke → 200" || fail ...
echo "$RAW" | grep -q "go-ok" && pass "Go: тело содержит go-ok" || fail ...

(всё до следующего echo "" и разделителя ===)


ШАГ 8. Убрать блок T03 (go) из test_simple_function.sh

Файл: test_simple_function.sh

Удалить строки 263-296 — весь блок T03: go — source pipeline, create с URL:

# ════════════════════════════════════════════════════════════════════════
echo ""
echo ">>> T03: go — source pipeline, create с URL"
# ════════════════════════════════════════════════════════════════════════
T03="${RUN_ID}-go-basic"
...
kube_gone "functions.fission.io" "${T03}" && pass "T03: Function удалена" || fail "T03: Function осталась"

ВАЖНО: проверить что write_go функция определена только для T03. Если да — удалить её определение тоже (найти write_go() в файле). Если используется где-то ещё — оставить.


ШАГ 9. Убрать Go из bench_heavy.py

Файл: bench_heavy.py

9a. Удалить блок GO_CODE — весь многострочный raw string от строки # ── Go ──... до следующего такого же разделителя комментария для другого языка (примерно строки 636–870).

9b. Строка ~1078 — удалить из списка functions:

("bench-go",     "go",     GO_CODE),

9c. Если после удаления GO_CODE есть orphan-упоминания bench-go или GO_CODE — удалить их.


ШАГ 10. Удалить/исправить в Terraform provider

10a. terraform/provider/internal/resources/simple_function_resource.go — строки 70-71:

image:        "ghcr.io/fission/go-env:latest",
builderImage: "naeel/go-builder-fast:v1",

Удалить или заменить (зависит от контекста: если это default-значение только для Go-runtime — удалить весь if-блок; если это общий default — заменить на пустую строку "").

10b. terraform/provider/internal/resources/environment_resource_test.go — удалить тесты с go-env/go-builder (строки ~40-60).

10c. terraform/provider/internal/resources/package_resource_test.go — строка ~120:

Environment: types.StringValue("go-env"),

Заменить на другой environment (например "python-env") или удалить тест если он специфичен для Go.


ШАГ 11. Проверка компиляции

После всех изменений:

# SSH на VM:
cd ~/terra/fission/console && go build ./...
cd ~/terra/fission/terraform/provider && go build ./...

Если ошибки — исправить неиспользуемые импорты ("encoding/base64", "archive/zip" и т.п.)


ШАГ 12. Запустить тесты

# SSH на VM:
cd ~/terra/fission/console && go test ./...

ШАГ 13. Git commit

git add -A
git commit -m "remove golang integration: delete go-builder, go runtime, go examples, go tests (2026-05-01)"

Что НЕ трогать

  • console/Dockerfile — использует FROM golang:... для сборки самого console-сервера (Go) — это НЕ golang-integration для пользовательских функций, это build stage
  • metrics-collector/Dockerfile — аналогично, golang для сборки коллектора
  • console/go.mod, metrics-collector/go.mod, terraform/provider/go.mod — это go.mod проектов на Go, не golang-функций fission
  • terraform/provider/internal/resources/environment_resource.go строка 75 про BuilderImage — это документация поля, можно оставить

Порядок безопасного удаления

  1. Начать с примеров и go-builder (нет зависимостей от другого кода)
  2. Затем runtime/go.go и ветки в function.go/entrypoint.go
  3. Затем тесты
  4. Последним — model/types.go запись "go"
  5. go build — убедиться что компилируется
  6. Коммит