From 64f6bf6ceaf779a1321bb344dd9c76a26dbbfbac Mon Sep 17 00:00:00 2001 From: mac Date: Wed, 22 Jul 2026 15:20:33 +0800 Subject: [PATCH] fix(container): avoid duplicate Wayne workload rows --- server/internal/service/container_service.go | 33 +++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/server/internal/service/container_service.go b/server/internal/service/container_service.go index 7b5c87d..9c783f2 100644 --- a/server/internal/service/container_service.go +++ b/server/internal/service/container_service.go @@ -65,6 +65,7 @@ func (s *WayneRoleBindingService) ContainerServiceData(ctx context.Context, quer } workloads := make([]ContainerWorkload, 0) clusterNodes := map[string]wayneNodeSummary{} + seenWorkloads := map[string]struct{}{} errors := make([]string, 0) for _, binding := range query.Namespaces { @@ -88,6 +89,11 @@ func (s *WayneRoleBindingService) ContainerServiceData(ctx context.Context, quer errors = append(errors, fmt.Sprintf("namespace %d apps: %v", binding.WayneNamespaceID, err)) continue } + if len(apps) == 0 { + errors = append(errors, fmt.Sprintf("namespace %d has no apps for deployment query", binding.WayneNamespaceID)) + continue + } + appID := apps[0].ID for _, cluster := range clusters { if _, ok := clusterNodes[cluster]; !ok { nodes, err := s.getWayneNodes(ctx, cluster) @@ -97,21 +103,24 @@ func (s *WayneRoleBindingService) ContainerServiceData(ctx context.Context, quer clusterNodes[cluster] = nodes } } - for _, app := range apps { - items, err := s.listWayneDeployments(ctx, app.ID, kubeNamespace, cluster) - if err != nil { - errors = append(errors, fmt.Sprintf("namespace %d cluster %s app %d deployments: %v", binding.WayneNamespaceID, cluster, app.ID, err)) + items, err := s.listWayneDeployments(ctx, appID, kubeNamespace, cluster) + if err != nil { + errors = append(errors, fmt.Sprintf("namespace %d cluster %s app %d deployments: %v", binding.WayneNamespaceID, cluster, appID, err)) + continue + } + for _, item := range items { + workload := containerWorkloadFromMap(item, cluster, kubeNamespace, query.BusinessLineName) + if workload.Name == "" { continue } - for _, item := range items { - workload := containerWorkloadFromMap(item, cluster, kubeNamespace, query.BusinessLineName) - if workload.Name == "" { - continue - } - workloads = append(workloads, workload) - summary.Pods += workload.Pods - summary.ReadyPods += workload.ReadyPods + key := strings.Join([]string{workload.Cluster, workload.Namespace, workload.Workload, workload.Name}, "\x00") + if _, ok := seenWorkloads[key]; ok { + continue } + seenWorkloads[key] = struct{}{} + workloads = append(workloads, workload) + summary.Pods += workload.Pods + summary.ReadyPods += workload.ReadyPods } } }