306 lines
11 KiB
Markdown
306 lines
11 KiB
Markdown
# План удаления 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. Коммит
|