diff --git a/pkg/yurtmanager/controller/hubleader/hubleader_controller.go b/pkg/yurtmanager/controller/hubleader/hubleader_controller.go index c387937ac64..03fe8361548 100644 --- a/pkg/yurtmanager/controller/hubleader/hubleader_controller.go +++ b/pkg/yurtmanager/controller/hubleader/hubleader_controller.go @@ -176,8 +176,8 @@ func (r *ReconcileHubLeader) reconcileHubLeader(ctx context.Context, nodepool *a // Set match labels matchLabels := make(map[string]string) if nodepool.Spec.LeaderElectionStrategy == string(appsv1beta2.ElectionStrategyMark) { - // Add mark strategy match labels - matchLabels = nodepool.Spec.LeaderNodeLabelSelector + // Add mark strategy match labels safely without overwriting matchLabels with a potential nil map + maps.Copy(matchLabels, nodepool.Spec.LeaderNodeLabelSelector) } matchLabels[projectinfo.GetNodePoolLabel()] = nodepool.GetName() diff --git a/pkg/yurtmanager/controller/hubleader/hubleader_controller_test.go b/pkg/yurtmanager/controller/hubleader/hubleader_controller_test.go index b347b967c79..db8e0ad0ffe 100644 --- a/pkg/yurtmanager/controller/hubleader/hubleader_controller_test.go +++ b/pkg/yurtmanager/controller/hubleader/hubleader_controller_test.go @@ -328,6 +328,48 @@ func TestReconcile(t *testing.T) { }, expectErr: false, }, + "mark election strategy with nil LeaderNodeLabelSelector": { + pool: &appsv1beta2.NodePool{ + ObjectMeta: metav1.ObjectMeta{ + Name: "hangzhou", + }, + Spec: appsv1beta2.NodePoolSpec{ + Type: appsv1beta2.Edge, + Labels: map[string]string{ + "region": "hangzhou", + }, + LeaderElectionStrategy: string(appsv1beta2.ElectionStrategyMark), + LeaderNodeLabelSelector: nil, + LeaderReplicas: 1, + EnableLeaderElection: true, + }, + }, + expectedNodePool: &appsv1beta2.NodePool{ + ObjectMeta: metav1.ObjectMeta{ + Name: "hangzhou", + }, + Spec: appsv1beta2.NodePoolSpec{ + Type: appsv1beta2.Edge, + Labels: map[string]string{ + "region": "hangzhou", + }, + LeaderElectionStrategy: string(appsv1beta2.ElectionStrategyMark), + LeaderNodeLabelSelector: nil, + EnableLeaderElection: true, + LeaderReplicas: 1, + }, + Status: appsv1beta2.NodePoolStatus{ + LeaderEndpoints: []appsv1beta2.Leader{ + { + NodeName: "ready with internal IP", + Address: "10.0.0.1", + }, + }, + LeaderNum: 1, + }, + }, + expectErr: false, + }, "no potential leaders in hangzhou with mark strategy": { pool: &appsv1beta2.NodePool{ ObjectMeta: metav1.ObjectMeta{