pre-golang-removal: snapshot before removing all golang integration (2026-05-01)
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
# Анализ coupling кода (console/) — 2026-05-01
|
||||
|
||||
## Граф зависимостей (DAG)
|
||||
|
||||
```
|
||||
model runtime
|
||||
│ │
|
||||
└──────┴── fission ─── cloud ─── api (handlers, server, auth...)
|
||||
│
|
||||
ui
|
||||
```
|
||||
|
||||
Цикличных зависимостей нет. Направление правильное.
|
||||
|
||||
---
|
||||
|
||||
## Проблемы coupling (по приоритету)
|
||||
|
||||
### 🔴 HIGH — api/handlers.go — смешение HTTP-слоя и оркестрации Fission
|
||||
|
||||
Файл выполняет одновременно:
|
||||
- HTTP-роутинг и валидацию запросов
|
||||
- Построение `map[string]any{}` манифестов для Package, Function, HTTPTrigger прямо в handler-е
|
||||
- Логику отката (Delete при ошибке) — транзакционная оркестрация
|
||||
- Логику смены Package при обновлении кода (cache-bust через новое имя)
|
||||
|
||||
**Правильно:** всё что ниже `json.Decode(&req)` в `handleCreateFunction` — задача пакета `fission`.
|
||||
Handler должен вызывать `fission.CreateFunction(ctx, dyn, ns, params)`, а не строить K8s-схемы вручную.
|
||||
Fission-специфичная схема сейчас размазана между `handlers.go` и `fission/`.
|
||||
|
||||
### 🟡 MEDIUM — api/package.go берёт *Server вместо http.Client
|
||||
|
||||
func extractPackageSourceCode(ctx context.Context, s *Server, ...) string
|
||||
func fetchPackageArchive(ctx context.Context, s *Server, ...) ([]byte, error)
|
||||
|
||||
Обе функции используют только `s.http`. Зависимость от всего `*Server` — излишняя.
|
||||
Делает функции нетестируемыми без создания полного Server.
|
||||
|
||||
### 🟡 MEDIUM — Кэш токенов живёт на Server
|
||||
|
||||
`tokenMu`, `cachedJWT`, `tokenExpAt`, `tokenCache` — auth-сервис встроен в транспортный объект.
|
||||
При росте логики авторизации потребует правки Server.
|
||||
|
||||
### 🟢 LOW — Конфиг линтеров inline в ai_check.go
|
||||
|
||||
Карта `langs := map[string]linterCfg{...}` пересоздаётся при каждом вызове handler-а.
|
||||
|
||||
### 🟢 LOW — Legacy-роуты без auth-middleware в server.go
|
||||
|
||||
mux.HandleFunc("/api/functions", s.handleFunctionsRoot) // без auth!
|
||||
mux.HandleFunc("/console/api/functions", auth(s.handleFunctionsRoot)) // с auth
|
||||
|
||||
Одни и те же handlers зарегистрированы дважды — легко пропустить при добавлении нового роута.
|
||||
|
||||
---
|
||||
|
||||
## Что работает хорошо (не трогать)
|
||||
|
||||
| Пакет | Оценка |
|
||||
|---|---|
|
||||
| model/types.go | Чистый leaf-пакет, нет внутренних импортов |
|
||||
| runtime/ | Pure функции, нет зависимостей на api/cloud/fission — идеально |
|
||||
| fission/environment.go | Хорошая инкапсуляция EnsureEnvironment + Cleanup |
|
||||
| cloud/tenant.go | Singleflight + semaphore + cache — правильно изолировано |
|
||||
| cloud/quota.go, network.go | Атомарные, читаемые, независимые |
|
||||
|
||||
---
|
||||
|
||||
## Вывод
|
||||
|
||||
Глобального рефакторинга не нужно — структура пакетов правильная.
|
||||
Основная боль: handlers.go (~700 строк) делает слишком много.
|
||||
Решение: добавить в пакет fission функции CreateFunction / UpdateFunction / DeleteFunction,
|
||||
которые инкапсулируют построение K8s-манифестов.
|
||||
Handlers превратятся в тонкий HTTP-слой (~200 строк).
|
||||
Остальное — мелочи.
|
||||
~~~блока есть вложенные ` ``` ` — они его разрывают. Вот вариант с `~~~` снаружи:
|
||||
|
||||
~~~markdown
|
||||
# Анализ coupling кода (console/) — 2026-05-01
|
||||
|
||||
## Граф зависимостей (DAG)
|
||||
|
||||
```
|
||||
model runtime
|
||||
│ │
|
||||
└──────┴── fission ─── cloud ─── api (handlers, server, auth...)
|
||||
│
|
||||
ui
|
||||
```
|
||||
|
||||
Цикличных зависимостей нет. Направление правильное.
|
||||
|
||||
---
|
||||
|
||||
## Проблемы coupling (по приоритету)
|
||||
|
||||
### 🔴 HIGH — api/handlers.go — смешение HTTP-слоя и оркестрации Fission
|
||||
|
||||
Файл выполняет одновременно:
|
||||
- HTTP-роутинг и валидацию запросов
|
||||
- Построение `map[string]any{}` манифестов для Package, Function, HTTPTrigger прямо в handler-е
|
||||
- Логику отката (Delete при ошибке) — транзакционная оркестрация
|
||||
- Логику смены Package при обновлении кода (cache-bust через новое имя)
|
||||
|
||||
**Правильно:** всё что ниже `json.Decode(&req)` в `handleCreateFunction` — задача пакета `fission`.
|
||||
Handler должен вызывать `fission.CreateFunction(ctx, dyn, ns, params)`, а не строить K8s-схемы вручную.
|
||||
Fission-специфичная схема сейчас размазана между `handlers.go` и `fission/`.
|
||||
|
||||
### 🟡 MEDIUM — api/package.go берёт *Server вместо http.Client
|
||||
|
||||
func extractPackageSourceCode(ctx context.Context, s *Server, ...) string
|
||||
func fetchPackageArchive(ctx context.Context, s *Server, ...) ([]byte, error)
|
||||
|
||||
Обе функции используют только `s.http`. Зависимость от всего `*Server` — излишняя.
|
||||
Делает функции нетестируемыми без создания полного Server.
|
||||
|
||||
### 🟡 MEDIUM — Кэш токенов живёт на Server
|
||||
|
||||
`tokenMu`, `cachedJWT`, `tokenExpAt`, `tokenCache` — auth-сервис встроен в транспортный объект.
|
||||
При росте логики авторизации потребует правки Server.
|
||||
|
||||
### 🟢 LOW — Конфиг линтеров inline в ai_check.go
|
||||
|
||||
Карта `langs := map[string]linterCfg{...}` пересоздаётся при каждом вызове handler-а.
|
||||
|
||||
### 🟢 LOW — Legacy-роуты без auth-middleware в server.go
|
||||
|
||||
mux.HandleFunc("/api/functions", s.handleFunctionsRoot) // без auth!
|
||||
mux.HandleFunc("/console/api/functions", auth(s.handleFunctionsRoot)) // с auth
|
||||
|
||||
Одни и те же handlers зарегистрированы дважды — легко пропустить при добавлении нового роута.
|
||||
|
||||
---
|
||||
|
||||
## Что работает хорошо (не трогать)
|
||||
|
||||
| Пакет | Оценка |
|
||||
|---|---|
|
||||
| model/types.go | Чистый leaf-пакет, нет внутренних импортов |
|
||||
| runtime/ | Pure функции, нет зависимостей на api/cloud/fission — идеально |
|
||||
| fission/environment.go | Хорошая инкапсуляция EnsureEnvironment + Cleanup |
|
||||
| cloud/tenant.go | Singleflight + semaphore + cache — правильно изолировано |
|
||||
| cloud/quota.go, network.go | Атомарные, читаемые, независимые |
|
||||
|
||||
---
|
||||
|
||||
## Вывод
|
||||
|
||||
Глобального рефакторинга не нужно — структура пакетов правильная.
|
||||
Основная боль: handlers.go (~700 строк) делает слишком много.
|
||||
Решение: добавить в пакет fission функции CreateFunction / UpdateFunction / DeleteFunction,
|
||||
которые инкапсулируют построение K8s-манифестов.
|
||||
Handlers превратятся в тонкий HTTP-слой (~200 строк).
|
||||
Остальное — мелочи.
|
||||
|
||||
----------- «один блок, тильды снаружи» — я пойму.
|
||||
И кстати, Plan может писать в файл — но только в /memories/session/plan.md (session memory).
|
||||
@@ -0,0 +1,218 @@
|
||||
{
|
||||
"repo_summary": {
|
||||
"files_count": 5,
|
||||
"languages": ["go"],
|
||||
"frameworks": {
|
||||
"value": ["k8s.io/client-go", "k8s.io/apimachinery"],
|
||||
"confidence": "medium",
|
||||
"source": "explicit_code"
|
||||
}
|
||||
},
|
||||
"modules": [
|
||||
{
|
||||
"name": "console/internal/api/handlers.go",
|
||||
"imports": {
|
||||
"value": [
|
||||
"bytes", "context", "encoding/json", "errors", "fmt", "io", "log", "net", "net/http", "regexp", "strconv", "strings", "time",
|
||||
"fission-console/internal/fission",
|
||||
"fission-console/internal/model",
|
||||
"fission-console/internal/runtime",
|
||||
"k8s.io/apimachinery/pkg/api/errors",
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1",
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
],
|
||||
"confidence": "high",
|
||||
"source": "explicit_code"
|
||||
},
|
||||
"exports": {
|
||||
"value": [
|
||||
"handleFunctionsRoot", "handleFunctionsAction", "handleCreateFunction",
|
||||
"handleGetFunction", "handleUpdateFunctionCode",
|
||||
"handleInvokeFunction", "handleFissionFunctionGateway",
|
||||
"invokeInternalFunction", "handleInvokeRoute",
|
||||
"handleDeleteFunction", "handleAuth", "parseTTL", "normalizeMethods"
|
||||
],
|
||||
"confidence": "high",
|
||||
"source": "explicit_code"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "console/internal/api/server.go",
|
||||
"imports": {
|
||||
"value": [
|
||||
"bytes", "context", "encoding/json", "fmt", "io", "net/http", "os", "strings", "sync", "time",
|
||||
"fission-console/internal/cloud", "fission-console/internal/fission", "fission-console/ui",
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1", "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured",
|
||||
"k8s.io/apimachinery/pkg/runtime/schema", "k8s.io/client-go/dynamic"
|
||||
],
|
||||
"confidence": "high",
|
||||
"source": "explicit_code"
|
||||
},
|
||||
"exports": {
|
||||
"value": [
|
||||
"Server", "Config", "NewServer", "RegisterRoutes", "Handler", "NSManager", "handleList"
|
||||
],
|
||||
"confidence": "high",
|
||||
"source": "explicit_code"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "console/internal/model/types.go",
|
||||
"imports": {
|
||||
"value": [],
|
||||
"confidence": "high",
|
||||
"source": "explicit_code"
|
||||
},
|
||||
"exports": {
|
||||
"value": [
|
||||
"CreateFunctionRequest", "CreateTimeTriggerRequest", "UpdateCodeRequest", "LangEnvDef", "LangEnvMap"
|
||||
],
|
||||
"confidence": "high",
|
||||
"source": "explicit_code"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "console/internal/runtime/entrypoint.go",
|
||||
"imports": {
|
||||
"value": [],
|
||||
"confidence": "high",
|
||||
"source": "explicit_code"
|
||||
},
|
||||
"exports": {
|
||||
"value": ["DefaultEntrypoint"],
|
||||
"confidence": "high",
|
||||
"source": "explicit_code"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "console/cmd/server/main.go",
|
||||
"imports": {
|
||||
"value": [
|
||||
"log", "net/http", "os", "strings", "time",
|
||||
"fission-console/internal/api",
|
||||
"k8s.io/client-go/dynamic", "k8s.io/client-go/rest", "k8s.io/client-go/tools/clientcmd"
|
||||
],
|
||||
"confidence": "high",
|
||||
"source": "explicit_code"
|
||||
},
|
||||
"exports": {
|
||||
"value": ["main", "buildConfig", "envDefault", "envDurationDefault"],
|
||||
"confidence": "high",
|
||||
"source": "explicit_code"
|
||||
}
|
||||
}
|
||||
],
|
||||
"symbols": [
|
||||
{
|
||||
"name": "main",
|
||||
"type": "function",
|
||||
"file": "console/cmd/server/main.go",
|
||||
"calls": {
|
||||
"value": [
|
||||
"buildConfig",
|
||||
"k8s.io/client-go/dynamic.NewForConfig",
|
||||
"fission-console/internal/api.NewServer",
|
||||
"nsm.StartExpiryReaper",
|
||||
"log.Printf",
|
||||
"log.Fatal"
|
||||
],
|
||||
"confidence": "high",
|
||||
"source": "explicit_code"
|
||||
},
|
||||
"called_by": {
|
||||
"value": [],
|
||||
"confidence": "unknown",
|
||||
"source": "unknown"
|
||||
},
|
||||
"inputs": {
|
||||
"value": [],
|
||||
"confidence": "high",
|
||||
"source": "explicit_code"
|
||||
},
|
||||
"returns": {
|
||||
"value": "UNKNOWN",
|
||||
"confidence": "unknown",
|
||||
"source": "unknown"
|
||||
},
|
||||
"side_effects": [
|
||||
{
|
||||
"type": "http_server",
|
||||
"confidence": "high",
|
||||
"source": "explicit_code",
|
||||
"evidence": "httpServer.ListenAndServe()"
|
||||
},
|
||||
{
|
||||
"type": "log",
|
||||
"confidence": "high",
|
||||
"source": "explicit_code",
|
||||
"evidence": "log.Printf, log.Fatal"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "DefaultEntrypoint",
|
||||
"type": "function",
|
||||
"file": "console/internal/runtime/entrypoint.go",
|
||||
"calls": {
|
||||
"value": [],
|
||||
"confidence": "high",
|
||||
"source": "explicit_code"
|
||||
},
|
||||
"called_by": {
|
||||
"value": [],
|
||||
"confidence": "unknown",
|
||||
"source": "unknown"
|
||||
},
|
||||
"inputs": {
|
||||
"value": ["lang"],
|
||||
"confidence": "high",
|
||||
"source": "explicit_code"
|
||||
},
|
||||
"returns": {
|
||||
"value": "string",
|
||||
"confidence": "high",
|
||||
"source": "explicit_code"
|
||||
},
|
||||
"side_effects": []
|
||||
}
|
||||
],
|
||||
"call_graph": [
|
||||
{
|
||||
"from": "main",
|
||||
"to": [
|
||||
"buildConfig",
|
||||
"k8s.io/client-go/dynamic.NewForConfig",
|
||||
"fission-console/internal/api.NewServer",
|
||||
"nsm.StartExpiryReaper",
|
||||
"log.Printf",
|
||||
"log.Fatal"
|
||||
],
|
||||
"confidence": "high",
|
||||
"source": "explicit_code"
|
||||
},
|
||||
{
|
||||
"from": "handleCreateFunction",
|
||||
"to": ["DefaultEntrypoint"],
|
||||
"confidence": "high",
|
||||
"source": "explicit_code"
|
||||
}
|
||||
],
|
||||
"entry_points": [
|
||||
{
|
||||
"name": "main",
|
||||
"type": "cli",
|
||||
"confidence": "high",
|
||||
"source": "explicit_code"
|
||||
}
|
||||
],
|
||||
"unknowns": [
|
||||
{
|
||||
"reason": "reverse call graph incomplete",
|
||||
"location": "global"
|
||||
}
|
||||
],
|
||||
"analysis_coverage": {
|
||||
"symbols_detected": 2,
|
||||
"modules_detected": 5
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,305 @@
|
||||
# План удаления 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. Коммит
|
||||
Reference in New Issue
Block a user