@@ -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