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:
@@ -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 (разрешены любые непустые строки)
|
||||
Reference in New Issue
Block a user