registry_test.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. /*
  2. Copyright 2017 The Kubernetes Authors.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package algorithmprovider
  14. import (
  15. "testing"
  16. "github.com/google/go-cmp/cmp"
  17. utilfeature "k8s.io/apiserver/pkg/util/feature"
  18. featuregatetesting "k8s.io/component-base/featuregate/testing"
  19. "k8s.io/kubernetes/pkg/features"
  20. schedulerapi "k8s.io/kubernetes/pkg/scheduler/apis/config"
  21. "k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultbinder"
  22. "k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpodtopologyspread"
  23. "k8s.io/kubernetes/pkg/scheduler/framework/plugins/imagelocality"
  24. "k8s.io/kubernetes/pkg/scheduler/framework/plugins/interpodaffinity"
  25. "k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeaffinity"
  26. "k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodename"
  27. "k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeports"
  28. "k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodepreferavoidpods"
  29. "k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources"
  30. "k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeunschedulable"
  31. "k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodevolumelimits"
  32. "k8s.io/kubernetes/pkg/scheduler/framework/plugins/podtopologyspread"
  33. "k8s.io/kubernetes/pkg/scheduler/framework/plugins/queuesort"
  34. "k8s.io/kubernetes/pkg/scheduler/framework/plugins/tainttoleration"
  35. "k8s.io/kubernetes/pkg/scheduler/framework/plugins/volumebinding"
  36. "k8s.io/kubernetes/pkg/scheduler/framework/plugins/volumerestrictions"
  37. "k8s.io/kubernetes/pkg/scheduler/framework/plugins/volumezone"
  38. )
  39. func TestClusterAutoscalerProvider(t *testing.T) {
  40. wantConfig := &schedulerapi.Plugins{
  41. QueueSort: &schedulerapi.PluginSet{
  42. Enabled: []schedulerapi.Plugin{
  43. {Name: queuesort.Name},
  44. },
  45. },
  46. PreFilter: &schedulerapi.PluginSet{
  47. Enabled: []schedulerapi.Plugin{
  48. {Name: noderesources.FitName},
  49. {Name: nodeports.Name},
  50. {Name: interpodaffinity.Name},
  51. },
  52. },
  53. Filter: &schedulerapi.PluginSet{
  54. Enabled: []schedulerapi.Plugin{
  55. {Name: nodeunschedulable.Name},
  56. {Name: noderesources.FitName},
  57. {Name: nodename.Name},
  58. {Name: nodeports.Name},
  59. {Name: nodeaffinity.Name},
  60. {Name: volumerestrictions.Name},
  61. {Name: tainttoleration.Name},
  62. {Name: nodevolumelimits.EBSName},
  63. {Name: nodevolumelimits.GCEPDName},
  64. {Name: nodevolumelimits.CSIName},
  65. {Name: nodevolumelimits.AzureDiskName},
  66. {Name: volumebinding.Name},
  67. {Name: volumezone.Name},
  68. {Name: interpodaffinity.Name},
  69. },
  70. },
  71. PostFilter: &schedulerapi.PluginSet{
  72. Enabled: []schedulerapi.Plugin{
  73. {Name: interpodaffinity.Name},
  74. {Name: defaultpodtopologyspread.Name},
  75. {Name: tainttoleration.Name},
  76. },
  77. },
  78. Score: &schedulerapi.PluginSet{
  79. Enabled: []schedulerapi.Plugin{
  80. {Name: noderesources.BalancedAllocationName, Weight: 1},
  81. {Name: imagelocality.Name, Weight: 1},
  82. {Name: interpodaffinity.Name, Weight: 1},
  83. {Name: noderesources.MostAllocatedName, Weight: 1},
  84. {Name: nodeaffinity.Name, Weight: 1},
  85. {Name: nodepreferavoidpods.Name, Weight: 10000},
  86. {Name: defaultpodtopologyspread.Name, Weight: 1},
  87. {Name: tainttoleration.Name, Weight: 1},
  88. },
  89. },
  90. Bind: &schedulerapi.PluginSet{
  91. Enabled: []schedulerapi.Plugin{
  92. {Name: defaultbinder.Name},
  93. },
  94. },
  95. }
  96. r := NewRegistry()
  97. gotConfig := r[ClusterAutoscalerProvider]
  98. if diff := cmp.Diff(wantConfig, gotConfig); diff != "" {
  99. t.Errorf("unexpected config diff (-want, +got): %s", diff)
  100. }
  101. }
  102. func TestApplyFeatureGates(t *testing.T) {
  103. tests := []struct {
  104. name string
  105. featuresEnabled bool
  106. wantConfig *schedulerapi.Plugins
  107. }{
  108. {
  109. name: "Feature gates disabled",
  110. featuresEnabled: false,
  111. wantConfig: &schedulerapi.Plugins{
  112. QueueSort: &schedulerapi.PluginSet{
  113. Enabled: []schedulerapi.Plugin{
  114. {Name: queuesort.Name},
  115. },
  116. },
  117. PreFilter: &schedulerapi.PluginSet{
  118. Enabled: []schedulerapi.Plugin{
  119. {Name: noderesources.FitName},
  120. {Name: nodeports.Name},
  121. {Name: interpodaffinity.Name},
  122. },
  123. },
  124. Filter: &schedulerapi.PluginSet{
  125. Enabled: []schedulerapi.Plugin{
  126. {Name: nodeunschedulable.Name},
  127. {Name: noderesources.FitName},
  128. {Name: nodename.Name},
  129. {Name: nodeports.Name},
  130. {Name: nodeaffinity.Name},
  131. {Name: volumerestrictions.Name},
  132. {Name: tainttoleration.Name},
  133. {Name: nodevolumelimits.EBSName},
  134. {Name: nodevolumelimits.GCEPDName},
  135. {Name: nodevolumelimits.CSIName},
  136. {Name: nodevolumelimits.AzureDiskName},
  137. {Name: volumebinding.Name},
  138. {Name: volumezone.Name},
  139. {Name: interpodaffinity.Name},
  140. },
  141. },
  142. PostFilter: &schedulerapi.PluginSet{
  143. Enabled: []schedulerapi.Plugin{
  144. {Name: interpodaffinity.Name},
  145. {Name: defaultpodtopologyspread.Name},
  146. {Name: tainttoleration.Name},
  147. },
  148. },
  149. Score: &schedulerapi.PluginSet{
  150. Enabled: []schedulerapi.Plugin{
  151. {Name: noderesources.BalancedAllocationName, Weight: 1},
  152. {Name: imagelocality.Name, Weight: 1},
  153. {Name: interpodaffinity.Name, Weight: 1},
  154. {Name: noderesources.LeastAllocatedName, Weight: 1},
  155. {Name: nodeaffinity.Name, Weight: 1},
  156. {Name: nodepreferavoidpods.Name, Weight: 10000},
  157. {Name: defaultpodtopologyspread.Name, Weight: 1},
  158. {Name: tainttoleration.Name, Weight: 1},
  159. },
  160. },
  161. Bind: &schedulerapi.PluginSet{
  162. Enabled: []schedulerapi.Plugin{
  163. {Name: defaultbinder.Name},
  164. },
  165. },
  166. },
  167. },
  168. {
  169. name: "Feature gates enabled",
  170. featuresEnabled: true,
  171. wantConfig: &schedulerapi.Plugins{
  172. QueueSort: &schedulerapi.PluginSet{
  173. Enabled: []schedulerapi.Plugin{
  174. {Name: queuesort.Name},
  175. },
  176. },
  177. PreFilter: &schedulerapi.PluginSet{
  178. Enabled: []schedulerapi.Plugin{
  179. {Name: noderesources.FitName},
  180. {Name: nodeports.Name},
  181. {Name: interpodaffinity.Name},
  182. {Name: podtopologyspread.Name},
  183. },
  184. },
  185. Filter: &schedulerapi.PluginSet{
  186. Enabled: []schedulerapi.Plugin{
  187. {Name: nodeunschedulable.Name},
  188. {Name: noderesources.FitName},
  189. {Name: nodename.Name},
  190. {Name: nodeports.Name},
  191. {Name: nodeaffinity.Name},
  192. {Name: volumerestrictions.Name},
  193. {Name: tainttoleration.Name},
  194. {Name: nodevolumelimits.EBSName},
  195. {Name: nodevolumelimits.GCEPDName},
  196. {Name: nodevolumelimits.CSIName},
  197. {Name: nodevolumelimits.AzureDiskName},
  198. {Name: volumebinding.Name},
  199. {Name: volumezone.Name},
  200. {Name: interpodaffinity.Name},
  201. {Name: podtopologyspread.Name},
  202. },
  203. },
  204. PostFilter: &schedulerapi.PluginSet{
  205. Enabled: []schedulerapi.Plugin{
  206. {Name: interpodaffinity.Name},
  207. {Name: defaultpodtopologyspread.Name},
  208. {Name: tainttoleration.Name},
  209. {Name: podtopologyspread.Name},
  210. {Name: noderesources.ResourceLimitsName},
  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. },
  227. Bind: &schedulerapi.PluginSet{
  228. Enabled: []schedulerapi.Plugin{
  229. {Name: defaultbinder.Name},
  230. },
  231. },
  232. },
  233. },
  234. }
  235. for _, test := range tests {
  236. t.Run(test.name, func(t *testing.T) {
  237. defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ResourceLimitsPriorityFunction, test.featuresEnabled)()
  238. defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.EvenPodsSpread, test.featuresEnabled)()
  239. r := NewRegistry()
  240. gotConfig := r[schedulerapi.SchedulerDefaultProviderName]
  241. if diff := cmp.Diff(test.wantConfig, gotConfig); diff != "" {
  242. t.Errorf("unexpected config diff (-want, +got): %s", diff)
  243. }
  244. })
  245. }
  246. }