feat: переменные окружения функций (env vars в CRD)

- Backend: handleGetFunctionEnvVars / handlePutFunctionEnvVars в function_crud.go
- API: GET/PUT /functions/:name/envvars
- handleGetFunction теперь возвращает env_vars в ответе
- Frontend: блок env vars в edit modal (key=value + [×] + [+ Добавить])
- TF-функции показывают env vars в режиме read-only
- Документация: doc/descriptions/function-envvars-flow.md
- Версия v1.3.72
This commit is contained in:
“Naeel”
2026-05-09 06:50:52 +04:00
parent fb469d9c5b
commit 1fa92e069f
6 changed files with 337 additions and 7 deletions
+94
View File
@@ -0,0 +1,94 @@
# Переменные окружения функций (env vars)
## Хранение
Env vars хранятся прямо в Function CRD в поле `.spec.runtime.container.env`:
```yaml
apiVersion: fission.io/v1
kind: Function
metadata:
name: my-fn
namespace: c479c9de005f
spec:
runtime:
container:
env:
- name: DB_HOST
value: "localhost"
- name: API_KEY
value: "secret123"
```
**Почему CRD, а не ConfigMap/PostgreSQL:**
- Env vars — часть конфигурации функции, а не статистика
- CRD хранится в etcd — единственном хранилище состояния Kubernetes
- При удалении функции env vars удаляются автоматически (нет orphan-объектов)
- Не нужен дополнительный RBAC для ConfigMap
- Fission executor сам передаёт `.spec.runtime.container.env` в pod
## API
### GET /console/api/functions/:name/envvars
Возвращает список переменных:
```json
{
"env_vars": [
{"name": "DB_HOST", "value": "localhost"},
{"name": "API_KEY", "value": "secret123"}
]
}
```
### PUT /console/api/functions/:name/envvars
Принимает полный список (полная замена, не merge):
```json
{
"env_vars": [
{"name": "DB_HOST", "value": "new-host"},
{"name": "NEW_VAR", "value": "val"}
]
}
```
Пустой массив `[]` — удалить все переменные.
### GET /console/api/functions/:name
Поле `env_vars` включено в стандартный ответ (чтобы edit modal не делал отдельный запрос).
## Frontend (edit modal)
- Блок "Переменные окружения" появляется в нижней части edit modal при каждом открытии
- Каждая переменная — строка: input[KEY] = input[value] [×]
- Кнопка "+ Добавить переменную" добавляет пустую строку
- Сохранение происходит вместе с остальными полями (Сохранить)
- После сохранения кода/архива вызывается PUT /envvars с текущим состоянием блока
## Terraform-функции (read-only)
Функции с именем `tf-*` или с go-env (Terraform-управляемые) показывают блок env vars в режиме **только чтения**:
- Все input-поля `disabled`
- Кнопки `[×]` и `[+ Добавить]` скрыты
- Предупреждение: "⚠️ Функция управляется Terraform — переменные только для чтения"
- PUT /envvars **не вызывается** при сохранении TF-функций
Изменить переменные TF-функции можно только через Terraform (`terraform apply`).
## Backend (Go)
**Файл:** `console/internal/api/function_crud.go`
- `handleGetFunctionEnvVars` — читает `.spec.runtime.container.env` через dynamic client
- `handlePutFunctionEnvVars` — PATCH Function CRD, обновляет `.spec.runtime.container.env`
- `extractEnvVars` — вспомогательная функция, читает из unstructured в `[]map[string]string`
**Роутинг:** `console/internal/api/handlers.go`
```
GET /console/api/functions/:name/envvars → handleGetFunctionEnvVars
PUT /console/api/functions/:name/envvars → handlePutFunctionEnvVars
```
## Ограничения (MVP)
- Секретные переменные (пароли, токены) хранятся в открытом виде в etcd
- Для sensitive данных в будущем нужно добавить поддержку Secret (valueFrom.secretKeyRef)
- Нет валидации имён переменных по RFC (разрешены любые непустые строки)