@@ -23,6 +23,7 @@ import (
23
23
24
24
v1 "k8s.io/api/core/v1"
25
25
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26
+ "k8s.io/apimachinery/pkg/labels"
26
27
"k8s.io/apimachinery/pkg/runtime"
27
28
"k8s.io/apimachinery/pkg/runtime/schema"
28
29
"k8s.io/client-go/dynamic"
@@ -56,7 +57,7 @@ type ResourceFungibility struct {
56
57
57
58
type flavor struct {
58
59
name string
59
- nodeSelectors map [ string ] string
60
+ nodeSelectors labels. Selector
60
61
}
61
62
62
63
type state struct {
@@ -75,11 +76,9 @@ func (s *state) Clone() framework.StateData {
75
76
for _ , f := range s .inferenceFlavors {
76
77
flavor := flavor {
77
78
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 (),
82
80
}
81
+ res .inferenceFlavors = append (res .inferenceFlavors , flavor )
83
82
}
84
83
85
84
return & res
@@ -153,19 +152,16 @@ func (rf *ResourceFungibility) calPreFilterState(ctx context.Context, pod *v1.Po
153
152
}
154
153
155
154
for _ , f := range model .Spec .InferenceConfig .Flavors {
156
- flavor := flavor {
157
- name : string (f .Name ),
158
- nodeSelectors : map [string ]string {},
159
- }
160
155
if len (f .NodeSelector ) == 0 {
161
156
// Once nodeSelector is empty, which means all nodes are potential candidates,
162
157
// so we'll skip the Filter stage.
163
158
s .shouldSkip = true
164
159
return nil
165
160
}
166
161
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 ),
169
165
}
170
166
s .inferenceFlavors = append (s .inferenceFlavors , flavor )
171
167
}
@@ -182,13 +178,13 @@ func (rf *ResourceFungibility) Filter(ctx context.Context, cycleState *framework
182
178
return framework .AsStatus (err )
183
179
}
184
180
181
+ node := nodeInfo .Node ()
182
+
185
183
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
192
188
}
193
189
}
194
190
return framework .NewStatus (framework .UnschedulableAndUnresolvable )
@@ -214,12 +210,10 @@ func (rf *ResourceFungibility) Score(ctx context.Context, cycleState *framework.
214
210
node := nodeInfo .Node ()
215
211
216
212
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
223
217
}
224
218
}
225
219
0 commit comments