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

306 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# План удаления 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. Коммит