Skip to content

Commit adb8b08

Browse files
authored
Merge pull request kubernetes#86905 from draveness/feature/disable-scheduling-plugin
feat(scheduling): address disabled plugins in scheduling framework
2 parents e648e94 + 50deec2 commit adb8b08

File tree

4 files changed

+271
-11
lines changed

4 files changed

+271
-11
lines changed

pkg/scheduler/apis/config/BUILD

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
load("@io_bazel_rules_go//go:def.bzl", "go_library")
1+
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
22

33
go_library(
44
name = "go_default_library",
@@ -15,6 +15,7 @@ go_library(
1515
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
1616
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
1717
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
18+
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
1819
"//staging/src/k8s.io/component-base/config:go_default_library",
1920
],
2021
)
@@ -39,3 +40,10 @@ filegroup(
3940
tags = ["automanaged"],
4041
visibility = ["//visibility:public"],
4142
)
43+
44+
go_test(
45+
name = "go_default_test",
46+
srcs = ["types_test.go"],
47+
embed = [":go_default_library"],
48+
deps = ["//vendor/github.com/google/go-cmp/cmp:go_default_library"],
49+
)

pkg/scheduler/apis/config/types.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121

2222
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2323
"k8s.io/apimachinery/pkg/runtime"
24+
"k8s.io/apimachinery/pkg/util/sets"
2425
componentbaseconfig "k8s.io/component-base/config"
2526
)
2627

