# План удаления 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/` ```bash # через SSH на VM: rm -rf ~/terra/fission/go-builder/ ``` --- ### ШАГ 2. Удалить файл `console/internal/runtime/go.go` **Содержит:** единственную функцию `BuildGoSourceZip(code string) ([]byte, error)` — упаковывает Go-код в zip для source package Fission. **Действие:** удалить файл целиком. ```bash 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`. **До:** ```go 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" } } ``` **После:** ```go 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 "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`-ветки (без условия). **До:** ```go 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{ ... } } ``` **После:** ```go 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/` (целиком) ```bash 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: ```bash # 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 — создание и вызов`: ```bash 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`: ```bash # ════════════════════════════════════════════════════════════════════════ 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`: ```python ("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: ```go 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: ```go Environment: types.StringValue("go-env"), ``` Заменить на другой environment (например `"python-env"`) или удалить тест если он специфичен для Go. --- ### ШАГ 11. Проверка компиляции После всех изменений: ```bash # SSH на VM: cd ~/terra/fission/console && go build ./... cd ~/terra/fission/terraform/provider && go build ./... ``` Если ошибки — исправить неиспользуемые импорты (`"encoding/base64"`, `"archive/zip"` и т.п.) --- ### ШАГ 12. Запустить тесты ```bash # SSH на VM: cd ~/terra/fission/console && go test ./... ``` --- ### ШАГ 13. Git commit ```bash 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. Коммит