From 67bc255ce58ee11479504e09e712f3152c5c6e11 Mon Sep 17 00:00:00 2001 From: GatewayJ <835269233@qq.com> Date: Thu, 7 May 2026 23:52:27 +0800 Subject: [PATCH 1/2] feat: add tenant status condition reconciliation --- console-web/app/(dashboard)/page.tsx | 26 +- console-web/app/(dashboard)/tenants/page.tsx | 32 +- console-web/i18n/locales/en-US.json | 2 + console-web/i18n/locales/zh-CN.json | 2 + console-web/lib/tenant-state.ts | 34 + console-web/types/api.ts | 40 +- console-web/types/topology.ts | 7 +- src/console/handlers/tenants.rs | 105 +-- src/console/handlers/topology.rs | 26 +- src/console/models/tenant.rs | 370 ++++++++- src/console/models/topology.rs | 5 + src/console/openapi.rs | 8 +- src/context.rs | 46 ++ src/lib.rs | 1 + src/reconcile.rs | 668 +++++++-------- src/reconcile/phases.rs | 529 ++++++++++++ src/status.rs | 816 +++++++++++++++++++ src/types/error.rs | 3 + src/types/v1alpha1/status.rs | 428 +++++++++- src/types/v1alpha1/status/pool.rs | 4 +- 20 files changed, 2646 insertions(+), 506 deletions(-) create mode 100644 console-web/lib/tenant-state.ts create mode 100644 src/reconcile/phases.rs create mode 100644 src/status.rs diff --git a/console-web/app/(dashboard)/page.tsx b/console-web/app/(dashboard)/page.tsx index a24ce7d..c736186 100755 --- a/console-web/app/(dashboard)/page.tsx +++ b/console-web/app/(dashboard)/page.tsx @@ -14,6 +14,7 @@ import { Spinner } from "@/components/ui/spinner" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import * as api from "@/lib/api" import { ApiError } from "@/lib/api-client" +import { normalizeTopologyTenantState } from "@/lib/tenant-state" import { cn, formatBinaryBytes, formatK8sMemory } from "@/lib/utils" import type { ClusterResourcesResponse, NamespaceItem, NodeInfo } from "@/types/api" import type { TopologyOverviewResponse, TopologyTenantState } from "@/types/topology" @@ -33,6 +34,16 @@ const STATE_THEME: Record< dot: "bg-emerald-500", card: "border-emerald-200 bg-emerald-50/60", }, + Reconciling: { + badge: "border-blue-200 bg-blue-50 text-blue-700", + dot: "bg-blue-500", + card: "border-blue-200 bg-blue-50/60", + }, + Blocked: { + badge: "border-purple-200 bg-purple-50 text-purple-700", + dot: "bg-purple-500", + card: "border-purple-200 bg-purple-50/60", + }, Updating: { badge: "border-blue-200 bg-blue-50 text-blue-700", dot: "bg-blue-500", @@ -60,8 +71,11 @@ function getTreeDotClass(state: string): string { case "Ready": case "Running": return "bg-emerald-500" + case "Reconciling": case "Updating": return "bg-blue-500" + case "Blocked": + return "bg-purple-500" case "Degraded": case "Pending": return "bg-amber-500" @@ -151,7 +165,10 @@ export default function DashboardPage() { const topologySummary = topology?.cluster.summary const tenantCount = topology?.namespaces.reduce((sum, ns) => sum + ns.tenants.length, 0) ?? 0 const unhealthyCount = - topology?.namespaces.reduce((sum, ns) => sum + ns.tenants.filter((t) => t.state !== "Ready").length, 0) ?? 0 + topology?.namespaces.reduce( + (sum, ns) => sum + ns.tenants.filter((tenant) => normalizeTopologyTenantState(tenant.state) !== "Ready").length, + 0, + ) ?? 0 const allPods = topology?.namespaces.flatMap((ns) => ns.tenants.flatMap((t) => t.pods ?? [])) ?? [] const podTotal = allPods.length @@ -257,6 +274,7 @@ export default function DashboardPage() { const tenantId = `t:${ns.name}/${tenant.name}` const pools = tenant.pools ?? [] const pods = tenant.pods ?? [] + const tenantState = normalizeTopologyTenantState(tenant.state) return (