- 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
95 lines
4.0 KiB
Markdown
95 lines
4.0 KiB
Markdown
# Переменные окружения функций (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 (разрешены любые непустые строки)
|