doc: add Fission Console UI plan for Codex
This commit is contained in:
@@ -0,0 +1,805 @@
|
|||||||
|
# Fission Console — план разработки UI
|
||||||
|
|
||||||
|
Дата: 2026-04-15
|
||||||
|
Автор: Claude Opus → план для GPT 5.3 Codex
|
||||||
|
Статус: ПЛАН (к реализации)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Цель
|
||||||
|
|
||||||
|
Создать веб-консоль для Fission — аналог `sless-funcs-service` из проекта sless.
|
||||||
|
Консоль позволяет: смотреть функции, создавать, редактировать код, вызывать, управлять триггерами.
|
||||||
|
|
||||||
|
## Референсные файлы (ОБЯЗАТЕЛЬНО ИЗУЧИТЬ)
|
||||||
|
|
||||||
|
Перед написанием кода — прочитай эти файлы из sless (монтирован рядом на VM):
|
||||||
|
|
||||||
|
| Файл | Зачем |
|
||||||
|
|------|-------|
|
||||||
|
| `~/terra/sless/services/funcs/main.go` (942 строки) | **Главный референс** — Go backend funcs-service. Роутинг, proxy к оператору, рендеринг HTML с JSON data injection |
|
||||||
|
| `~/terra/sless/services/funcs/index.html` (1146 строк) | **Главный референс** — UI. Vanilla JS SPA, карточки функций, создание, редактирование, highlight.js, build polling |
|
||||||
|
| `~/terra/sless/services/funcs/Dockerfile` | Multi-stage Go+embed сборка |
|
||||||
|
| `~/terra/sless/services/funcs/funcs-service.yaml` | K8s Deployment+Service+Ingress |
|
||||||
|
| `~/terra/sless/internal/api/ui/iot-console.html` (1330 строк) | Референс для IoT-стиля UI (Nubes branding, login, табы, модалки) |
|
||||||
|
| `~/terra/sless/shared-sqs/app/ui/embed.go` | Паттерн go:embed |
|
||||||
|
| `~/terra/sless/shared-sqs/app/ui/index.html` (932 строки) | Ещё один референс SPA (queue CRUD) |
|
||||||
|
| `~/terra/sless/doc/decisions/funcs_console_editor.md` | Архитектурные решения по редактору кода |
|
||||||
|
|
||||||
|
## Архитектура
|
||||||
|
|
||||||
|
### Компоненты
|
||||||
|
|
||||||
|
```
|
||||||
|
User Browser
|
||||||
|
└─► https://fission.kube5s.ru/console
|
||||||
|
└─► nginx Ingress (уже есть для fission router)
|
||||||
|
└─► fission-console:8090 (новый pod в namespace fission)
|
||||||
|
├─► GET /console → HTML SPA (go:embed)
|
||||||
|
├─► GET /api/environments → kubectl proxy → CRD list
|
||||||
|
├─► GET /api/functions → kubectl proxy → CRD list
|
||||||
|
├─► GET /api/packages → kubectl proxy → CRD list
|
||||||
|
├─► GET /api/triggers → kubectl proxy → CRD list
|
||||||
|
├─► POST /api/functions → create CRD
|
||||||
|
├─► POST /api/functions/{name}/code → update package literal
|
||||||
|
├─► POST /api/functions/{name}/invoke → proxy → router
|
||||||
|
├─► DELETE /api/functions/{name} → delete CRD
|
||||||
|
└─► GET /api/functions/{name}/status → pod status
|
||||||
|
```
|
||||||
|
|
||||||
|
### Технологии
|
||||||
|
|
||||||
|
- **Backend:** Go, net/http, k8s client-go (dynamic client)
|
||||||
|
- **Frontend:** Vanilla HTML/CSS/JS (один файл, go:embed)
|
||||||
|
- **Подсветка кода:** highlight.js (CDN)
|
||||||
|
- **Стиль:** Nubes dark theme (идентичный sless/IoT)
|
||||||
|
- **Деплой:** Docker multi-stage → K8s Deployment + Service + Ingress
|
||||||
|
|
||||||
|
### Почему dynamic client (не REST API):
|
||||||
|
|
||||||
|
Fission в нашем кластере НЕ имеет REST `/v2` API.
|
||||||
|
Все данные — через Kubernetes CRD (environments.fission.io, functions.fission.io итд).
|
||||||
|
Текущий Terraform provider уже работает через dynamic client — переиспользуем тот же подход.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Структура файлов (создать)
|
||||||
|
|
||||||
|
```
|
||||||
|
console/
|
||||||
|
├── main.go # HTTP server + API handlers + k8s client
|
||||||
|
├── ui/
|
||||||
|
│ ├── embed.go # go:embed index.html
|
||||||
|
│ └── index.html # SPA: весь CSS + JS
|
||||||
|
├── go.mod
|
||||||
|
├── Dockerfile # multi-stage: Go → alpine
|
||||||
|
└── deploy/
|
||||||
|
└── console.yaml # K8s Deployment + Service + Ingress rule
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Этап 1: Backend (main.go) — ~400-500 строк Go
|
||||||
|
|
||||||
|
### 1.1 Инициализация
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Переменные окружения:
|
||||||
|
// KUBECONFIG — путь к kubeconfig (dev) или in-cluster
|
||||||
|
// FISSION_NAMESPACE — namespace с функциями (default: "default")
|
||||||
|
// FISSION_ROUTER_URL — внутренний URL роутера (default: "http://router.fission.svc.cluster.local")
|
||||||
|
// PORT — порт (default: "8090")
|
||||||
|
```
|
||||||
|
|
||||||
|
- Создать dynamic client (как в terraform provider — client.go)
|
||||||
|
- Маршруты: `/console` (UI), `/api/*` (JSON API), `/health`
|
||||||
|
|
||||||
|
### 1.2 API endpoints
|
||||||
|
|
||||||
|
| Метод | Путь | Что делает |
|
||||||
|
|-------|------|-----------|
|
||||||
|
| GET | /api/environments | List environments.fission.io → JSON array |
|
||||||
|
| GET | /api/packages | List packages.fission.io → JSON array |
|
||||||
|
| GET | /api/functions | List functions.fission.io → JSON array |
|
||||||
|
| GET | /api/httptriggers | List httptriggers.fission.io → JSON array |
|
||||||
|
| GET | /api/timetriggers | List timetriggers.fission.io → JSON array |
|
||||||
|
| GET | /api/functions/{name} | Get function + связанный package + trigger info |
|
||||||
|
| POST | /api/functions | Create: environment → package → function → httptrigger (всё за один вызов) |
|
||||||
|
| PUT | /api/functions/{name}/code | Update package spec.deployment.literal (новый код) |
|
||||||
|
| POST | /api/functions/{name}/invoke | Proxy → fission router: POST http://router/fission-function/v2/functions/{name} |
|
||||||
|
| DELETE | /api/functions/{name} | Delete function + httptrigger + package (каскадно) |
|
||||||
|
| GET | /api/pods | List pods по label svc=... в namespace "default" (показать runtime pods) |
|
||||||
|
|
||||||
|
### 1.3 Формат ответа (JSON)
|
||||||
|
|
||||||
|
Для листинга функций — объединённая структура:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"functions": [
|
||||||
|
{
|
||||||
|
"name": "hello",
|
||||||
|
"environment": "python",
|
||||||
|
"package": "hello-pkg",
|
||||||
|
"entrypoint": "main.main",
|
||||||
|
"code": "def main():\n return hello\n",
|
||||||
|
"trigger_url": "/hello",
|
||||||
|
"trigger_methods": ["GET"],
|
||||||
|
"invoke_url": "https://fission.kube5s.ru/hello",
|
||||||
|
"created": "2026-04-14T18:30:00Z"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"environments": [
|
||||||
|
{"name": "python", "image": "ghcr.io/fission/python-env", "version": 3}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.4 Create function — полный flow
|
||||||
|
|
||||||
|
POST /api/functions с телом:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "my-func",
|
||||||
|
"environment": "python",
|
||||||
|
"code": "def main():\n return {hello: world}\n",
|
||||||
|
"entrypoint": "main.main",
|
||||||
|
"route": "/my-func",
|
||||||
|
"methods": ["GET", "POST"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Backend создаёт 3 CRD объекта:
|
||||||
|
1. Package (`{name}-pkg`) — spec.environment + spec.deployment.literal (base64 код)
|
||||||
|
2. Function (`{name}`) — spec.environment + spec.package + spec.invokeStrategy
|
||||||
|
3. HTTPTrigger (`{name}-route`) — spec.functionref + spec.relativeurl + spec.methods
|
||||||
|
|
||||||
|
Если environment не существует — вернуть ошибку (не создавать).
|
||||||
|
|
||||||
|
### 1.5 Update code
|
||||||
|
|
||||||
|
PUT /api/functions/{name}/code с телом: `{"code": "..."}`
|
||||||
|
|
||||||
|
1. Найти function CRD → получить package name
|
||||||
|
2. Обновить package spec.deployment.literal (base64 encode)
|
||||||
|
3. Вернуть 200
|
||||||
|
|
||||||
|
### 1.6 Invoke
|
||||||
|
|
||||||
|
POST /api/functions/{name}/invoke с телом: произвольный JSON
|
||||||
|
|
||||||
|
Proxy → `http://router.fission.svc.cluster.local/fission-function/v2/functions/{name}`
|
||||||
|
Вернуть: status code + body + latency
|
||||||
|
|
||||||
|
### 1.7 Каскадное удаление
|
||||||
|
|
||||||
|
DELETE /api/functions/{name}:
|
||||||
|
1. Получить function → имя package и trigger
|
||||||
|
2. Удалить httptrigger(s) связанные с функцией
|
||||||
|
3. Удалить function
|
||||||
|
4. Удалить package
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Этап 2: Frontend (index.html) — ~800-1000 строк
|
||||||
|
|
||||||
|
### 2.1 Дизайн — Nubes dark theme
|
||||||
|
|
||||||
|
CSS переменные (скопировать из sless):
|
||||||
|
```css
|
||||||
|
:root {
|
||||||
|
--bg-page: #001120;
|
||||||
|
--bg-surface: #001929;
|
||||||
|
--bg-navbar: #001C34;
|
||||||
|
--border: #0b2d50;
|
||||||
|
--accent: #1a7fd4;
|
||||||
|
--text-primary: #e2ecf6;
|
||||||
|
--text-secondary: #6b8eaa;
|
||||||
|
--danger: #e74c3c;
|
||||||
|
--success: #27ae60;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 Страницы/секции
|
||||||
|
|
||||||
|
#### Navbar
|
||||||
|
```
|
||||||
|
[Nubes logo] [/] [Fission Console] [namespace: default] [↻ Refresh] [+ Создать функцию]
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Секция: Dashboard (summary)
|
||||||
|
```
|
||||||
|
Environments: 3 | Functions: 8 | Triggers: 7 | Router: fission.kube5s.ru
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Секция: Карточки функций (как в sless funcs-service)
|
||||||
|
|
||||||
|
Каждая функция — карточка:
|
||||||
|
```
|
||||||
|
┌────────────────────────────────────────────────────────────┐
|
||||||
|
│ hello-fn [python] [Ready] https://fission.kube5s.ru/hello │
|
||||||
|
│ ✎ Edit ▶ Invoke ✕ Delete │
|
||||||
|
├────────────────────────────────────────────────────────────┤
|
||||||
|
│ (expand) → показать код с подсветкой (highlight.js) │
|
||||||
|
│ (edit mode) → textarea + Save │
|
||||||
|
│ (invoke mode) → JSON input + Send + Response display │
|
||||||
|
└────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Модалка: Создать функцию
|
||||||
|
```
|
||||||
|
┌─── Создать функцию ──────────────────────────┐
|
||||||
|
│ Environment: [python ▾] [nodejs ▾] [go ▾] │
|
||||||
|
│ Имя: [my-func_________] │
|
||||||
|
│ Entrypoint: [main.main_______] │
|
||||||
|
│ Route: [/my-func________] │
|
||||||
|
│ Файл: main.py │
|
||||||
|
│ ┌──────────────────────────────────────┐ │
|
||||||
|
│ │ def main(): │ │
|
||||||
|
│ │ return {"hello": "world"} │ │
|
||||||
|
│ └──────────────────────────────────────┘ │
|
||||||
|
│ [Отмена] [Создать] │
|
||||||
|
└───────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
При смене environment → обновить шаблон кода/файла:
|
||||||
|
- python → main.py, `def main(): ...`
|
||||||
|
- nodejs → main.js, `module.exports = async function(req) { ... }`
|
||||||
|
- go → main.go, `func Handler(w http.ResponseWriter, r *http.Request) { ... }`
|
||||||
|
|
||||||
|
#### Inline: Invoke функции
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─── Invoke: hello-fn ─────────────────────────┐
|
||||||
|
│ Input JSON: │
|
||||||
|
│ ┌──────────────────────────────────┐ │
|
||||||
|
│ │ {"name": "world"} │ │
|
||||||
|
│ └──────────────────────────────────┘ │
|
||||||
|
│ [▶ Send] │
|
||||||
|
│ │
|
||||||
|
│ Response (200, 34ms): │
|
||||||
|
│ ┌──────────────────────────────────┐ │
|
||||||
|
│ │ {"hello": "world"} │ │
|
||||||
|
│ └──────────────────────────────────┘ │
|
||||||
|
└────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3 JavaScript — SPA логика
|
||||||
|
|
||||||
|
Принципы (из sless referenceов):
|
||||||
|
- Весь state в объекте `S = { functions: [], environments: [], ... }`
|
||||||
|
- `render()` — главный диспетчер
|
||||||
|
- Partial DOM updates по ID (не полный re-render)
|
||||||
|
- `fetch(/api/...)` для всех операций
|
||||||
|
- `h()` — HTML escape utility
|
||||||
|
- Карточки: expand/collapse для кода, inline edit, inline invoke
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Этап 3: Сборка и деплой
|
||||||
|
|
||||||
|
### 3.1 go.mod
|
||||||
|
|
||||||
|
```
|
||||||
|
module fission-console
|
||||||
|
|
||||||
|
go 1.24.0
|
||||||
|
|
||||||
|
require (
|
||||||
|
k8s.io/apimachinery v0.32.3
|
||||||
|
k8s.io/client-go v0.32.3
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Важно: использовать те же версии k8s что в terraform/provider/go.mod.
|
||||||
|
|
||||||
|
### 3.2 Dockerfile
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
FROM golang:1.24-alpine AS builder
|
||||||
|
WORKDIR /build
|
||||||
|
COPY go.mod go.sum ./
|
||||||
|
RUN go mod download
|
||||||
|
COPY . .
|
||||||
|
RUN CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags="-s -w" -o fission-console .
|
||||||
|
|
||||||
|
FROM alpine:3.20
|
||||||
|
RUN apk add --no-cache ca-certificates
|
||||||
|
COPY --from=builder /build/fission-console /fission-console
|
||||||
|
EXPOSE 8090
|
||||||
|
ENTRYPOINT ["/fission-console"]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3 K8s manifest (deploy/console.yaml)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: fission-console
|
||||||
|
namespace: fission
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: fission-console
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: fission-console
|
||||||
|
spec:
|
||||||
|
serviceAccountName: fission-console
|
||||||
|
containers:
|
||||||
|
- name: console
|
||||||
|
image: naeel/fission-console:v0.1.0
|
||||||
|
ports:
|
||||||
|
- containerPort: 8090
|
||||||
|
env:
|
||||||
|
- name: FISSION_NAMESPACE
|
||||||
|
value: "default"
|
||||||
|
- name: FISSION_ROUTER_URL
|
||||||
|
value: "http://router.fission.svc.cluster.local"
|
||||||
|
- name: PORT
|
||||||
|
value: "8090"
|
||||||
|
livenessProbe:
|
||||||
|
httpGet: {path: /health, port: 8090}
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
resources:
|
||||||
|
requests: {cpu: 10m, memory: 16Mi}
|
||||||
|
limits: {cpu: 100m, memory: 64Mi}
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: fission-console
|
||||||
|
namespace: fission
|
||||||
|
---
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: ClusterRole
|
||||||
|
metadata:
|
||||||
|
name: fission-console
|
||||||
|
rules:
|
||||||
|
- apiGroups: ["fission.io"]
|
||||||
|
resources: ["environments", "packages", "functions", "httptriggers", "timetriggers"]
|
||||||
|
verbs: ["get", "list", "create", "update", "patch", "delete"]
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["pods"]
|
||||||
|
verbs: ["get", "list"]
|
||||||
|
---
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: ClusterRoleBinding
|
||||||
|
metadata:
|
||||||
|
name: fission-console
|
||||||
|
subjects:
|
||||||
|
- kind: ServiceAccount
|
||||||
|
name: fission-console
|
||||||
|
namespace: fission
|
||||||
|
roleRef:
|
||||||
|
kind: ClusterRole
|
||||||
|
name: fission-console
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: fission-console
|
||||||
|
namespace: fission
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: fission-console
|
||||||
|
ports:
|
||||||
|
- port: 8090
|
||||||
|
targetPort: 8090
|
||||||
|
---
|
||||||
|
# Ingress: добавить path /console к существующему fission ingress
|
||||||
|
# ИЛИ создать отдельный Ingress для fission-console
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: fission-console
|
||||||
|
namespace: fission
|
||||||
|
annotations:
|
||||||
|
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
|
||||||
|
spec:
|
||||||
|
ingressClassName: nginx
|
||||||
|
rules:
|
||||||
|
- host: fission.kube5s.ru
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /console
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: fission-console
|
||||||
|
port:
|
||||||
|
number: 8090
|
||||||
|
tls:
|
||||||
|
- hosts: [fission.kube5s.ru]
|
||||||
|
secretName: fission-tls # проверить имя секрета
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Этап 4: Тестирование
|
||||||
|
|
||||||
|
### 4.1 Smoke test (вручную в браузере)
|
||||||
|
1. Открыть https://fission.kube5s.ru/console
|
||||||
|
2. Увидеть список существующих функций
|
||||||
|
3. Создать новую функцию (Python) → увидеть в списке
|
||||||
|
4. Отредактировать код → сохранить
|
||||||
|
5. Invoke → получить ответ
|
||||||
|
6. Удалить → исчезла из списка
|
||||||
|
|
||||||
|
### 4.2 curl smoke
|
||||||
|
```bash
|
||||||
|
# API листинг
|
||||||
|
curl -s https://fission.kube5s.ru/console/api/functions | jq .
|
||||||
|
|
||||||
|
# Создать функцию
|
||||||
|
curl -s -X POST https://fission.kube5s.ru/console/api/functions \
|
||||||
|
-H Content-Type: application/json \
|
||||||
|
-d name:test-ui
|
||||||
|
|
||||||
|
# Invoke
|
||||||
|
curl -s -X POST https://fission.kube5s.ru/console/api/functions/test-ui/invoke
|
||||||
|
|
||||||
|
# Удалить
|
||||||
|
curl -s -X DELETE https://fission.kube5s.ru/console/api/functions/test-ui
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Порядок выполнения (для Codex)
|
||||||
|
|
||||||
|
| # | Шаг | Файл(ы) | Критерий готовности |
|
||||||
|
|---|-----|---------|-------------------|
|
||||||
|
| 1 | Создать структуру console/ + go.mod | console/ | `go mod tidy` проходит |
|
||||||
|
| 2 | Написать main.go — HTTP server + k8s client init + health endpoint | main.go | Компилируется, /health отвечает |
|
||||||
|
| 3 | Написать API handlers: list environments/functions/packages/triggers | main.go | `curl /api/functions` возвращает JSON |
|
||||||
|
| 4 | Написать API handler: create function (env→pkg→fn→trigger) | main.go | POST создаёт 3 CRD |
|
||||||
|
| 5 | Написать API handler: update code (package literal) | main.go | PUT обновляет пакет |
|
||||||
|
| 6 | Написать API handler: invoke (proxy → router) | main.go | POST вызывает функцию |
|
||||||
|
| 7 | Написать API handler: delete (каскадно) | main.go | DELETE удаляет fn+pkg+trigger |
|
||||||
|
| 8 | Создать ui/embed.go | ui/embed.go | — |
|
||||||
|
| 9 | Создать index.html — CSS (Nubes dark theme) + navbar + layout | ui/index.html | Открывается с правильным стилем |
|
||||||
|
| 10 | JS: загрузка данных + рендер карточек функций | ui/index.html | Карточки отображаются |
|
||||||
|
| 11 | JS: expand карточки → показать код с подсветкой | ui/index.html | Код виден |
|
||||||
|
| 12 | JS: модалка создания функции + шаблоны Python/JS/Go | ui/index.html | Функция создаётся через UI |
|
||||||
|
| 13 | JS: inline edit mode + save | ui/index.html | Код обновляется |
|
||||||
|
| 14 | JS: inline invoke панель | ui/index.html | Вызов и ответ показываются |
|
||||||
|
| 15 | JS: delete с подтверждением | ui/index.html | Удаление работает |
|
||||||
|
| 16 | Dockerfile + добавить в .gitignore | Dockerfile, .gitignore | `docker build` проходит |
|
||||||
|
| 17 | K8s manifest + RBAC | deploy/console.yaml | Pod запускается, /health OK |
|
||||||
|
| 18 | Ingress → smoke test в браузере | deploy/console.yaml | UI доступен по HTTPS |
|
||||||
|
| 19 | Commit + push | — | Всё в git |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## КРИТИЧЕСКИЕ ПРАВИЛА ВЫПОЛНЕНИЯ
|
||||||
|
|
||||||
|
1. **ВСЁ через SSH на VM** — `ssh naeel@5.172.178.213`. Файлы писать локально (sshfs mount), команды — по SSH.
|
||||||
|
2. **Образы на Docker Hub** (`naeel/fission-console`). НЕ использовать pearlharbor.
|
||||||
|
3. **Nubes branding** — идентичный sless. CSS variables из референса.
|
||||||
|
4. **Vanilla JS** — без React/Vue/Angular. Один HTML файл.
|
||||||
|
5. **go:embed** — index.html встраивается в бинарник.
|
||||||
|
6. **Рабочая директория:** `~/terra/fission/console/`
|
||||||
|
7. **Проверять go.mod версии** — взять k8s-* из `~/terra/fission/terraform/provider/go.mod`
|
||||||
|
8. **Не ломать существующий provider** — console/ отдельный Go module
|
||||||
|
9. **Перед docker build** — убедиться что бинарник в .gitignore
|
||||||
|
10. **Commit + push** после каждого рабочего этапа
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Что НЕ делать
|
||||||
|
|
||||||
|
- Auth/login — пока не нужен (демо-режим, без токенов)
|
||||||
|
- Multi-namespace — работаем с одним namespace (default)
|
||||||
|
- Управление environments через UI — только листинг (создание через terraform)
|
||||||
|
- Логи функций (stdout/stderr) — отложить
|
||||||
|
- Version history — отложить
|
||||||
|
- TimeTriggers CRUD — только отображение (создание — terraform)
|
||||||
|
ENDOFPLAN application/json \
|
||||||
|
-d environment:python
|
||||||
|
|
||||||
|
# Invoke
|
||||||
|
curl -s -X POST https://fission.kube5s.ru/console/api/functions/test-ui/invoke
|
||||||
|
|
||||||
|
# Удалить
|
||||||
|
curl -s -X DELETE https://fission.kube5s.ru/console/api/functions/test-ui
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Порядок выполнения (для Codex)
|
||||||
|
|
||||||
|
| # | Шаг | Файл(ы) | Критерий готовности |
|
||||||
|
|---|-----|---------|-------------------|
|
||||||
|
| 1 | Создать структуру console/ + go.mod | console/ | `go mod tidy` проходит |
|
||||||
|
| 2 | Написать main.go — HTTP server + k8s client init + health endpoint | main.go | Компилируется, /health отвечает |
|
||||||
|
| 3 | Написать API handlers: list environments/functions/packages/triggers | main.go | `curl /api/functions` возвращает JSON |
|
||||||
|
| 4 | Написать API handler: create function (env→pkg→fn→trigger) | main.go | POST создаёт 3 CRD |
|
||||||
|
| 5 | Написать API handler: update code (package literal) | main.go | PUT обновляет пакет |
|
||||||
|
| 6 | Написать API handler: invoke (proxy → router) | main.go | POST вызывает функцию |
|
||||||
|
| 7 | Написать API handler: delete (каскадно) | main.go | DELETE удаляет fn+pkg+trigger |
|
||||||
|
| 8 | Создать ui/embed.go | ui/embed.go | — |
|
||||||
|
| 9 | Создать index.html — CSS (Nubes dark theme) + navbar + layout | ui/index.html | Открывается с правильным стилем |
|
||||||
|
| 10 | JS: загрузка данных + рендер карточек функций | ui/index.html | Карточки отображаются |
|
||||||
|
| 11 | JS: expand карточки → показать код с подсветкой | ui/index.html | Код виден |
|
||||||
|
| 12 | JS: модалка создания функции + шаблоны Python/JS/Go | ui/index.html | Функция создаётся через UI |
|
||||||
|
| 13 | JS: inline edit mode + save | ui/index.html | Код обновляется |
|
||||||
|
| 14 | JS: inline invoke панель | ui/index.html | Вызов и ответ показываются |
|
||||||
|
| 15 | JS: delete с подтверждением | ui/index.html | Удаление работает |
|
||||||
|
| 16 | Dockerfile + добавить в .gitignore | Dockerfile, .gitignore | `docker build` проходит |
|
||||||
|
| 17 | K8s manifest + RBAC | deploy/console.yaml | Pod запускается, /health OK |
|
||||||
|
| 18 | Ingress → smoke test в браузере | deploy/console.yaml | UI доступен по HTTPS |
|
||||||
|
| 19 | Commit + push | — | Всё в git |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## КРИТИЧЕСКИЕ ПРАВИЛА ВЫПОЛНЕНИЯ
|
||||||
|
|
||||||
|
1. **ВСЁ через SSH на VM** — `ssh naeel@5.172.178.213`. Файлы писать локально (sshfs mount), команды — по SSH.
|
||||||
|
2. **Образы на Docker Hub** (`naeel/fission-console`). НЕ использовать pearlharbor.
|
||||||
|
3. **Nubes branding** — идентичный sless. CSS variables из референса.
|
||||||
|
4. **Vanilla JS** — без React/Vue/Angular. Один HTML файл.
|
||||||
|
5. **go:embed** — index.html встраивается в бинарник.
|
||||||
|
6. **Рабочая директория:** `~/terra/fission/console/`
|
||||||
|
7. **Проверять go.mod версии** — взять k8s-* из `~/terra/fission/terraform/provider/go.mod`
|
||||||
|
8. **Не ломать существующий provider** — console/ отдельный Go module
|
||||||
|
9. **Перед docker build** — убедиться что бинарник в .gitignore
|
||||||
|
10. **Commit + push** после каждого рабочего этапа
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Что НЕ делать
|
||||||
|
|
||||||
|
- Auth/login — пока не нужен (демо-режим, без токенов)
|
||||||
|
- Multi-namespace — работаем с одним namespace (default)
|
||||||
|
- Управление environments через UI — только листинг (создание через terraform)
|
||||||
|
- Логи функций (stdout/stderr) — отложить
|
||||||
|
- Version history — отложить
|
||||||
|
- TimeTriggers CRUD — только отображение (создание — terraform)
|
||||||
|
ENDOFPLAN application/json \
|
||||||
|
-d code:def main():\n return {"ok":true}
|
||||||
|
|
||||||
|
# Invoke
|
||||||
|
curl -s -X POST https://fission.kube5s.ru/console/api/functions/test-ui/invoke
|
||||||
|
|
||||||
|
# Удалить
|
||||||
|
curl -s -X DELETE https://fission.kube5s.ru/console/api/functions/test-ui
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Порядок выполнения (для Codex)
|
||||||
|
|
||||||
|
| # | Шаг | Файл(ы) | Критерий готовности |
|
||||||
|
|---|-----|---------|-------------------|
|
||||||
|
| 1 | Создать структуру console/ + go.mod | console/ | `go mod tidy` проходит |
|
||||||
|
| 2 | Написать main.go — HTTP server + k8s client init + health endpoint | main.go | Компилируется, /health отвечает |
|
||||||
|
| 3 | Написать API handlers: list environments/functions/packages/triggers | main.go | `curl /api/functions` возвращает JSON |
|
||||||
|
| 4 | Написать API handler: create function (env→pkg→fn→trigger) | main.go | POST создаёт 3 CRD |
|
||||||
|
| 5 | Написать API handler: update code (package literal) | main.go | PUT обновляет пакет |
|
||||||
|
| 6 | Написать API handler: invoke (proxy → router) | main.go | POST вызывает функцию |
|
||||||
|
| 7 | Написать API handler: delete (каскадно) | main.go | DELETE удаляет fn+pkg+trigger |
|
||||||
|
| 8 | Создать ui/embed.go | ui/embed.go | — |
|
||||||
|
| 9 | Создать index.html — CSS (Nubes dark theme) + navbar + layout | ui/index.html | Открывается с правильным стилем |
|
||||||
|
| 10 | JS: загрузка данных + рендер карточек функций | ui/index.html | Карточки отображаются |
|
||||||
|
| 11 | JS: expand карточки → показать код с подсветкой | ui/index.html | Код виден |
|
||||||
|
| 12 | JS: модалка создания функции + шаблоны Python/JS/Go | ui/index.html | Функция создаётся через UI |
|
||||||
|
| 13 | JS: inline edit mode + save | ui/index.html | Код обновляется |
|
||||||
|
| 14 | JS: inline invoke панель | ui/index.html | Вызов и ответ показываются |
|
||||||
|
| 15 | JS: delete с подтверждением | ui/index.html | Удаление работает |
|
||||||
|
| 16 | Dockerfile + добавить в .gitignore | Dockerfile, .gitignore | `docker build` проходит |
|
||||||
|
| 17 | K8s manifest + RBAC | deploy/console.yaml | Pod запускается, /health OK |
|
||||||
|
| 18 | Ingress → smoke test в браузере | deploy/console.yaml | UI доступен по HTTPS |
|
||||||
|
| 19 | Commit + push | — | Всё в git |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## КРИТИЧЕСКИЕ ПРАВИЛА ВЫПОЛНЕНИЯ
|
||||||
|
|
||||||
|
1. **ВСЁ через SSH на VM** — `ssh naeel@5.172.178.213`. Файлы писать локально (sshfs mount), команды — по SSH.
|
||||||
|
2. **Образы на Docker Hub** (`naeel/fission-console`). НЕ использовать pearlharbor.
|
||||||
|
3. **Nubes branding** — идентичный sless. CSS variables из референса.
|
||||||
|
4. **Vanilla JS** — без React/Vue/Angular. Один HTML файл.
|
||||||
|
5. **go:embed** — index.html встраивается в бинарник.
|
||||||
|
6. **Рабочая директория:** `~/terra/fission/console/`
|
||||||
|
7. **Проверять go.mod версии** — взять k8s-* из `~/terra/fission/terraform/provider/go.mod`
|
||||||
|
8. **Не ломать существующий provider** — console/ отдельный Go module
|
||||||
|
9. **Перед docker build** — убедиться что бинарник в .gitignore
|
||||||
|
10. **Commit + push** после каждого рабочего этапа
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Что НЕ делать
|
||||||
|
|
||||||
|
- Auth/login — пока не нужен (демо-режим, без токенов)
|
||||||
|
- Multi-namespace — работаем с одним namespace (default)
|
||||||
|
- Управление environments через UI — только листинг (создание через terraform)
|
||||||
|
- Логи функций (stdout/stderr) — отложить
|
||||||
|
- Version history — отложить
|
||||||
|
- TimeTriggers CRUD — только отображение (создание — terraform)
|
||||||
|
ENDOFPLAN application/json \
|
||||||
|
-d entrypoint:main.main
|
||||||
|
|
||||||
|
# Invoke
|
||||||
|
curl -s -X POST https://fission.kube5s.ru/console/api/functions/test-ui/invoke
|
||||||
|
|
||||||
|
# Удалить
|
||||||
|
curl -s -X DELETE https://fission.kube5s.ru/console/api/functions/test-ui
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Порядок выполнения (для Codex)
|
||||||
|
|
||||||
|
| # | Шаг | Файл(ы) | Критерий готовности |
|
||||||
|
|---|-----|---------|-------------------|
|
||||||
|
| 1 | Создать структуру console/ + go.mod | console/ | `go mod tidy` проходит |
|
||||||
|
| 2 | Написать main.go — HTTP server + k8s client init + health endpoint | main.go | Компилируется, /health отвечает |
|
||||||
|
| 3 | Написать API handlers: list environments/functions/packages/triggers | main.go | `curl /api/functions` возвращает JSON |
|
||||||
|
| 4 | Написать API handler: create function (env→pkg→fn→trigger) | main.go | POST создаёт 3 CRD |
|
||||||
|
| 5 | Написать API handler: update code (package literal) | main.go | PUT обновляет пакет |
|
||||||
|
| 6 | Написать API handler: invoke (proxy → router) | main.go | POST вызывает функцию |
|
||||||
|
| 7 | Написать API handler: delete (каскадно) | main.go | DELETE удаляет fn+pkg+trigger |
|
||||||
|
| 8 | Создать ui/embed.go | ui/embed.go | — |
|
||||||
|
| 9 | Создать index.html — CSS (Nubes dark theme) + navbar + layout | ui/index.html | Открывается с правильным стилем |
|
||||||
|
| 10 | JS: загрузка данных + рендер карточек функций | ui/index.html | Карточки отображаются |
|
||||||
|
| 11 | JS: expand карточки → показать код с подсветкой | ui/index.html | Код виден |
|
||||||
|
| 12 | JS: модалка создания функции + шаблоны Python/JS/Go | ui/index.html | Функция создаётся через UI |
|
||||||
|
| 13 | JS: inline edit mode + save | ui/index.html | Код обновляется |
|
||||||
|
| 14 | JS: inline invoke панель | ui/index.html | Вызов и ответ показываются |
|
||||||
|
| 15 | JS: delete с подтверждением | ui/index.html | Удаление работает |
|
||||||
|
| 16 | Dockerfile + добавить в .gitignore | Dockerfile, .gitignore | `docker build` проходит |
|
||||||
|
| 17 | K8s manifest + RBAC | deploy/console.yaml | Pod запускается, /health OK |
|
||||||
|
| 18 | Ingress → smoke test в браузере | deploy/console.yaml | UI доступен по HTTPS |
|
||||||
|
| 19 | Commit + push | — | Всё в git |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## КРИТИЧЕСКИЕ ПРАВИЛА ВЫПОЛНЕНИЯ
|
||||||
|
|
||||||
|
1. **ВСЁ через SSH на VM** — `ssh naeel@5.172.178.213`. Файлы писать локально (sshfs mount), команды — по SSH.
|
||||||
|
2. **Образы на Docker Hub** (`naeel/fission-console`). НЕ использовать pearlharbor.
|
||||||
|
3. **Nubes branding** — идентичный sless. CSS variables из референса.
|
||||||
|
4. **Vanilla JS** — без React/Vue/Angular. Один HTML файл.
|
||||||
|
5. **go:embed** — index.html встраивается в бинарник.
|
||||||
|
6. **Рабочая директория:** `~/terra/fission/console/`
|
||||||
|
7. **Проверять go.mod версии** — взять k8s-* из `~/terra/fission/terraform/provider/go.mod`
|
||||||
|
8. **Не ломать существующий provider** — console/ отдельный Go module
|
||||||
|
9. **Перед docker build** — убедиться что бинарник в .gitignore
|
||||||
|
10. **Commit + push** после каждого рабочего этапа
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Что НЕ делать
|
||||||
|
|
||||||
|
- Auth/login — пока не нужен (демо-режим, без токенов)
|
||||||
|
- Multi-namespace — работаем с одним namespace (default)
|
||||||
|
- Управление environments через UI — только листинг (создание через terraform)
|
||||||
|
- Логи функций (stdout/stderr) — отложить
|
||||||
|
- Version history — отложить
|
||||||
|
- TimeTriggers CRUD — только отображение (создание — terraform)
|
||||||
|
ENDOFPLAN application/json \
|
||||||
|
-d route:/test-ui
|
||||||
|
|
||||||
|
# Invoke
|
||||||
|
curl -s -X POST https://fission.kube5s.ru/console/api/functions/test-ui/invoke
|
||||||
|
|
||||||
|
# Удалить
|
||||||
|
curl -s -X DELETE https://fission.kube5s.ru/console/api/functions/test-ui
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Порядок выполнения (для Codex)
|
||||||
|
|
||||||
|
| # | Шаг | Файл(ы) | Критерий готовности |
|
||||||
|
|---|-----|---------|-------------------|
|
||||||
|
| 1 | Создать структуру console/ + go.mod | console/ | `go mod tidy` проходит |
|
||||||
|
| 2 | Написать main.go — HTTP server + k8s client init + health endpoint | main.go | Компилируется, /health отвечает |
|
||||||
|
| 3 | Написать API handlers: list environments/functions/packages/triggers | main.go | `curl /api/functions` возвращает JSON |
|
||||||
|
| 4 | Написать API handler: create function (env→pkg→fn→trigger) | main.go | POST создаёт 3 CRD |
|
||||||
|
| 5 | Написать API handler: update code (package literal) | main.go | PUT обновляет пакет |
|
||||||
|
| 6 | Написать API handler: invoke (proxy → router) | main.go | POST вызывает функцию |
|
||||||
|
| 7 | Написать API handler: delete (каскадно) | main.go | DELETE удаляет fn+pkg+trigger |
|
||||||
|
| 8 | Создать ui/embed.go | ui/embed.go | — |
|
||||||
|
| 9 | Создать index.html — CSS (Nubes dark theme) + navbar + layout | ui/index.html | Открывается с правильным стилем |
|
||||||
|
| 10 | JS: загрузка данных + рендер карточек функций | ui/index.html | Карточки отображаются |
|
||||||
|
| 11 | JS: expand карточки → показать код с подсветкой | ui/index.html | Код виден |
|
||||||
|
| 12 | JS: модалка создания функции + шаблоны Python/JS/Go | ui/index.html | Функция создаётся через UI |
|
||||||
|
| 13 | JS: inline edit mode + save | ui/index.html | Код обновляется |
|
||||||
|
| 14 | JS: inline invoke панель | ui/index.html | Вызов и ответ показываются |
|
||||||
|
| 15 | JS: delete с подтверждением | ui/index.html | Удаление работает |
|
||||||
|
| 16 | Dockerfile + добавить в .gitignore | Dockerfile, .gitignore | `docker build` проходит |
|
||||||
|
| 17 | K8s manifest + RBAC | deploy/console.yaml | Pod запускается, /health OK |
|
||||||
|
| 18 | Ingress → smoke test в браузере | deploy/console.yaml | UI доступен по HTTPS |
|
||||||
|
| 19 | Commit + push | — | Всё в git |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## КРИТИЧЕСКИЕ ПРАВИЛА ВЫПОЛНЕНИЯ
|
||||||
|
|
||||||
|
1. **ВСЁ через SSH на VM** — `ssh naeel@5.172.178.213`. Файлы писать локально (sshfs mount), команды — по SSH.
|
||||||
|
2. **Образы на Docker Hub** (`naeel/fission-console`). НЕ использовать pearlharbor.
|
||||||
|
3. **Nubes branding** — идентичный sless. CSS variables из референса.
|
||||||
|
4. **Vanilla JS** — без React/Vue/Angular. Один HTML файл.
|
||||||
|
5. **go:embed** — index.html встраивается в бинарник.
|
||||||
|
6. **Рабочая директория:** `~/terra/fission/console/`
|
||||||
|
7. **Проверять go.mod версии** — взять k8s-* из `~/terra/fission/terraform/provider/go.mod`
|
||||||
|
8. **Не ломать существующий provider** — console/ отдельный Go module
|
||||||
|
9. **Перед docker build** — убедиться что бинарник в .gitignore
|
||||||
|
10. **Commit + push** после каждого рабочего этапа
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Что НЕ делать
|
||||||
|
|
||||||
|
- Auth/login — пока не нужен (демо-режим, без токенов)
|
||||||
|
- Multi-namespace — работаем с одним namespace (default)
|
||||||
|
- Управление environments через UI — только листинг (создание через terraform)
|
||||||
|
- Логи функций (stdout/stderr) — отложить
|
||||||
|
- Version history — отложить
|
||||||
|
- TimeTriggers CRUD — только отображение (создание — terraform)
|
||||||
|
ENDOFPLAN application/json \
|
||||||
|
-d methods:[GET]
|
||||||
|
|
||||||
|
# Invoke
|
||||||
|
curl -s -X POST https://fission.kube5s.ru/console/api/functions/test-ui/invoke
|
||||||
|
|
||||||
|
# Удалить
|
||||||
|
curl -s -X DELETE https://fission.kube5s.ru/console/api/functions/test-ui
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Порядок выполнения (для Codex)
|
||||||
|
|
||||||
|
| # | Шаг | Файл(ы) | Критерий готовности |
|
||||||
|
|---|-----|---------|-------------------|
|
||||||
|
| 1 | Создать структуру console/ + go.mod | console/ | `go mod tidy` проходит |
|
||||||
|
| 2 | Написать main.go — HTTP server + k8s client init + health endpoint | main.go | Компилируется, /health отвечает |
|
||||||
|
| 3 | Написать API handlers: list environments/functions/packages/triggers | main.go | `curl /api/functions` возвращает JSON |
|
||||||
|
| 4 | Написать API handler: create function (env→pkg→fn→trigger) | main.go | POST создаёт 3 CRD |
|
||||||
|
| 5 | Написать API handler: update code (package literal) | main.go | PUT обновляет пакет |
|
||||||
|
| 6 | Написать API handler: invoke (proxy → router) | main.go | POST вызывает функцию |
|
||||||
|
| 7 | Написать API handler: delete (каскадно) | main.go | DELETE удаляет fn+pkg+trigger |
|
||||||
|
| 8 | Создать ui/embed.go | ui/embed.go | — |
|
||||||
|
| 9 | Создать index.html — CSS (Nubes dark theme) + navbar + layout | ui/index.html | Открывается с правильным стилем |
|
||||||
|
| 10 | JS: загрузка данных + рендер карточек функций | ui/index.html | Карточки отображаются |
|
||||||
|
| 11 | JS: expand карточки → показать код с подсветкой | ui/index.html | Код виден |
|
||||||
|
| 12 | JS: модалка создания функции + шаблоны Python/JS/Go | ui/index.html | Функция создаётся через UI |
|
||||||
|
| 13 | JS: inline edit mode + save | ui/index.html | Код обновляется |
|
||||||
|
| 14 | JS: inline invoke панель | ui/index.html | Вызов и ответ показываются |
|
||||||
|
| 15 | JS: delete с подтверждением | ui/index.html | Удаление работает |
|
||||||
|
| 16 | Dockerfile + добавить в .gitignore | Dockerfile, .gitignore | `docker build` проходит |
|
||||||
|
| 17 | K8s manifest + RBAC | deploy/console.yaml | Pod запускается, /health OK |
|
||||||
|
| 18 | Ingress → smoke test в браузере | deploy/console.yaml | UI доступен по HTTPS |
|
||||||
|
| 19 | Commit + push | — | Всё в git |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## КРИТИЧЕСКИЕ ПРАВИЛА ВЫПОЛНЕНИЯ
|
||||||
|
|
||||||
|
1. **ВСЁ через SSH на VM** — `ssh naeel@5.172.178.213`. Файлы писать локально (sshfs mount), команды — по SSH.
|
||||||
|
2. **Образы на Docker Hub** (`naeel/fission-console`). НЕ использовать pearlharbor.
|
||||||
|
3. **Nubes branding** — идентичный sless. CSS variables из референса.
|
||||||
|
4. **Vanilla JS** — без React/Vue/Angular. Один HTML файл.
|
||||||
|
5. **go:embed** — index.html встраивается в бинарник.
|
||||||
|
6. **Рабочая директория:** `~/terra/fission/console/`
|
||||||
|
7. **Проверять go.mod версии** — взять k8s-* из `~/terra/fission/terraform/provider/go.mod`
|
||||||
|
8. **Не ломать существующий provider** — console/ отдельный Go module
|
||||||
|
9. **Перед docker build** — убедиться что бинарник в .gitignore
|
||||||
|
10. **Commit + push** после каждого рабочего этапа
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Что НЕ делать
|
||||||
|
|
||||||
|
- Auth/login — пока не нужен (демо-режим, без токенов)
|
||||||
|
- Multi-namespace — работаем с одним namespace (default)
|
||||||
|
- Управление environments через UI — только листинг (создание через terraform)
|
||||||
|
- Логи функций (stdout/stderr) — отложить
|
||||||
|
- Version history — отложить
|
||||||
|
- TimeTriggers CRUD — только отображение (создание — terraform)
|
||||||
Reference in New Issue
Block a user