admin-console: fast namespace list + async detail loading per ns

This commit is contained in:
“Naeel”
2026-05-25 10:40:49 +04:00
parent d570a6b8a5
commit 21ab7b9d6b
3 changed files with 111 additions and 28 deletions
+18 -10
View File
@@ -96,8 +96,7 @@ func (k *K8sClient) initS3() {
log.Printf("[admin-console] S3 client ready, bucket=%s", bucket)
}
// ListClientNamespaces возвращает namespace-ы с лейблом managed-by=fission-console.
// Для каждого считает количество объектов Fission CRD через Dynamic клиент.
// ListClientNamespaces возвращает список namespace-ов БЕЗ CRD-счётчиков (быстро).
func (k *K8sClient) ListClientNamespaces(ctx context.Context) ([]model.NamespaceInfo, error) {
nsList, err := k.cs.CoreV1().Namespaces().List(ctx, metav1.ListOptions{
LabelSelector: "managed-by=fission-console",
@@ -108,17 +107,30 @@ func (k *K8sClient) ListClientNamespaces(ctx context.Context) ([]model.Namespace
result := make([]model.NamespaceInfo, 0, len(nsList.Items))
for _, ns := range nsList.Items {
info := model.NamespaceInfo{
result = append(result, model.NamespaceInfo{
Name: ns.Name,
UserEmail: ns.Labels["user"],
CreatedAt: ns.CreationTimestamp.Format(time.RFC3339),
}
k.fillCRDCounts(ctx, ns.Name, &info)
result = append(result, info)
})
}
return result, nil
}
// GetNamespaceDetail возвращает информацию об одном namespace с CRD-счётчиками.
func (k *K8sClient) GetNamespaceDetail(ctx context.Context, nsName string) (*model.NamespaceInfo, error) {
ns, err := k.cs.CoreV1().Namespaces().Get(ctx, nsName, metav1.GetOptions{})
if err != nil {
return nil, err
}
info := &model.NamespaceInfo{
Name: ns.Name,
UserEmail: ns.Labels["user"],
CreatedAt: ns.CreationTimestamp.Format(time.RFC3339),
}
k.fillCRDCounts(ctx, nsName, info)
return info, nil
}
// fillCRDCounts заполняет счётчики Fission-ресурсов для одного namespace.
func (k *K8sClient) fillCRDCounts(ctx context.Context, ns string, info *model.NamespaceInfo) {
count := func(gvr schema.GroupVersionResource) int {
@@ -126,8 +138,6 @@ func (k *K8sClient) fillCRDCounts(ctx context.Context, ns string, info *model.Na
if err != nil {
return 0
}
// List возвращает items и list-metadata с remaining count.
// Используем оставшийся счёт для точности.
if rem := list.GetRemainingItemCount(); rem != nil {
return int(*rem) + len(list.Items)
}
@@ -222,10 +232,8 @@ func (k *K8sClient) ListUsers(ctx context.Context) ([]model.UserInfo, error) {
var users []model.UserInfo
for _, ns := range nsList.Items {
// label user содержит email владельца namespace
email := ns.Labels["user"]
if email == "" {
// fallback: попробовать прочитать из secret
secret, err := k.cs.CoreV1().Secrets(ns.Name).Get(ctx, "fission-console-users", metav1.GetOptions{})
if err == nil {
for key := range secret.Data {