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 (