registry_test.go 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  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. {Name: podtopologyspread.Name},
  52. },
  53. },
  54. Filter: &schedulerapi.PluginSet{
  55. Enabled: []schedulerapi.Plugin{
  56. {Name: nodeunschedulable.Name},
  57. {Name: noderesources.FitName},
  58. {Name: nodename.Name},
  59. {Name: nodeports.Name},
  60. {Name: nodeaffinity.Name},
  61. {Name: volumerestrictions.Name},
  62. {Name: tainttoleration.Name},
  63. {Name: nodevolumelimits.EBSName},
  64. {Name: nodevolumelimits.GCEPDName},
  65. {Name: nodevolumelimits.CSIName},
  66. {Name: nodevolumelimits.AzureDiskName},
  67. {Name: volumebinding.Name},
  68. {Name: volumezone.Name},
  69. {Name: interpodaffinity.Name},
  70. {Name: podtopologyspread.Name},
  71. },
  72. },
  73. PreScore: &schedulerapi.PluginSet{
  74. Enabled: []schedulerapi.Plugin{
  75. {Name: interpodaffinity.Name},
  76. {Name: defaultpodtopologyspread.Name},
  77. {Name: tainttoleration.Name},
  78. {Name: podtopologyspread.Name},
  79. },
  80. },
  81. Score: &schedulerapi.PluginSet{
  82. Enabled: []schedulerapi.Plugin{
  83. {Name: noderesources.BalancedAllocationName, Weight: 1},
  84. {Name: imagelocality.Name, Weight: 1},
  85. {Name: interpodaffinity.Name, Weight: 1},
  86. {Name: noderesources.MostAllocatedName, Weight: 1},
  87. {Name: nodeaffinity.Name, Weight: 1},
  88. {Name: nodepreferavoidpods.Name, Weight: 10000},
  89. {Name: defaultpodtopologyspread.Name, Weight: 1},
  90. {Name: tainttoleration.Name, Weight: 1},
  91. {Name: podtopologyspread.Name, Weight: 1},
  92. },
  93. },
  94. Bind: &schedulerapi.PluginSet{
  95. Enabled: []schedulerapi.Plugin{
  96. {Name: defaultbinder.Name},
  97. },
  98. },
  99. }
  100. r := NewRegistry()
  101. gotConfig := r[ClusterAutoscalerProvider]
  102. if diff := cmp.Diff(wantConfig, gotConfig); diff != "" {
  103. t.Errorf("unexpected config diff (-want, +got): %s", diff)
  104. }
  105. }
  106. func TestApplyFeatureGates(t *testing.T) {
  107. tests := []struct {
  108. name string
  109. featuresEnabled bool
  110. wantConfig *schedulerapi.Plugins
  111. }{
  112. {
  113. name: "Feature gates disabled",
  114. featuresEnabled: false,
  115. wantConfig: &schedulerapi.Plugins{
  116. QueueSort: &schedulerapi.PluginSet{
  117. Enabled: []schedulerapi.Plugin{
  118. {Name: queuesort.Name},
  119. },
  120. },
  121. PreFilter: &schedulerapi.PluginSet{
  122. Enabled: []schedulerapi.Plugin{
  123. {Name: noderesources.FitName},
  124. {Name: nodeports.Name},
  125. {Name: interpodaffinity.Name},
  126. },
  127. },
  128. Filter: &schedulerapi.PluginSet{
  129. Enabled: []schedulerapi.Plugin{
  130. {Name: nodeunschedulable.Name},
  131. {Name: noderesources.FitName},
  132. {Name: nodename.Name},
  133. {Name: nodeports.Name},
  134. {Name: nodeaffinity.Name},
  135. {Name: volumerestrictions.Name},
  136. {Name: tainttoleration.Name},
  137. {Name: nodevolumelimits.EBSName},
  138. {Name: nodevolumelimits.GCEPDName},
  139. {Name: nodevolumelimits.CSIName},
  140. {Name: nodevolumelimits.AzureDiskName},
  141. {Name: volumebinding.Name},
  142. {Name: volumezone.Name},
  143. {Name: interpodaffinity.Name},
  144. },
  145. },
  146. PreScore: &schedulerapi.PluginSet{
  147. Enabled: []schedulerapi.Plugin{
  148. {Name: interpodaffinity.Name},
  149. {Name: defaultpodtopologyspread.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. },
  165. Bind: &schedulerapi.PluginSet{
  166. Enabled: []schedulerapi.Plugin{
  167. {Name: defaultbinder.Name},
  168. },
  169. },
  170. },
  171. },
  172. {
  173. name: "Feature gates enabled",
  174. featuresEnabled: true,
  175. wantConfig: &schedulerapi.Plugins{
  176. QueueSort: &schedulerapi.PluginSet{
  177. Enabled: []schedulerapi.Plugin{
  178. {Name: queuesort.Name},
  179. },
  180. },
  181. PreFilter: &schedulerapi.PluginSet{
  182. Enabled: []schedulerapi.Plugin{
  183. {Name: noderesources.FitName},
  184. {Name: nodeports.Name},
  185. {Name: interpodaffinity.Name},
  186. {Name: podtopologyspread.Name},
  187. },
  188. },
  189. Filter: &schedulerapi.PluginSet{
  190. Enabled: []schedulerapi.Plugin{
  191. {Name: nodeunschedulable.Name},
  192. {Name: noderesources.FitName},
  193. {Name: nodename.Name},
  194. {Name: nodeports.Name},
  195. {Name: nodeaffinity.Name},
  196. {Name: volumerestrictions.Name},
  197. {Name: tainttoleration.Name},
  198. {Name: nodevolumelimits.EBSName},
  199. {Name: nodevolumelimits.GCEPDName},
  200. {Name: nodevolumelimits.CSIName},
  201. {Name: nodevolumelimits.AzureDiskName},
  202. {Name: volumebinding.Name},
  203. {Name: volumezone.Name},
  204. {Name: interpodaffinity.Name},
  205. {Name: podtopologyspread.Name},
  206. },
  207. },
  208. PreScore: &schedulerapi.PluginSet{
  209. Enabled: []schedulerapi.Plugin{
  210. {Name: interpodaffinity.Name},
  211. {Name: defaultpodtopologyspread.Name},
  212. {Name: tainttoleration.Name},
  213. {Name: podtopologyspread.Name},
  214. {Name: noderesources.ResourceLimitsName},
  215. },
  216. },
  217. Score: &schedulerapi.PluginSet{
  218. Enabled: []schedulerapi.Plugin{
  219. {Name: noderesources.BalancedAllocationName, Weight: 1},
  220. {Name: imagelocality.Name, Weight: 1},
  221. {Name: interpodaffinity.Name, Weight: 1},
  222. {Name: noderesources.LeastAllocatedName, Weight: 1},
  223. {Name: nodeaffinity.Name, Weight: 1},
  224. {Name: nodepreferavoidpods.Name, Weight: 10000},
  225. {Name: defaultpodtopologyspread.Name, Weight: 1},
  226. {Name: tainttoleration.Name, Weight: 1},
  227. {Name: podtopologyspread.Name, Weight: 1},
  228. {Name: noderesources.ResourceLimitsName, Weight: 1},
  229. },
  230. },
  231. Bind: &schedulerapi.PluginSet{
  232. Enabled: []schedulerapi.Plugin{
  233. {Name: defaultbinder.Name},
  234. },
  235. },
  236. },
  237. },
  238. }
  239. for _, test := range tests {
  240. t.Run(test.name, func(t *testing.T) {
  241. defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ResourceLimitsPriorityFunction, test.featuresEnabled)()
  242. defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.EvenPodsSpread, test.featuresEnabled)()
  243. r := NewRegistry()
  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. })
  249. }
  250. }