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