feat: namespace-per-user via JWT sub SHA256 + ensureNamespace in operator
- operator: ensureNamespace() создаёт k8s namespace при первом Create-запросе
- operator: defaultNamespace константа вместо хардкода 'default'
- provider: SubFromJWT декодирует JWT payload, извлекает sub
- provider: NamespaceFromSub вычисляет sless-{sha256[:8]} из sub
- provider: PingNubesAPI валидирует токен запросом к nubes API
- provider: Configure вычисляет namespace и создаёт Client с ним
- provider: новый атрибут nubes_endpoint (опционально, env: NUBES_ENDPOINT)
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
// Изменено: 2026-03-07
|
||||
// Изменено: 2026-03-11
|
||||
// functions.go — CRUD handlers для Function CRD.
|
||||
// Принимает JSON, создаёт/обновляет/удаляет k8s ресурсы Function.
|
||||
// Namespace берётся из URL: /v1/namespaces/{namespace}/functions/{name}
|
||||
@@ -80,6 +80,12 @@ func (h *Handler) ListFunctions(w http.ResponseWriter, r *http.Request) {
|
||||
// CreateFunction — POST /v1/namespaces/{namespace}/functions
|
||||
func (h *Handler) CreateFunction(w http.ResponseWriter, r *http.Request) {
|
||||
ns := namespace(r)
|
||||
// Гарантируем существование namespace перед созданием Function CRD.
|
||||
// Подробнее про логику — см. ensureNamespace() в handler.go.
|
||||
if err := h.ensureNamespace(r.Context(), ns); err != nil {
|
||||
writeJSON(w, http.StatusInternalServerError, errResp("ensure namespace: "+err.Error()))
|
||||
return
|
||||
}
|
||||
var req functionRequest
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
writeJSON(w, http.StatusBadRequest, errResp("invalid JSON: "+err.Error()))
|
||||
|
||||
Reference in New Issue
Block a user