fix: env vars через newdeploy+podspec — попадают в pod OS env для всех языков

This commit is contained in:
“Naeel”
2026-05-09 07:49:36 +04:00
parent 089994256c
commit 7887d4597d
4 changed files with 190 additions and 89 deletions
+1 -1
View File
@@ -55,7 +55,7 @@ spec:
serviceAccountName: fission-console
containers:
- name: console
image: naeel/fission-console:v1.3.76
image: naeel/fission-console:v1.3.77
imagePullPolicy: Always
ports:
- containerPort: 8090
+71 -4
View File
@@ -308,7 +308,16 @@ func (s *Server) handleGetFunctionEnvVars(w http.ResponseWriter, r *http.Request
writeAnyJSON(w, http.StatusOK, map[string]any{"env_vars": envVars})
}
// handlePutFunctionEnvVars обновляет переменные окружения функции в аннотации fission-console/env-vars (JSON)
// handlePutFunctionEnvVars обновляет переменные окружения функции.
//
// Логика переключения ExecutorType:
// - Если env vars непустые → ExecutorType: newdeploy + spec.podspec.containers[0].env
// (newdeploy создаёт dedicated Deployment, Kubernetes ставит env vars на уровне ОС)
// - Если env vars пустые → ExecutorType: poolmgr, podspec удаляется
// (poolmgr использует warm pool, быстрый cold start)
//
// Это единственный универсальный способ передать env vars в pod для всех языков
// (Python, Go, Ruby, PHP, Node.js) без изменений в env-серверах.
func (s *Server) handlePutFunctionEnvVars(w http.ResponseWriter, r *http.Request, name string) {
ctx, cancel := context.WithTimeout(r.Context(), 10*time.Second)
defer cancel()
@@ -341,14 +350,14 @@ func (s *Server) handlePutFunctionEnvVars(w http.ResponseWriter, r *http.Request
return
}
// Сериализуем в JSON для аннотации
// Сериализуем в JSON для аннотации (для UI)
envJSON, err := json.Marshal(req.EnvVars)
if err != nil {
writeJSONError(w, http.StatusInternalServerError, fmt.Sprintf("marshal env vars: %v", err))
return
}
// Обновляем аннотацию updated-at
// Обновляем аннотации
now := time.Now().UTC().Format(time.RFC3339)
ann := fn.GetAnnotations()
if ann == nil {
@@ -358,12 +367,70 @@ func (s *Server) handlePutFunctionEnvVars(w http.ResponseWriter, r *http.Request
ann["fission-console/env-vars"] = string(envJSON)
fn.SetAnnotations(ann)
if len(req.EnvVars) > 0 {
// Есть env vars → newdeploy + podspec с env vars
envName, _, _ := unstructured.NestedString(fn.Object, "spec", "environment", "name")
// Строим список env vars для Kubernetes
envList := make([]any, 0, len(req.EnvVars))
for _, ev := range req.EnvVars {
envList = append(envList, map[string]any{
"name": ev["name"],
"value": ev["value"],
})
}
// Устанавливаем podspec.containers[0] с env vars
// Имя контейнера = имя environment (стандарт Fission)
if err := unstructured.SetNestedSlice(fn.Object, []any{
map[string]any{
"name": envName,
"env": envList,
},
}, "spec", "podspec", "containers"); err != nil {
writeJSONError(w, http.StatusInternalServerError, fmt.Sprintf("set podspec: %v", err))
return
}
// Переключаем на newdeploy (только он поддерживает podspec env)
if err := unstructured.SetNestedField(fn.Object, map[string]any{
"ExecutionStrategy": map[string]any{
"ExecutorType": "newdeploy",
"MinScale": int64(0),
"MaxScale": int64(1),
"SpecializationTimeout": int64(120),
},
"StrategyType": "execution",
}, "spec", "InvokeStrategy"); err != nil {
writeJSONError(w, http.StatusInternalServerError, fmt.Sprintf("set invoke strategy: %v", err))
return
}
} else {
// Нет env vars → poolmgr, убираем podspec
unstructured.RemoveNestedField(fn.Object, "spec", "podspec")
if err := unstructured.SetNestedField(fn.Object, map[string]any{
"ExecutionStrategy": map[string]any{
"ExecutorType": "poolmgr",
"SpecializationTimeout": int64(120),
},
"StrategyType": "execution",
}, "spec", "InvokeStrategy"); err != nil {
writeJSONError(w, http.StatusInternalServerError, fmt.Sprintf("set invoke strategy: %v", err))
return
}
}
if _, err := s.dyn.Resource(fission.FunctionGVR).Namespace(ns).Update(ctx, fn, metav1.UpdateOptions{}); err != nil {
writeJSONError(w, http.StatusBadGateway, fmt.Sprintf("update function %q: %v", name, err))
return
}
writeAnyJSON(w, http.StatusOK, map[string]any{"updated": true, "count": len(req.EnvVars)})
executor := "poolmgr"
if len(req.EnvVars) > 0 {
executor = "newdeploy"
}
writeAnyJSON(w, http.StatusOK, map[string]any{"updated": true, "count": len(req.EnvVars), "executor": executor})
}
// extractEnvVars читает аннотацию fission-console/env-vars (JSON) из Function CRD
+2 -2
View File
@@ -102,7 +102,7 @@
<div class="nubes">NUBES</div>
<div class="product">FISSION CONSOLE</div>
</div>
<div style="font-size:0.65rem; color:var(--text-secondary); margin-left:10px; align-self:center; opacity:0.7;">v1.3.76</div>
<div style="font-size:0.65rem; color:var(--text-secondary); margin-left:10px; align-self:center; opacity:0.7;">v1.3.77</div>
</div>
<div class="row" style="margin:0;">
<button class="btn ghost" onclick="reloadAll()">Refresh</button>
@@ -510,7 +510,7 @@
</div>
<div class="actions" style="justify-content:space-between; align-items:center;">
<span style="font-size:0.75rem; color:var(--text-secondary);">v1.3.76</span>
<span style="font-size:0.75rem; color:var(--text-secondary);">v1.3.77</span>
<button class="btn ghost" onclick="closeHelp()">Закрыть</button>
</div>
</div>