Skip to content

Commit d96f2d1

Browse files
committed
feat(topology): reuse member cluster workload detail drawer on topology member workload node click
Signed-off-by: SunsetB612 <10235101575@stu.ecnu.edu.cn>
1 parent ee5877e commit d96f2d1

4 files changed

Lines changed: 543 additions & 709 deletions

File tree

pkg/resource/topology/chain.go

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ import (
2626
policyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/policy/v1alpha1"
2727
workv1alpha1 "github.com/karmada-io/karmada/pkg/apis/work/v1alpha1"
2828
workv1alpha2 "github.com/karmada-io/karmada/pkg/apis/work/v1alpha2"
29-
karmadautil "github.com/karmada-io/karmada/pkg/util"
30-
karmadanames "github.com/karmada-io/karmada/pkg/util/names"
31-
"golang.org/x/sync/errgroup"
32-
corev1 "k8s.io/api/core/v1"
29+
karmadautil "github.com/karmada-io/karmada/pkg/util"
30+
karmadanames "github.com/karmada-io/karmada/pkg/util/names"
31+
"golang.org/x/sync/errgroup"
32+
corev1 "k8s.io/api/core/v1"
3333
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3434
"k8s.io/apimachinery/pkg/types"
3535
kubeclient "k8s.io/client-go/kubernetes"
@@ -445,34 +445,33 @@ func traceChain(
445445
Status: memberStatus,
446446
})
447447
resp.Edges = append(resp.Edges, TopologyEdge{Source: workNodeID, Target: memberNodeID})
448+
449+
// Step 5: Get Pods in member cluster
450+
pods, err := getPodsByWorkUID(ctx, clusterName, namespace, name, kind)
451+
if err != nil {
452+
klog.V(4).InfoS("Failed to get pods", "work", w.Name, "cluster", clusterName, "err", err)
453+
return nil
454+
}
455+
for _, pod := range pods {
456+
podNodeID := fmt.Sprintf("pod-%s-%s", clusterName, pod.UID)
457+
resp.Nodes = append(resp.Nodes, TopologyNode{
458+
ID: podNodeID,
459+
Type: NodeTypePod,
460+
Name: pod.Name,
461+
Namespace: pod.Namespace,
462+
Cluster: clusterName,
463+
Status: getPodStatus(pod),
464+
})
465+
resp.Edges = append(resp.Edges, TopologyEdge{
466+
Source: memberNodeID,
467+
Target: podNodeID,
468+
})
469+
}
448470
return nil
449471
})
450-
// Step 5: Get Pods in member cluster
451-
pods, err := getPodsByWorkUID(ctx, clusterName, namespace, name, kind)
452-
if err != nil {
453-
klog.V(4).InfoS("Failed to get pods", "work", w.Name, "cluster", clusterName, "err", err)
454-
return nil
455-
}
456-
for _, pod := range pods {
457-
podNodeID := fmt.Sprintf("pod-%s-%s", clusterName, pod.UID)
458-
resp.Nodes = append(resp.Nodes, TopologyNode{
459-
ID: podNodeID,
460-
Type: NodeTypePod,
461-
Name: pod.Name,
462-
Namespace: pod.Namespace,
463-
Cluster: clusterName,
464-
Status: getPodStatus(pod),
465-
})
466-
resp.Edges = append(resp.Edges, TopologyEdge{
467-
Source: memberNodeID,
468-
Target: podNodeID,
469-
})
470-
}
471-
return nil
472-
})
473-
}
474-
if err := g.Wait(); err != nil {
475-
return nil, err
472+
}
473+
if err := g.Wait(); err != nil {
474+
return nil, err
476475
}
477476
}
478477
return resp, nil

ui/apps/dashboard/src/components/topology/topology-graph.tsx

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import PropagationPolicyEditorDrawer from '@/pages/multicloud-policy-manage/prop
3737
import OverridePolicyEditorDrawer from '@/pages/multicloud-policy-manage/override-policy/override-policy-editor-drawer';
3838
import ResourceBindingDetailDrawer from '@/pages/multicloud-resource-manage/resource-binding/resource-binding-detail-drawer';
3939
import WorkDetailDrawer from '@/pages/multicloud-resource-manage/work/work-detail-drawer';
40+
import MemberClusterWorkloadDetailDrawer from '@/pages/member-cluster/workload/member-cluster-workload-detail-drawer';
4041
import { GetResource } from '@/services/unstructured';
4142
import { stringify } from 'yaml';
4243

@@ -78,6 +79,14 @@ const TopologyGraph = ({ namespace, kind, name }: TopologyGraphProps) => {
7879
const [rbDrawerState, setRbDrawerState] = useState<PolicyDrawerState>(closedPolicyDrawer);
7980
const [workDrawerState, setWorkDrawerState] = useState<PolicyDrawerState>(closedPolicyDrawer);
8081

82+
const [memberWorkloadDrawerState, setMemberWorkloadDrawerState] = useState<{
83+
open: boolean;
84+
memberClusterName: string;
85+
namespace: string;
86+
name: string;
87+
kind: WorkloadKind;
88+
}>({ open: false, memberClusterName: '', namespace: '', name: '', kind: '' as WorkloadKind });
89+
8190
const onNodeClick = useCallback(async (_: React.MouseEvent, node: Node) => {
8291
const d = node.data as unknown as TopologyNodeData;
8392
if (d.nodeType === 'ResourceTemplate' && d.kind && d.namespace && d.name) {
@@ -111,6 +120,14 @@ const TopologyGraph = ({ namespace, kind, name }: TopologyGraphProps) => {
111120
} catch (err) {
112121
console.error('Failed to fetch Work detail', err);
113122
}
123+
} else if (d.nodeType === 'MemberClusterWorkload' && d.cluster && d.name && d.namespace && d.kind) {
124+
setMemberWorkloadDrawerState({
125+
open: true,
126+
memberClusterName: d.cluster,
127+
namespace: d.namespace,
128+
name: d.name,
129+
kind: d.kind.toLowerCase() as WorkloadKind,
130+
});
114131
}
115132
}, []);
116133

@@ -273,6 +290,14 @@ const TopologyGraph = ({ namespace, kind, name }: TopologyGraphProps) => {
273290
content={workDrawerState.content}
274291
onClose={() => setWorkDrawerState(closedPolicyDrawer)}
275292
/>
293+
<MemberClusterWorkloadDetailDrawer
294+
open={memberWorkloadDrawerState.open}
295+
memberClusterName={memberWorkloadDrawerState.memberClusterName}
296+
namespace={memberWorkloadDrawerState.namespace}
297+
name={memberWorkloadDrawerState.name}
298+
kind={memberWorkloadDrawerState.kind}
299+
onClose={() => setMemberWorkloadDrawerState((s) => ({ ...s, open: false }))}
300+
/>
276301
</>
277302
);
278303
};

0 commit comments

Comments
 (0)