defaults_test.go 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  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 v2beta2_test
  14. import (
  15. "testing"
  16. autoscalingv2 "k8s.io/api/autoscaling/v2beta2"
  17. . "k8s.io/kubernetes/pkg/apis/autoscaling/v2beta2"
  18. utilpointer "k8s.io/utils/pointer"
  19. "github.com/stretchr/testify/assert"
  20. )
  21. func TestGenerateScaleDownRules(t *testing.T) {
  22. type TestCase struct {
  23. rateDownPods int32
  24. rateDownPodsPeriodSeconds int32
  25. rateDownPercent int32
  26. rateDownPercentPeriodSeconds int32
  27. stabilizationSeconds *int32
  28. selectPolicy *autoscalingv2.ScalingPolicySelect
  29. expectedPolicies []autoscalingv2.HPAScalingPolicy
  30. expectedStabilization *int32
  31. expectedSelectPolicy string
  32. annotation string
  33. }
  34. maxPolicy := autoscalingv2.MaxPolicySelect
  35. minPolicy := autoscalingv2.MinPolicySelect
  36. tests := []TestCase{
  37. {
  38. annotation: "Default values",
  39. expectedPolicies: []autoscalingv2.HPAScalingPolicy{
  40. {Type: autoscalingv2.PercentScalingPolicy, Value: 100, PeriodSeconds: 15},
  41. },
  42. expectedStabilization: nil,
  43. expectedSelectPolicy: string(autoscalingv2.MaxPolicySelect),
  44. },
  45. {
  46. annotation: "All parameters are specified",
  47. rateDownPods: 1,
  48. rateDownPodsPeriodSeconds: 2,
  49. rateDownPercent: 3,
  50. rateDownPercentPeriodSeconds: 4,
  51. stabilizationSeconds: utilpointer.Int32Ptr(25),
  52. selectPolicy: &maxPolicy,
  53. expectedPolicies: []autoscalingv2.HPAScalingPolicy{
  54. {Type: autoscalingv2.PodsScalingPolicy, Value: 1, PeriodSeconds: 2},
  55. {Type: autoscalingv2.PercentScalingPolicy, Value: 3, PeriodSeconds: 4},
  56. },
  57. expectedStabilization: utilpointer.Int32Ptr(25),
  58. expectedSelectPolicy: string(autoscalingv2.MaxPolicySelect),
  59. },
  60. {
  61. annotation: "Percent policy is specified",
  62. rateDownPercent: 1,
  63. rateDownPercentPeriodSeconds: 2,
  64. selectPolicy: &minPolicy,
  65. expectedPolicies: []autoscalingv2.HPAScalingPolicy{
  66. {Type: autoscalingv2.PercentScalingPolicy, Value: 1, PeriodSeconds: 2},
  67. },
  68. expectedStabilization: nil,
  69. expectedSelectPolicy: string(autoscalingv2.MinPolicySelect),
  70. },
  71. {
  72. annotation: "Pods policy is specified",
  73. rateDownPods: 3,
  74. rateDownPodsPeriodSeconds: 4,
  75. expectedPolicies: []autoscalingv2.HPAScalingPolicy{
  76. {Type: autoscalingv2.PodsScalingPolicy, Value: 3, PeriodSeconds: 4},
  77. },
  78. expectedStabilization: nil,
  79. expectedSelectPolicy: string(autoscalingv2.MaxPolicySelect),
  80. },
  81. }
  82. for _, tc := range tests {
  83. t.Run(tc.annotation, func(t *testing.T) {
  84. scaleDownRules := &autoscalingv2.HPAScalingRules{
  85. StabilizationWindowSeconds: tc.stabilizationSeconds,
  86. SelectPolicy: tc.selectPolicy,
  87. }
  88. if tc.rateDownPods != 0 || tc.rateDownPodsPeriodSeconds != 0 {
  89. scaleDownRules.Policies = append(scaleDownRules.Policies, autoscalingv2.HPAScalingPolicy{
  90. Type: autoscalingv2.PodsScalingPolicy, Value: tc.rateDownPods, PeriodSeconds: tc.rateDownPodsPeriodSeconds,
  91. })
  92. }
  93. if tc.rateDownPercent != 0 || tc.rateDownPercentPeriodSeconds != 0 {
  94. scaleDownRules.Policies = append(scaleDownRules.Policies, autoscalingv2.HPAScalingPolicy{
  95. Type: autoscalingv2.PercentScalingPolicy, Value: tc.rateDownPercent, PeriodSeconds: tc.rateDownPercentPeriodSeconds,
  96. })
  97. }
  98. down := GenerateHPAScaleDownRules(scaleDownRules)
  99. assert.EqualValues(t, tc.expectedPolicies, down.Policies)
  100. if tc.expectedStabilization != nil {
  101. assert.Equal(t, *tc.expectedStabilization, *down.StabilizationWindowSeconds)
  102. } else {
  103. assert.Equal(t, tc.expectedStabilization, down.StabilizationWindowSeconds)
  104. }
  105. assert.Equal(t, autoscalingv2.ScalingPolicySelect(tc.expectedSelectPolicy), *down.SelectPolicy)
  106. })
  107. }
  108. }
  109. func TestGenerateScaleUpRules(t *testing.T) {
  110. type TestCase struct {
  111. rateUpPods int32
  112. rateUpPodsPeriodSeconds int32
  113. rateUpPercent int32
  114. rateUpPercentPeriodSeconds int32
  115. stabilizationSeconds *int32
  116. selectPolicy *autoscalingv2.ScalingPolicySelect
  117. expectedPolicies []autoscalingv2.HPAScalingPolicy
  118. expectedStabilization *int32
  119. expectedSelectPolicy string
  120. annotation string
  121. }
  122. maxPolicy := autoscalingv2.MaxPolicySelect
  123. minPolicy := autoscalingv2.MinPolicySelect
  124. tests := []TestCase{
  125. {
  126. annotation: "Default values",
  127. expectedPolicies: []autoscalingv2.HPAScalingPolicy{
  128. {Type: autoscalingv2.PodsScalingPolicy, Value: 4, PeriodSeconds: 15},
  129. {Type: autoscalingv2.PercentScalingPolicy, Value: 100, PeriodSeconds: 15},
  130. },
  131. expectedStabilization: utilpointer.Int32Ptr(0),
  132. expectedSelectPolicy: string(autoscalingv2.MaxPolicySelect),
  133. },
  134. {
  135. annotation: "All parameters are specified",
  136. rateUpPods: 1,
  137. rateUpPodsPeriodSeconds: 2,
  138. rateUpPercent: 3,
  139. rateUpPercentPeriodSeconds: 4,
  140. stabilizationSeconds: utilpointer.Int32Ptr(25),
  141. selectPolicy: &maxPolicy,
  142. expectedPolicies: []autoscalingv2.HPAScalingPolicy{
  143. {Type: autoscalingv2.PodsScalingPolicy, Value: 1, PeriodSeconds: 2},
  144. {Type: autoscalingv2.PercentScalingPolicy, Value: 3, PeriodSeconds: 4},
  145. },
  146. expectedStabilization: utilpointer.Int32Ptr(25),
  147. expectedSelectPolicy: string(autoscalingv2.MaxPolicySelect),
  148. },
  149. {
  150. annotation: "Pod policy is specified",
  151. rateUpPods: 1,
  152. rateUpPodsPeriodSeconds: 2,
  153. selectPolicy: &minPolicy,
  154. expectedPolicies: []autoscalingv2.HPAScalingPolicy{
  155. {Type: autoscalingv2.PodsScalingPolicy, Value: 1, PeriodSeconds: 2},
  156. },
  157. expectedStabilization: utilpointer.Int32Ptr(0),
  158. expectedSelectPolicy: string(autoscalingv2.MinPolicySelect),
  159. },
  160. {
  161. annotation: "Percent policy is specified",
  162. rateUpPercent: 7,
  163. rateUpPercentPeriodSeconds: 10,
  164. expectedPolicies: []autoscalingv2.HPAScalingPolicy{
  165. {Type: autoscalingv2.PercentScalingPolicy, Value: 7, PeriodSeconds: 10},
  166. },
  167. expectedStabilization: utilpointer.Int32Ptr(0),
  168. expectedSelectPolicy: string(autoscalingv2.MaxPolicySelect),
  169. },
  170. {
  171. annotation: "Pod policy and stabilization window are specified",
  172. rateUpPodsPeriodSeconds: 2,
  173. stabilizationSeconds: utilpointer.Int32Ptr(25),
  174. rateUpPods: 4,
  175. expectedPolicies: []autoscalingv2.HPAScalingPolicy{
  176. {Type: autoscalingv2.PodsScalingPolicy, Value: 4, PeriodSeconds: 2},
  177. },
  178. expectedStabilization: utilpointer.Int32Ptr(25),
  179. expectedSelectPolicy: string(autoscalingv2.MaxPolicySelect),
  180. },
  181. {
  182. annotation: "Percent policy and stabilization window are specified",
  183. rateUpPercent: 7,
  184. rateUpPercentPeriodSeconds: 60,
  185. stabilizationSeconds: utilpointer.Int32Ptr(25),
  186. expectedPolicies: []autoscalingv2.HPAScalingPolicy{
  187. {Type: autoscalingv2.PercentScalingPolicy, Value: 7, PeriodSeconds: 60},
  188. },
  189. expectedStabilization: utilpointer.Int32Ptr(25),
  190. expectedSelectPolicy: string(autoscalingv2.MaxPolicySelect),
  191. },
  192. }
  193. for _, tc := range tests {
  194. t.Run(tc.annotation, func(t *testing.T) {
  195. scaleUpRules := &autoscalingv2.HPAScalingRules{
  196. StabilizationWindowSeconds: tc.stabilizationSeconds,
  197. SelectPolicy: tc.selectPolicy,
  198. }
  199. if tc.rateUpPods != 0 || tc.rateUpPodsPeriodSeconds != 0 {
  200. scaleUpRules.Policies = append(scaleUpRules.Policies, autoscalingv2.HPAScalingPolicy{
  201. Type: autoscalingv2.PodsScalingPolicy, Value: tc.rateUpPods, PeriodSeconds: tc.rateUpPodsPeriodSeconds,
  202. })
  203. }
  204. if tc.rateUpPercent != 0 || tc.rateUpPercentPeriodSeconds != 0 {
  205. scaleUpRules.Policies = append(scaleUpRules.Policies, autoscalingv2.HPAScalingPolicy{
  206. Type: autoscalingv2.PercentScalingPolicy, Value: tc.rateUpPercent, PeriodSeconds: tc.rateUpPercentPeriodSeconds,
  207. })
  208. }
  209. up := GenerateHPAScaleUpRules(scaleUpRules)
  210. assert.Equal(t, tc.expectedPolicies, up.Policies)
  211. if tc.expectedStabilization != nil {
  212. assert.Equal(t, *tc.expectedStabilization, *up.StabilizationWindowSeconds)
  213. } else {
  214. assert.Equal(t, tc.expectedStabilization, up.StabilizationWindowSeconds)
  215. }
  216. assert.Equal(t, autoscalingv2.ScalingPolicySelect(tc.expectedSelectPolicy), *up.SelectPolicy)
  217. })
  218. }
  219. }