From ba50d18f8f119abd796c81548fcca5016bfa7b3e Mon Sep 17 00:00:00 2001 From: Naeel Date: Wed, 15 Apr 2026 11:14:42 +0300 Subject: [PATCH] fix(console): sync function package resourceversion after code update --- console/deploy/console.yaml | 2 +- console/main.go | 18 +++++++++++++++++- doc/progress.md | 24 ++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/console/deploy/console.yaml b/console/deploy/console.yaml index b7997da..ce50647 100644 --- a/console/deploy/console.yaml +++ b/console/deploy/console.yaml @@ -46,7 +46,7 @@ spec: serviceAccountName: fission-console containers: - name: console - image: naeel/fission-console:v0.2.4 + image: naeel/fission-console:v0.2.5 ports: - containerPort: 8090 env: diff --git a/console/main.go b/console/main.go index b471a4c..64bb2af 100644 --- a/console/main.go +++ b/console/main.go @@ -430,7 +430,23 @@ func (s *server) handleUpdateFunctionCode(w http.ResponseWriter, r *http.Request return } - writeAnyJSON(w, http.StatusOK, map[string]any{"updated": true, "package": pkgName}) + updatedPkg, err := s.dyn.Resource(packageGVR).Namespace(s.ns).Get(ctx, pkgName, metav1.GetOptions{}) + if err != nil { + writeJSONError(w, http.StatusBadGateway, fmt.Sprintf("get updated package %q: %v", pkgName, err)) + return + } + + if err := unstructured.SetNestedField(fn.Object, updatedPkg.GetResourceVersion(), "spec", "package", "packageref", "resourceversion"); err != nil { + writeJSONError(w, http.StatusInternalServerError, fmt.Sprintf("set function package resourceversion: %v", err)) + return + } + + if _, err := s.dyn.Resource(functionGVR).Namespace(s.ns).Update(ctx, fn, metav1.UpdateOptions{}); err != nil { + writeJSONError(w, http.StatusBadGateway, fmt.Sprintf("update function %q package ref: %v", name, err)) + return + } + + writeAnyJSON(w, http.StatusOK, map[string]any{"updated": true, "package": pkgName, "package_resourceversion": updatedPkg.GetResourceVersion()}) } func (s *server) handleInvokeFunction(w http.ResponseWriter, r *http.Request, name string) { diff --git a/doc/progress.md b/doc/progress.md index 1723376..7a25a53 100644 --- a/doc/progress.md +++ b/doc/progress.md @@ -302,3 +302,27 @@ ### Проверка - `GET /console/api/functions/fn-go-acc` теперь возвращает читаемый Go-код, без `PK...` сигнатур. + +## 2026-04-15 (дополнение) — Полный пользовательский прогон UI и invoke-fix + +### Что проверено как пользовательский сценарий +- Прогнан массовый invoke через UI API (`POST /console/api/functions/{name}/invoke`) для всех функций в списке. +- Итого: `31` функций, из них `25` успешно отработали, `6` вернули 502/timeout (ожидаемо проблемные/сломанные кейсы). +- Проверен полный edit flow через UI API на рабочей функции: + - `GET function` -> `PUT /code` -> `POST /invoke` -> `PUT /code` (restore) -> `POST /invoke`. + +### Найденный UI-баг и исправление +- Баг: после обновления кода через UI следующий invoke мог отдавать старую специализацию/кэш. +- Причина: обновлялся только `Package`, но не обновлялся `Function.spec.package.packageref.resourceversion`. +- Фикс в `console/main.go`: + - после `package update` читается новый `package.resourceVersion` + - выполняется update `Function` с новым `packageref.resourceversion` + - invoke сразу использует новую (или восстановленную) версию кода. + +### Проверка фикса +- После update через UI invoke возвращает новый ответ. +- После restore через UI invoke возвращает исходный ответ (без зависания старого кэша). + +### Статус `fn-go-acc` +- `fn-go-acc` продолжает падать не из-за UI, а из-за runtime specialization на стороне Fission. +- Подтверждено логами `router/executor`: `GetServiceForFunction ... context canceled` и постоянными readiness-fail у poolmgr pod-ов `go-acc`.