Skip to content

Commit b535ed3

Browse files
committed
Merge scheduler's ConfigProducerRegistry into LegacyRegistry
1 parent a6b7b0d commit b535ed3

File tree

11 files changed

+515
-547
lines changed

11 files changed

+515
-547
lines changed

pkg/scheduler/algorithmprovider/registry_test.go

Lines changed: 127 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -109,71 +109,142 @@ func TestClusterAutoscalerProvider(t *testing.T) {
109109

110110
func TestApplyFeatureGates(t *testing.T) {
111111
hardPodAffinityWeight := int64(1)
112-
wantConfig := &Config{
113-
FrameworkPlugins: &schedulerapi.Plugins{
114-
PreFilter: &schedulerapi.PluginSet{
115-
Enabled: []schedulerapi.Plugin{
116-
{Name: noderesources.FitName},
117-
{Name: nodeports.Name},
118-
{Name: interpodaffinity.Name},
119-
{Name: podtopologyspread.Name},
112+
tests := []struct {
113+
name string
114+
featuresEnabled bool
115+
wantConfig *Config
116+
}{
117+
{
118+
name: "Feature gates disabled",
119+
featuresEnabled: false,
120+
wantConfig: &Config{
121+
FrameworkPlugins: &schedulerapi.Plugins{
122+
PreFilter: &schedulerapi.PluginSet{
123+
Enabled: []schedulerapi.Plugin{
124+
{Name: noderesources.FitName},
125+
{Name: nodeports.Name},
126+
{Name: interpodaffinity.Name},
127+
},
128+
},
129+
Filter: &schedulerapi.PluginSet{
130+
Enabled: []schedulerapi.Plugin{
131+
{Name: nodeunschedulable.Name},
132+
{Name: noderesources.FitName},
133+
{Name: nodename.Name},
134+
{Name: nodeports.Name},
135+
{Name: nodeaffinity.Name},
136+
{Name: volumerestrictions.Name},
137+
{Name: tainttoleration.Name},
138+
{Name: nodevolumelimits.EBSName},
139+
{Name: nodevolumelimits.GCEPDName},
140+
{Name: nodevolumelimits.CSIName},
141+
{Name: nodevolumelimits.AzureDiskName},
142+
{Name: volumebinding.Name},
143+
{Name: volumezone.Name},
144+
{Name: interpodaffinity.Name},
145+
},
146+
},
147+
PostFilter: &schedulerapi.PluginSet{
148+
Enabled: []schedulerapi.Plugin{
149+
{Name: interpodaffinity.Name},
150+
{Name: tainttoleration.Name},
151+
},
152+
},
153+
Score: &schedulerapi.PluginSet{
154+
Enabled: []schedulerapi.Plugin{
155+
{Name: noderesources.BalancedAllocationName, Weight: 1},
156+
{Name: imagelocality.Name, Weight: 1},
157+
{Name: interpodaffinity.Name, Weight: 1},
158+
{Name: noderesources.LeastAllocatedName, Weight: 1},
159+
{Name: nodeaffinity.Name, Weight: 1},
160+
{Name: nodepreferavoidpods.Name, Weight: 10000},
161+
{Name: defaultpodtopologyspread.Name, Weight: 1},
162+
{Name: tainttoleration.Name, Weight: 1},
163+
},
164+
},
120165
},
121-
},
122-
Filter: &schedulerapi.PluginSet{
123-
Enabled: []schedulerapi.Plugin{
124-
{Name: nodeunschedulable.Name},
125-
{Name: noderesources.FitName},
126-
{Name: nodename.Name},
127-
{Name: nodeports.Name},
128-
{Name: nodeaffinity.Name},
129-
{Name: volumerestrictions.Name},
130-
{Name: tainttoleration.Name},
131-
{Name: nodevolumelimits.EBSName},
132-
{Name: nodevolumelimits.GCEPDName},
133-
{Name: nodevolumelimits.CSIName},
134-
{Name: nodevolumelimits.AzureDiskName},
135-
{Name: volumebinding.Name},
136-
{Name: volumezone.Name},
137-
{Name: interpodaffinity.Name},
138-
{Name: podtopologyspread.Name},
166+
FrameworkPluginConfig: []schedulerapi.PluginConfig{
167+
{
168+
Name: interpodaffinity.Name,
169+
Args: runtime.Unknown{Raw: []byte(fmt.Sprintf(`{"hardPodAffinityWeight":%d}`, hardPodAffinityWeight))},
170+
},
139171
},
140172
},
141-
PostFilter: &schedulerapi.PluginSet{
142-
Enabled: []schedulerapi.Plugin{
143-
{Name: interpodaffinity.Name},
144-
{Name: tainttoleration.Name},
145-
{Name: podtopologyspread.Name},
173+
},
174+
{
175+
name: "Feature gates enabled",
176+
featuresEnabled: true,
177+
wantConfig: &Config{
178+
FrameworkPlugins: &schedulerapi.Plugins{
179+
PreFilter: &schedulerapi.PluginSet{
180+
Enabled: []schedulerapi.Plugin{
181+
{Name: noderesources.FitName},
182+
{Name: nodeports.Name},
183+
{Name: interpodaffinity.Name},
184+
{Name: podtopologyspread.Name},
185+
},
186+
},
187+
Filter: &schedulerapi.PluginSet{
188+
Enabled: []schedulerapi.Plugin{
189+
{Name: nodeunschedulable.Name},
190+
{Name: noderesources.FitName},
191+
{Name: nodename.Name},
192+
{Name: nodeports.Name},
193+
{Name: nodeaffinity.Name},
194+
{Name: volumerestrictions.Name},
195+
{Name: tainttoleration.Name},
196+
{Name: nodevolumelimits.EBSName},
197+
{Name: nodevolumelimits.GCEPDName},
198+
{Name: nodevolumelimits.CSIName},
199+
{Name: nodevolumelimits.AzureDiskName},
200+
{Name: volumebinding.Name},
201+
{Name: volumezone.Name},
202+
{Name: interpodaffinity.Name},
203+
{Name: podtopologyspread.Name},
204+
},
205+
},
206+
PostFilter: &schedulerapi.PluginSet{
207+
Enabled: []schedulerapi.Plugin{
208+
{Name: interpodaffinity.Name},
209+
{Name: tainttoleration.Name},
210+
{Name: podtopologyspread.Name},
211+
},
212+
},
213+
Score: &schedulerapi.PluginSet{
214+
Enabled: []schedulerapi.Plugin{
215+
{Name: noderesources.BalancedAllocationName, Weight: 1},
216+
{Name: imagelocality.Name, Weight: 1},
217+
{Name: interpodaffinity.Name, Weight: 1},
218+
{Name: noderesources.LeastAllocatedName, Weight: 1},
219+
{Name: nodeaffinity.Name, Weight: 1},
220+
{Name: nodepreferavoidpods.Name, Weight: 10000},
221+
{Name: defaultpodtopologyspread.Name, Weight: 1},
222+
{Name: tainttoleration.Name, Weight: 1},
223+
{Name: podtopologyspread.Name, Weight: 1},
224+
{Name: noderesources.ResourceLimitsName, Weight: 1},
225+
},
226+
},
146227
},
147-
},
148-
Score: &schedulerapi.PluginSet{
149-
Enabled: []schedulerapi.Plugin{
150-
{Name: noderesources.BalancedAllocationName, Weight: 1},
151-
{Name: imagelocality.Name, Weight: 1},
152-
{Name: interpodaffinity.Name, Weight: 1},
153-
{Name: noderesources.LeastAllocatedName, Weight: 1},
154-
{Name: nodeaffinity.Name, Weight: 1},
155-
{Name: nodepreferavoidpods.Name, Weight: 10000},
156-
{Name: defaultpodtopologyspread.Name, Weight: 1},
157-
{Name: tainttoleration.Name, Weight: 1},
158-
{Name: podtopologyspread.Name, Weight: 1},
159-
{Name: noderesources.ResourceLimitsName, Weight: 1},
228+
FrameworkPluginConfig: []schedulerapi.PluginConfig{
229+
{
230+
Name: interpodaffinity.Name,
231+
Args: runtime.Unknown{Raw: []byte(fmt.Sprintf(`{"hardPodAffinityWeight":%d}`, hardPodAffinityWeight))},
232+
},
160233
},
161234
},
162235
},
163-
FrameworkPluginConfig: []schedulerapi.PluginConfig{
164-
{
165-
Name: interpodaffinity.Name,
166-
Args: runtime.Unknown{Raw: []byte(fmt.Sprintf(`{"hardPodAffinityWeight":%d}`, hardPodAffinityWeight))},
167-
},
168-
},
169236
}
170237

171-
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ResourceLimitsPriorityFunction, true)()
172-
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.EvenPodsSpread, true)()
238+
for _, test := range tests {
239+
t.Run(test.name, func(t *testing.T) {
240+
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ResourceLimitsPriorityFunction, test.featuresEnabled)()
241+
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.EvenPodsSpread, test.featuresEnabled)()
173242

174-
r := NewRegistry(hardPodAffinityWeight)
175-
gotConfig := r[schedulerapi.SchedulerDefaultProviderName]
176-
if diff := cmp.Diff(wantConfig, gotConfig); diff != "" {
177-
t.Errorf("unexpected config diff (-want, +got): %s", diff)
243+
r := NewRegistry(hardPodAffinityWeight)
244+
gotConfig := r[schedulerapi.SchedulerDefaultProviderName]
245+
if diff := cmp.Diff(test.wantConfig, gotConfig); diff != "" {
246+
t.Errorf("unexpected config diff (-want, +got): %s", diff)
247+
}
248+
})
178249
}
179250
}

pkg/scheduler/apis/config/testing/compatibility_test.go

Lines changed: 50 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) {
133133
"ScorePlugin": {
134134
{Name: "NodeResourcesLeastAllocated", Weight: 1},
135135
{Name: "NodeLabel", Weight: 4},
136+
{Name: "DefaultPodTopologySpread", Weight: 2},
136137
{Name: "ServiceAffinity", Weight: 3},
137138
},
138139
},
@@ -158,8 +159,10 @@ func TestCompatibility_v1_Scheduler(t *testing.T) {
158159
{"name": "LeastRequestedPriority", "weight": 2},
159160
{"name": "BalancedResourceAllocation", "weight": 2},
160161
{"name": "SelectorSpreadPriority", "weight": 2},
161-
{"name": "TestServiceAntiAffinity", "weight": 3, "argument": {"serviceAntiAffinity": {"label": "zone"}}},
162-
{"name": "TestLabelPreference", "weight": 4, "argument": {"labelPreference": {"label": "bar", "presence":true}}}
162+
{"name": "TestServiceAntiAffinity1", "weight": 3, "argument": {"serviceAntiAffinity": {"label": "zone"}}},
163+
{"name": "TestServiceAntiAffinity2", "weight": 3, "argument": {"serviceAntiAffinity": {"label": "region"}}},
164+
{"name": "TestLabelPreference1", "weight": 4, "argument": {"labelPreference": {"label": "bar", "presence":true}}},
165+
{"name": "TestLabelPreference2", "weight": 4, "argument": {"labelPreference": {"label": "foo", "presence":false}}}
163166
]
164167
}`,
165168
wantPlugins: map[string][]config.Plugin{
@@ -182,9 +185,9 @@ func TestCompatibility_v1_Scheduler(t *testing.T) {
182185
"ScorePlugin": {
183186
{Name: "NodeResourcesBalancedAllocation", Weight: 2},
184187
{Name: "NodeResourcesLeastAllocated", Weight: 2},
185-
{Name: "NodeLabel", Weight: 4},
188+
{Name: "NodeLabel", Weight: 8}, // Weight is 4 * number of LabelPreference priorities
186189
{Name: "DefaultPodTopologySpread", Weight: 2},
187-
{Name: "ServiceAffinity", Weight: 3},
190+
{Name: "ServiceAffinity", Weight: 6}, // Weight is the 3 * number of custom ServiceAntiAffinity priorities
188191
},
189192
},
190193
},
@@ -1365,91 +1368,57 @@ func TestCompatibility_v1_Scheduler(t *testing.T) {
13651368

13661369
func TestAlgorithmProviderCompatibility(t *testing.T) {
13671370
// Add serialized versions of scheduler config that exercise available options to ensure compatibility between releases
1371+
defaultPlugins := map[string][]config.Plugin{
1372+
"PreFilterPlugin": {
1373+
{Name: "NodeResourcesFit"},
1374+
{Name: "NodePorts"},
1375+
{Name: "InterPodAffinity"},
1376+
},
1377+
"FilterPlugin": {
1378+
{Name: "NodeUnschedulable"},
1379+
{Name: "NodeResourcesFit"},
1380+
{Name: "NodeName"},
1381+
{Name: "NodePorts"},
1382+
{Name: "NodeAffinity"},
1383+
{Name: "VolumeRestrictions"},
1384+
{Name: "TaintToleration"},
1385+
{Name: "EBSLimits"},
1386+
{Name: "GCEPDLimits"},
1387+
{Name: "NodeVolumeLimits"},
1388+
{Name: "AzureDiskLimits"},
1389+
{Name: "VolumeBinding"},
1390+
{Name: "VolumeZone"},
1391+
{Name: "InterPodAffinity"},
1392+
},
1393+
"PostFilterPlugin": {
1394+
{Name: "InterPodAffinity"},
1395+
{Name: "TaintToleration"},
1396+
},
1397+
"ScorePlugin": {
1398+
{Name: "NodeResourcesBalancedAllocation", Weight: 1},
1399+
{Name: "ImageLocality", Weight: 1},
1400+
{Name: "InterPodAffinity", Weight: 1},
1401+
{Name: "NodeResourcesLeastAllocated", Weight: 1},
1402+
{Name: "NodeAffinity", Weight: 1},
1403+
{Name: "NodePreferAvoidPods", Weight: 10000},
1404+
{Name: "DefaultPodTopologySpread", Weight: 1},
1405+
{Name: "TaintToleration", Weight: 1},
1406+
},
1407+
}
1408+
13681409
testcases := []struct {
13691410
name string
13701411
provider string
13711412
wantPlugins map[string][]config.Plugin
13721413
}{
13731414
{
1374-
name: "No Provider specified",
1375-
wantPlugins: map[string][]config.Plugin{
1376-
"PreFilterPlugin": {
1377-
{Name: "NodeResourcesFit"},
1378-
{Name: "NodePorts"},
1379-
{Name: "InterPodAffinity"},
1380-
},
1381-
"FilterPlugin": {
1382-
{Name: "NodeUnschedulable"},
1383-
{Name: "NodeResourcesFit"},
1384-
{Name: "NodeName"},
1385-
{Name: "NodePorts"},
1386-
{Name: "NodeAffinity"},
1387-
{Name: "VolumeRestrictions"},
1388-
{Name: "TaintToleration"},
1389-
{Name: "EBSLimits"},
1390-
{Name: "GCEPDLimits"},
1391-
{Name: "NodeVolumeLimits"},
1392-
{Name: "AzureDiskLimits"},
1393-
{Name: "VolumeBinding"},
1394-
{Name: "VolumeZone"},
1395-
{Name: "InterPodAffinity"},
1396-
},
1397-
"PostFilterPlugin": {
1398-
{Name: "InterPodAffinity"},
1399-
{Name: "TaintToleration"},
1400-
},
1401-
"ScorePlugin": {
1402-
{Name: "NodeResourcesBalancedAllocation", Weight: 1},
1403-
{Name: "ImageLocality", Weight: 1},
1404-
{Name: "InterPodAffinity", Weight: 1},
1405-
{Name: "NodeResourcesLeastAllocated", Weight: 1},
1406-
{Name: "NodeAffinity", Weight: 1},
1407-
{Name: "NodePreferAvoidPods", Weight: 10000},
1408-
{Name: "DefaultPodTopologySpread", Weight: 1},
1409-
{Name: "TaintToleration", Weight: 1},
1410-
},
1411-
},
1415+
name: "No Provider specified",
1416+
wantPlugins: defaultPlugins,
14121417
},
14131418
{
1414-
name: "DefaultProvider",
1415-
provider: config.SchedulerDefaultProviderName,
1416-
wantPlugins: map[string][]config.Plugin{
1417-
"PreFilterPlugin": {
1418-
{Name: "NodeResourcesFit"},
1419-
{Name: "NodePorts"},
1420-
{Name: "InterPodAffinity"},
1421-
},
1422-
"FilterPlugin": {
1423-
{Name: "NodeUnschedulable"},
1424-
{Name: "NodeResourcesFit"},
1425-
{Name: "NodeName"},
1426-
{Name: "NodePorts"},
1427-
{Name: "NodeAffinity"},
1428-
{Name: "VolumeRestrictions"},
1429-
{Name: "TaintToleration"},
1430-
{Name: "EBSLimits"},
1431-
{Name: "GCEPDLimits"},
1432-
{Name: "NodeVolumeLimits"},
1433-
{Name: "AzureDiskLimits"},
1434-
{Name: "VolumeBinding"},
1435-
{Name: "VolumeZone"},
1436-
{Name: "InterPodAffinity"},
1437-
},
1438-
"PostFilterPlugin": {
1439-
{Name: "InterPodAffinity"},
1440-
{Name: "TaintToleration"},
1441-
},
1442-
"ScorePlugin": {
1443-
{Name: "NodeResourcesBalancedAllocation", Weight: 1},
1444-
{Name: "ImageLocality", Weight: 1},
1445-
{Name: "InterPodAffinity", Weight: 1},
1446-
{Name: "NodeResourcesLeastAllocated", Weight: 1},
1447-
{Name: "NodeAffinity", Weight: 1},
1448-
{Name: "NodePreferAvoidPods", Weight: 10000},
1449-
{Name: "DefaultPodTopologySpread", Weight: 1},
1450-
{Name: "TaintToleration", Weight: 1},
1451-
},
1452-
},
1419+
name: "DefaultProvider",
1420+
provider: config.SchedulerDefaultProviderName,
1421+
wantPlugins: defaultPlugins,
14531422
},
14541423
{
14551424
name: "ClusterAutoscalerProvider",

0 commit comments

Comments
 (0)