Files
fission-src/doc/console-compat-2026-05-15.md
T
“Naeel” 4eedf95f5c fix(namespace): executor/router/buildermgr RemoveNamespace + per-NS informer lifecycle
- Add RemoveNamespace(ctx, ns) to executortype.ExecutorType interface
- Implement RemoveNamespace in poolmgr, newdeploy, container executor types
- Add per-namespace context cancellation (nsCancels map) in all three types so
  informer factories are stopped when namespace is removed (fixes goroutine leak)
- Add PoolPodController.RemoveNamespace to clear envLister/podLister maps
- Add deregisterNamespace() in executor multitenant subscriber
- Switch executor/router/buildermgr watcher strategy from TrackOnly to DispatchRemove
  so RemoveFunc is called when fission.io/managed label is removed
- Add RemoveFunc to executor/router/buildermgr namespace subscribers
- Add RemoveNamespace to environmentWatcher and packageWatcher with per-NS cancel
- Add RemoveNamespace to HTTPTriggerSet: cancels informers, removes from maps, calls syncTriggers
- Fix ns_watcher_test.go fakeExecutorType to implement new RemoveNamespace method

Fixes:
- Executor dedup gap: re-added namespace was silently skipped (envLister/deplLister still present)
- Goroutine/FD leak: old informer factories ran forever after namespace removal
- Router stale routes: HTTPTriggers for removed namespace stayed in routing table
2026-05-18 09:04:13 +04:00

73 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Console ↔ fission-src multitenant: compatibility check (2026-05-15)
## Что изменилось в fission-src (feature/multitenant)
| Изменение | Файл |
|---|---|
| Удалён старый partial RBAC | `deploy/executor-ns-watcher-rbac.yaml` |
| Добавлен полный RBAC для NSWatcher | `deploy/multitenant/rbac.yaml` |
| Добавлен `EnsureNamespaceSA` | `pkg/utils/serviceaccount.go` |
| NSWatcher вызывает `EnsureNamespaceSA` при обнаружении NS с `fission.io/managed=true` | `pkg/executor/multitenant/ns_watcher.go` |
| Добавлен тест NSWatcher с fake k8s | `pkg/utils/namespace_manager_test.go` |
---
## Что делает консоль при создании namespace
`SetupFissionNamespace` в `console/internal/fission/namespace.go`:
1. Создаёт Namespace с лейблами:
- `managed-by=fission-console`
- `fission.io/managed=true` ← триггер для NSWatcher
2. Создаёт ServiceAccounts: `fission-fetcher`, `fission-builder`
3. Создаёт RoleBindings с `cluster-admin` ClusterRole для всех Fission SA:
- `fission-executor`, `fission-router`, `fission-buildermgr`, `fission-kubewatcher`, `fission-timer`
- `fission-fetcher` (из fission NS + локально в user NS)
- `fission-builder` (из fission NS + локально в user NS)
---
## Взаимодействие с EnsureNamespaceSA
`EnsureNamespaceSA` вызывается NSWatcher **после** того как консоль создала NS.
Логика (в `setupSAAndRoleBindings`):
1. Создаёт/получает SA `fission-fetcher` → SA уже существует → `IsAlreadyExists` → OK
2. Для каждого permission из `fetcherCheck` вызывает `checkPermission` через `localsubjectaccessreviews`
3. Поскольку у `fission-fetcher` уже есть `cluster-admin` RoleBinding (создан консолью) →
**все проверки возвращают `exists=true`**`rules` остаётся пустым → Role и RoleBinding **не создаются**
**Итог: EnsureNamespaceSA является no-op если консоль уже настроила namespace. Никаких конфликтов.**
---
## Что нужно на кластере
Для работы NSWatcher нужен `deploy/multitenant/rbac.yaml` применён **один раз**:
```bash
kubectl apply -f ~/terra/fission-src/deploy/multitenant/rbac.yaml
```
Это даёт:
- `fission-executor``list/watch namespaces` (NSWatcher)
- `fission-router``list/watch namespaces` (NSWatcher)
- `fission-executor``create SA/Role/RoleBinding` в user NS (`fission-executor-sa-provisioner`)
Без этого RBAC `EnsureNamespaceSA` будет падать с Forbidden, но **консоль продолжит работать** — она создаёт SA/RoleBindings сама и не зависит от NSWatcher.
---
## Вердикт
| Сценарий | Статус |
|---|---|
| Новый NS создаётся через консоль | ✅ работает как раньше |
| NSWatcher обнаруживает NS по `fission.io/managed=true` | ✅ совместимо |
| `EnsureNamespaceSA` вызывается в уже настроенном NS | ✅ no-op, нет конфликтов |
| Старый NS (без нового fission-bundle) | ✅ консоль не зависит от NSWatcher |
| Сборка консоли (`go build ./...`) | ✅ BUILD OK |
**Код консоли менять не нужно.** Нужно только применить `deploy/multitenant/rbac.yaml` при деплое нового fission-bundle.