@@ -23,6 +23,7 @@ import (
2323
2424 v1 "k8s.io/api/core/v1"
2525 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26+ "k8s.io/apimachinery/pkg/labels"
2627 "k8s.io/apimachinery/pkg/runtime"
2728 "k8s.io/apimachinery/pkg/runtime/schema"
2829 "k8s.io/client-go/dynamic"
@@ -56,7 +57,7 @@ type ResourceFungibility struct {
5657
5758type flavor struct {
5859 name string
59- nodeSelectors map [ string ] string
60+ nodeSelectors labels. Selector
6061}
6162
6263type state struct {
@@ -75,11 +76,9 @@ func (s *state) Clone() framework.StateData {
7576 for _ , f := range s .inferenceFlavors {
7677 flavor := flavor {
7778 name : f .name ,
78- nodeSelectors : map [string ]string {},
79- }
80- for k , v := range f .nodeSelectors {
81- flavor .nodeSelectors [k ] = v
79+ nodeSelectors : f .nodeSelectors .DeepCopySelector (),
8280 }
81+ res .inferenceFlavors = append (res .inferenceFlavors , flavor )
8382 }
8483
8584 return & res
@@ -153,19 +152,16 @@ func (rf *ResourceFungibility) calPreFilterState(ctx context.Context, pod *v1.Po
153152 }
154153
155154 for _ , f := range model .Spec .InferenceConfig .Flavors {
156- flavor := flavor {
157- name : string (f .Name ),
158- nodeSelectors : map [string ]string {},
159- }
160155 if len (f .NodeSelector ) == 0 {
161156 // Once nodeSelector is empty, which means all nodes are potential candidates,
162157 // so we'll skip the Filter stage.
163158 s .shouldSkip = true
164159 return nil
165160 }
166161
167- for k , v := range f .NodeSelector {
168- flavor .nodeSelectors [k ] = v
162+ flavor := flavor {
163+ name : string (f .Name ),
164+ nodeSelectors : labels .SelectorFromSet (f .NodeSelector ),
169165 }
170166 s .inferenceFlavors = append (s .inferenceFlavors , flavor )
171167 }
@@ -182,13 +178,13 @@ func (rf *ResourceFungibility) Filter(ctx context.Context, cycleState *framework
182178 return framework .AsStatus (err )
183179 }
184180
181+ node := nodeInfo .Node ()
182+
185183 for _ , flavor := range state .inferenceFlavors {
186- for k , v := range flavor .nodeSelectors {
187- value , ok := nodeInfo .Node ().Labels [k ]
188- if ok && value == v {
189- // At least one flavor matches with the node, success then.
190- return nil
191- }
184+ nodeLabels := labels .Set (node .Labels )
185+ if ! flavor .nodeSelectors .Matches (nodeLabels ) {
186+ // At least one flavor matches with the node, success then.
187+ return nil
192188 }
193189 }
194190 return framework .NewStatus (framework .UnschedulableAndUnresolvable )
@@ -214,12 +210,10 @@ func (rf *ResourceFungibility) Score(ctx context.Context, cycleState *framework.
214210 node := nodeInfo .Node ()
215211
216212 for i , flavor := range state .inferenceFlavors {
217- for k , v := range flavor .nodeSelectors {
218- value , ok := node .Labels [k ]
219- if ok && value == v {
220- // Find the first matched node flavor.
221- return int64 (math .Round (float64 (scoreWeights [i ]) / float64 (totalWeights ) * 100 )), nil
222- }
213+ nodeLabels := labels .Set (node .Labels )
214+ if flavor .nodeSelectors .Matches (nodeLabels ) {
215+ // Find the first matched node flavor.
216+ return int64 (math .Round (float64 (scoreWeights [i ]) / float64 (totalWeights ) * 100 )), nil
223217 }
224218 }
225219
0 commit comments