Skip to content

Commit 8bcbbae

Browse files
Merge pull request #13 from carlory/resource_fungibility
Fix: node selector matching using labels.Selector
2 parents aeae36a + 4fb3e0a commit 8bcbbae

File tree

1 file changed

+17
-23
lines changed

1 file changed

+17
-23
lines changed

pkg/plugins/resource_fungibility/resource_fungibility.go

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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

5758
type flavor struct {
5859
name string
59-
nodeSelectors map[string]string
60+
nodeSelectors labels.Selector
6061
}
6162

6263
type 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

Comments
 (0)