@@ -270,3 +271,52 @@ func (p *Plugins) Append(src *Plugins) {
270271
p.PostBind = appendPluginSet(p.PostBind, src.PostBind)
271272
p.Unreserve = appendPluginSet(p.Unreserve, src.Unreserve)
272273
}
274+
275+
// Apply merges the plugin configuration from custom plugins, handling disabled sets.
276+
func (p *Plugins) Apply(customPlugins *Plugins) {
277+
if customPlugins == nil {
278+
return
279+
}
280+
281+
p.QueueSort = mergePluginSets(p.QueueSort, customPlugins.QueueSort)
282+
p.PreFilter = mergePluginSets(p.PreFilter, customPlugins.PreFilter)
283+
p.Filter = mergePluginSets(p.Filter, customPlugins.Filter)
284+
p.PostFilter = mergePluginSets(p.PostFilter, customPlugins.PostFilter)
285+
p.Score = mergePluginSets(p.Score, customPlugins.Score)
286+
p.Reserve = mergePluginSets(p.Reserve, customPlugins.Reserve)
287+
p.Permit = mergePluginSets(p.Permit, customPlugins.Permit)
288+
p.PreBind = mergePluginSets(p.PreBind, customPlugins.PreBind)
289+
p.Bind = mergePluginSets(p.Bind, customPlugins.Bind)
290+
p.PostBind = mergePluginSets(p.PostBind, customPlugins.PostBind)
291+
p.Unreserve = mergePluginSets(p.Unreserve, customPlugins.Unreserve)
292+
}
293+
294+
func mergePluginSets(defaultPluginSet, customPluginSet *PluginSet) *PluginSet {
295+
if customPluginSet == nil {
296+
customPluginSet = &PluginSet{}
297+
}
298+
299+
if defaultPluginSet == nil {
300+
defaultPluginSet = &PluginSet{}
301+
}
302+
303+
disabledPlugins := sets.NewString()
304+
for _, disabledPlugin := range customPluginSet.Disabled {
305+
disabledPlugins.Insert(disabledPlugin.Name)
306+
}
307+
308+
enabledPlugins := []Plugin{}
309+
if !disabledPlugins.Has("*") {
310+
for _, defaultEnabledPlugin := range defaultPluginSet.Enabled {
311+
if disabledPlugins.Has(defaultEnabledPlugin.Name) {
312+
continue
313+
}
314+
315+
enabledPlugins = append(enabledPlugins, defaultEnabledPlugin)
316+
}
317+
}
318+
319+
enabledPlugins = append(enabledPlugins, customPluginSet.Enabled...)
320+
321+
return &PluginSet{Enabled: enabledPlugins}
322+
}
Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
/*
2+
Copyright 2020 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package config
18+
19+
import (
20+
"testing"
21+
22+
"github.com/google/go-cmp/cmp"
23+
)
24+
25+
func TestPluginsApply(t *testing.T) {
26+
tests := []struct {
27+
name string
28+
customPlugins *Plugins
29+
defaultPlugins *Plugins
30+
expectedPlugins *Plugins
31+
}{
32+
{
33+
name: "AppendCustomPlugin",
34+
customPlugins: &Plugins{
35+
Filter: &PluginSet{
36+
Enabled: []Plugin{
37+
{Name: "CustomPlugin"},
38+
},
39+
},
40+
},
41+
defaultPlugins: &Plugins{
42+
Filter: &PluginSet{
43+
Enabled: []Plugin{
44+
{Name: "DefaultPlugin1"},
45+
{Name: "DefaultPlugin2"},
46+
},
47+
},
48+
},
49+
expectedPlugins: &Plugins{
50+
QueueSort: &PluginSet{Enabled: []Plugin{}},
51+
PreFilter: &PluginSet{Enabled: []Plugin{}},
52+
Filter: &PluginSet{
53+
Enabled: []Plugin{
54+
{Name: "DefaultPlugin1"},
55+
{Name: "DefaultPlugin2"},
56+
{Name: "CustomPlugin"},
57+
},
58+
},
59+
PostFilter: &PluginSet{Enabled: []Plugin{}},
60+
Score: &PluginSet{Enabled: []Plugin{}},
61+
Reserve: &PluginSet{Enabled: []Plugin{}},
62+
Permit: &PluginSet{Enabled: []Plugin{}},
63+
PreBind: &PluginSet{Enabled: []Plugin{}},
64+
Bind: &PluginSet{Enabled: []Plugin{}},
65+
PostBind: &PluginSet{Enabled: []Plugin{}},
66+
Unreserve: &PluginSet{Enabled: []Plugin{}},
67+
},
68+
},
69+
{
70+
name: "InsertAfterDefaultPlugins2",
71+
customPlugins: &Plugins{
72+
Filter: &PluginSet{
73+
Enabled: []Plugin{
74+
{Name: "CustomPlugin"},
75+
{Name: "DefaultPlugin2"},
76+
},
77+
Disabled: []Plugin{
78+
{Name: "DefaultPlugin2"},
79+
},
80+
},
81+
},
82+
defaultPlugins: &Plugins{
83+
Filter: &PluginSet{
84+
Enabled: []Plugin{
85+
{Name: "DefaultPlugin1"},
86+
{Name: "DefaultPlugin2"},
87+
},
88+
},
89+
},
90+
expectedPlugins: &Plugins{
91+
QueueSort: &PluginSet{Enabled: []Plugin{}},
92+
PreFilter: &PluginSet{Enabled: []Plugin{}},
93+
Filter: &PluginSet{
94+
Enabled: []Plugin{
95+
{Name: "DefaultPlugin1"},
96+
{Name: "CustomPlugin"},
97+
{Name: "DefaultPlugin2"},
98+
},
99+
},
100+
PostFilter: &PluginSet{Enabled: []Plugin{}},
101+
Score: &PluginSet{Enabled: []Plugin{}},
102+
Reserve: &PluginSet{Enabled: []Plugin{}},
103+
Permit: &PluginSet{Enabled: []Plugin{}},
104+
PreBind: &PluginSet{Enabled: []Plugin{}},
105+
Bind: &PluginSet{Enabled: []Plugin{}},
106+
PostBind: &PluginSet{Enabled: []Plugin{}},
107+
Unreserve: &PluginSet{Enabled: []Plugin{}},
108+
},
109+
},
110+
{
111+
name: "InsertBeforeAllPlugins",
112+
customPlugins: &Plugins{
113+
Filter: &PluginSet{
114+
Enabled: []Plugin{
115+
{Name: "CustomPlugin"},
116+
{Name: "DefaultPlugin1"},
117+
{Name: "DefaultPlugin2"},
118+
},
119+
Disabled: []Plugin{
120+
{Name: "*"},
121+
},
122+
},
123+
},
124+
defaultPlugins: &Plugins{
125+
Filter: &PluginSet{
126+
Enabled: []Plugin{
127+
{Name: "DefaultPlugin1"},
128+
{Name: "DefaultPlugin2"},
129+
},
130+
},
131+
},
132+
expectedPlugins: &Plugins{
133+
QueueSort: &PluginSet{Enabled: []Plugin{}},
134+
PreFilter: &PluginSet{Enabled: []Plugin{}},
135+
Filter: &PluginSet{
136+
Enabled: []Plugin{
137+
{Name: "CustomPlugin"},
138+
{Name: "DefaultPlugin1"},
139+
{Name: "DefaultPlugin2"},
140+
},
141+
},
142+
PostFilter: &PluginSet{Enabled: []Plugin{}},
143+
Score: &PluginSet{Enabled: []Plugin{}},
144+
Reserve: &PluginSet{Enabled: []Plugin{}},
145+
Permit: &PluginSet{Enabled: []Plugin{}},
146+
PreBind: &PluginSet{Enabled: []Plugin{}},
147+
Bind: &PluginSet{Enabled: []Plugin{}},
148+
PostBind: &PluginSet{Enabled: []Plugin{}},
149+
Unreserve: &PluginSet{Enabled: []Plugin{}},
150+
},
151+
},
152+
{
153+
name: "ReorderDefaultPlugins",
154+
customPlugins: &Plugins{
155+
Filter: &PluginSet{
156+
Enabled: []Plugin{
157+
{Name: "DefaultPlugin2"},
158+
{Name: "DefaultPlugin1"},
159+
},
160+
Disabled: []Plugin{
161+
{Name: "*"},
162+
},
163+
},
164+
},
165+
defaultPlugins: &Plugins{
166+
Filter: &PluginSet{
167+
Enabled: []Plugin{
168+
{Name: "DefaultPlugin1"},
169+
{Name: "DefaultPlugin2"},
170+
},
171+
},
172+
},
173+
expectedPlugins: &Plugins{
174+
QueueSort: &PluginSet{Enabled: []Plugin{}},
175+
PreFilter: &PluginSet{Enabled: []Plugin{}},
176+
Filter: &PluginSet{
177+
Enabled: []Plugin{
178+
{Name: "DefaultPlugin2"},
179+
{Name: "DefaultPlugin1"},
180+
},
181+
},
182+
PostFilter: &PluginSet{Enabled: []Plugin{}},
183+
Score: &PluginSet{Enabled: []Plugin{}},
184+
Reserve: &PluginSet{Enabled: []Plugin{}},
185+
Permit: &PluginSet{Enabled: []Plugin{}},
186+
PreBind: &PluginSet{Enabled: []Plugin{}},
187+
Bind: &PluginSet{Enabled: []Plugin{}},
188+
PostBind: &PluginSet{Enabled: []Plugin{}},
189+
Unreserve: &PluginSet{Enabled: []Plugin{}},
190+
},
191+
},
192+
}
193+
194+
for _, test := range tests {
195+
t.Run(test.name, func(t *testing.T) {
196+
test.defaultPlugins.Apply(test.customPlugins)
197+
if d := cmp.Diff(test.expectedPlugins, test.defaultPlugins); d != "" {
198+
t.Fatalf("plugins mismatch (-want +got):\n%s", d)
199+
}
200+
})
201+
}
202+
}

pkg/scheduler/factory.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -186,11 +186,11 @@ func (c *Configurator) createFromProvider(providerName string) (*Scheduler, erro
186186
}
187187

188188
// Combine the provided plugins with the ones from component config.
189-
// TODO(#86789): address disabled plugins.
190-
var plugins schedulerapi.Plugins
191-
plugins.Append(provider.FrameworkPlugins)
192-
plugins.Append(c.plugins)
193-
c.plugins = &plugins
189+
var defaultPlugins schedulerapi.Plugins
190+
defaultPlugins.Append(provider.FrameworkPlugins)
191+
defaultPlugins.Apply(c.plugins)
192+
c.plugins = &defaultPlugins
193+
194194
var pluginConfig []schedulerapi.PluginConfig
195195
pluginConfig = append(pluginConfig, provider.FrameworkPluginConfig...)
196196
pluginConfig = append(pluginConfig, c.pluginConfig...)
@@ -297,11 +297,11 @@ func (c *Configurator) createFromConfig(policy schedulerapi.Policy) (*Scheduler,
297297
}
298298
// Combine all framework configurations. If this results in any duplication, framework
299299
// instantiation should fail.
300-
var plugins schedulerapi.Plugins
301-
plugins.Append(pluginsForPredicates)
302-
plugins.Append(pluginsForPriorities)
303-
plugins.Append(c.plugins)
304-
c.plugins = &plugins
300+
var defaultPlugins schedulerapi.Plugins
301+
defaultPlugins.Append(pluginsForPredicates)
302+
defaultPlugins.Append(pluginsForPriorities)
303+
defaultPlugins.Apply(c.plugins)
304+
c.plugins = &defaultPlugins
305305

306306
var pluginConfig []schedulerapi.PluginConfig
307307
pluginConfig = append(pluginConfig, pluginConfigForPredicates...)

0 commit comments

Comments
 (0)