Skip to content

Commit 6776c4f

Browse files
committed
HyperNode supports select Nodes By labels
Signed-off-by: wangbin <[email protected]>
1 parent e88f6f1 commit 6776c4f

File tree

7 files changed

+583
-193
lines changed

7 files changed

+583
-193
lines changed

pkg/scheduler/api/hyper_node_info.go

Lines changed: 58 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -372,26 +372,26 @@ func (hni *HyperNodesInfo) findLeafNodesWithCycleCheck(hyperNodeName string, lea
372372
}
373373
}
374374

375-
// GetRegexSelectorLeafHyperNodes returns leaf hyperNodes whose member's selector is regex match.
376-
func (hni *HyperNodesInfo) GetRegexSelectorLeafHyperNodes() sets.Set[string] {
375+
// GetRegexOrLabelMatchLeafHyperNodes returns leaf hyperNodes whose member's selector is regex match.
376+
func (hni *HyperNodesInfo) GetRegexOrLabelMatchLeafHyperNodes() sets.Set[string] {
377377
leaf := sets.New[string]()
378378
for name, hnInfo := range hni.hyperNodes {
379379
if hnInfo == nil || hnInfo.HyperNode == nil {
380380
continue
381381
}
382382

383383
isLeaf := true
384-
hasRegexMatch := false
384+
hasMatch := false
385385
for _, member := range hnInfo.HyperNode.Spec.Members {
386386
if member.Type == topologyv1alpha1.MemberTypeHyperNode {
387387
isLeaf = false
388388
break
389389
}
390-
if member.Selector.RegexMatch != nil {
391-
hasRegexMatch = true
390+
if member.Selector.RegexMatch != nil || member.Selector.LabelMatch != nil {
391+
hasMatch = true
392392
}
393393
}
394-
if isLeaf && hasRegexMatch {
394+
if isLeaf && hasMatch {
395395
leaf.Insert(name)
396396
}
397397
}
@@ -447,6 +447,24 @@ func (hni *HyperNodesInfo) getMembers(selector topologyv1alpha1.MemberSelector,
447447
}
448448
}
449449
}
450+
451+
if selector.LabelMatch != nil {
452+
if len(selector.LabelMatch.MatchLabels) == 0 && len(selector.LabelMatch.MatchExpressions) == 0 {
453+
return members
454+
}
455+
labelSelector, err := metav1.LabelSelectorAsSelector(selector.LabelMatch)
456+
if err != nil {
457+
klog.ErrorS(err, "Failed to convert labelMatch to labelSelector", "LabelMatch", selector.LabelMatch)
458+
return sets.Set[string]{}
459+
}
460+
for _, node := range nodes {
461+
nodeLabels := labels.Set(node.Labels)
462+
if labelSelector.Matches(nodeLabels) {
463+
members.Insert(node.Name)
464+
}
465+
}
466+
}
467+
450468
return members
451469
}
452470

@@ -586,35 +604,58 @@ func (hni *HyperNodesInfo) HyperNodesInfo() map[string]string {
586604
return actualHyperNodes
587605
}
588606

589-
// NodeRegexMatchLeafHyperNode checks if a given node regex matches the MemberSelector of a HyperNode.
590-
func (hni *HyperNodesInfo) NodeRegexMatchLeafHyperNode(nodeName string, hyperNodeName string) (bool, error) {
607+
// NodeRegexOrLabelMatchLeafHyperNode checks if a given node matches the MemberSelector of a HyperNode.
608+
func (hni *HyperNodesInfo) NodeRegexOrLabelMatchLeafHyperNode(nodeName string, hyperNodeName string) (bool, error) {
591609
hn, ok := hni.hyperNodes[hyperNodeName]
592610
if !ok {
593611
return false, fmt.Errorf("HyperNode %s not found in cache", hyperNodeName)
594612
}
595613

596614
for _, member := range hn.HyperNode.Spec.Members {
597615
if member.Type == topologyv1alpha1.MemberTypeNode {
598-
if hni.nodeMatchRegexSelector(nodeName, member.Selector) {
616+
if hni.nodeMatchSelector(nodeName, member.Selector) {
599617
return true, nil
600618
}
601619
}
602620
}
603621
return false, nil
604622
}
605623

606-
// nodeMatchRegexSelector checks if a node matches a MemberSelector.
607-
func (hni *HyperNodesInfo) nodeMatchRegexSelector(nodeName string, selector topologyv1alpha1.MemberSelector) bool {
608-
if selector.RegexMatch == nil {
624+
// nodeMatchSelector checks if a node matches a MemberSelector.
625+
func (hni *HyperNodesInfo) nodeMatchSelector(nodeName string, selector topologyv1alpha1.MemberSelector) bool {
626+
if selector.RegexMatch == nil && selector.LabelMatch == nil {
609627
return false
610628
}
611629

612-
reg, err := regexp.Compile(selector.RegexMatch.Pattern)
613-
if err != nil {
614-
klog.ErrorS(err, "Failed to compile regex pattern", "pattern", selector.RegexMatch.Pattern)
615-
return false
630+
if selector.RegexMatch != nil {
631+
reg, err := regexp.Compile(selector.RegexMatch.Pattern)
632+
if err != nil {
633+
klog.ErrorS(err, "Failed to compile regex pattern", "pattern", selector.RegexMatch.Pattern)
634+
return false
635+
}
636+
return reg.MatchString(nodeName)
637+
}
638+
if selector.LabelMatch != nil {
639+
if len(selector.LabelMatch.MatchLabels) == 0 && len(selector.LabelMatch.MatchExpressions) == 0 {
640+
return false
641+
}
642+
labelSelector, err := metav1.LabelSelectorAsSelector(selector.LabelMatch)
643+
if err != nil {
644+
klog.ErrorS(err, "Failed to convert labelMatch to labelSelector", "LabelMatch", selector.LabelMatch)
645+
return false
646+
}
647+
node, err := hni.nodeLister.Get(nodeName)
648+
649+
if err != nil {
650+
klog.ErrorS(err, "Failed to get node", "nodeName", nodeName)
651+
return false
652+
}
653+
nodeLabels := labels.Set(node.Labels)
654+
if labelSelector.Matches(nodeLabels) {
655+
return true
656+
}
616657
}
617-
return reg.MatchString(nodeName)
658+
return false
618659
}
619660

620661
// GetAncestors returns all ancestors of a given HyperNode.

0 commit comments

Comments
 (0)