feat(k8s): A1 K8s 双路由体系统一 — code 路由为主, ID 路由标记 deprecated

后端:
- 新增 4 条 all-NS code 路由: services/ingresses/cronjobs/nodes
- ListNodes 改用 getK8sClientByCode (兼容 ID+code)
- ID 域资源路由标记 // Deprecated

前端:
- clusterApi/nodeApi/workloadApi 资源方法迁移到 code 路由
- KubernetesClusterDetail/TopologyView/KubernetesNodes 组件从 cluster.id 迁移到 cluster.code
- 修复潜在 bug: ClusterOverviewPage 曾将 code 传给 ID-based getNodes

验证: 16/16 API 测试通过 (7 新 code 路由 + 3 旧 ID 兼容 + 6 回归)
go build=✅ tsc -b=✅ npm build=✅
This commit is contained in:
attacker committed 2026-06-27 04:50:58 +08:00
1 parent bb2b91ebe0
commit 00a98e210d
13 files changed
+241 -39

No files matched your search

+5 -4
View File
@@ -8,10 +8,11 @@ export const clusterApi = {
createCluster: async (data: Record<string, unknown>) => http.post('/kubernetes-clusters', data),
updateCluster: async (id: number | string, data: Record<string, unknown>) => http.put(`/kubernetes-clusters/${id}`, data),
deleteCluster: async (id: number | string) => http.delete(`/kubernetes-clusters/${id}`),
getPods: async (clusterId: number | string) => http.get(`/kubernetes-clusters/${clusterId}/pods`),
getDeployments: async (clusterId: number | string) => http.get(`/kubernetes-clusters/${clusterId}/deployments`),
getServices: async (clusterId: number | string) => http.get(`/kubernetes-clusters/${clusterId}/services`),
getIngresses: async (clusterId: number | string) => http.get(`/kubernetes-clusters/${clusterId}/ingresses`),
// 资源列举 — 统一使用 Kuboard code 路由 (ROADMAP A1)
getPods: async (clusterCode: string) => http.get(`/kubernetes/${clusterCode}/pods`),
getDeployments: async (clusterCode: string) => http.get(`/kubernetes/${clusterCode}/deployments`),
getServices: async (clusterCode: string) => http.get(`/kubernetes/${clusterCode}/services`),
getIngresses: async (clusterCode: string) => http.get(`/kubernetes/${clusterCode}/ingresses`),
syncCluster: async (clusterId: number | string) => http.post(`/kubernetes-clusters/${clusterId}/sync`),
exportAllResources: async (clusterCode: string) =>
http.download(`/kubernetes/${clusterCode}/export`, `cluster-${clusterCode}-resources.tar.gz`),
+3 -1
View File
@@ -3,7 +3,9 @@
import { http } from '@/utils/request';
export const nodeApi = {
getNodes: async (clusterId: number | string) => http.get(`/kubernetes-clusters/${clusterId}/nodes`),
// 统一使用 Kuboard code 路由 (ROADMAP A1)
getNodes: async (clusterCode: string) => http.get(`/kubernetes/${clusterCode}/nodes`),
// 别名 — 保持向后兼容(旧代码可能调用 getClusterNodes)
getClusterNodes: async (clusterCode: string) => http.get(`/kubernetes/${clusterCode}/nodes`),
getNodeDetail: async (clusterCode: string, nodeName: string) =>
http.get(`/kubernetes/${clusterCode}/nodes/${encodeURIComponent(nodeName)}`),
+1 -1
View File
@@ -42,7 +42,7 @@ export const workloadApi = {
http.delete(`/kubernetes/${clusterCode}/namespace/${namespace}/hpas/${name}`),
getCronJobs: async (clusterCode: string, namespace?: string) => {
if (namespace) return http.get(`/kubernetes/${clusterCode}/namespace/${namespace}/cronjobs`);
return http.get(`/kubernetes-clusters/${clusterCode}/cronjobs`);
return http.get(`/kubernetes/${clusterCode}/cronjobs`);
},
createCronJob: async (
clusterCode: string,