1
16
17 package qos
18
19 import (
20 "strconv"
21 "testing"
22
23 v1 "k8s.io/api/core/v1"
24 "k8s.io/apimachinery/pkg/api/resource"
25 "k8s.io/kubernetes/pkg/apis/scheduling"
26 )
27
28 const (
29 standardMemoryAmount = 8000000000
30 )
31
32 var (
33 cpuLimit = v1.Pod{
34 Spec: v1.PodSpec{
35 Containers: []v1.Container{
36 {
37 Resources: v1.ResourceRequirements{
38 Limits: v1.ResourceList{
39 v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"),
40 },
41 },
42 },
43 },
44 },
45 }
46
47 memoryLimitCPURequest = v1.Pod{
48 Spec: v1.PodSpec{
49 Containers: []v1.Container{
50 {
51 Resources: v1.ResourceRequirements{
52 Requests: v1.ResourceList{
53 v1.ResourceName(v1.ResourceCPU): resource.MustParse("0"),
54 },
55 Limits: v1.ResourceList{
56 v1.ResourceName(v1.ResourceMemory): resource.MustParse("10G"),
57 },
58 },
59 },
60 },
61 },
62 }
63
64 zeroMemoryLimit = v1.Pod{
65 Spec: v1.PodSpec{
66 Containers: []v1.Container{
67 {
68 Resources: v1.ResourceRequirements{
69 Limits: v1.ResourceList{
70 v1.ResourceName(v1.ResourceMemory): resource.MustParse("0"),
71 },
72 },
73 },
74 },
75 },
76 }
77
78 noRequestLimit = v1.Pod{
79 Spec: v1.PodSpec{
80 Containers: []v1.Container{
81 {
82 Resources: v1.ResourceRequirements{},
83 },
84 },
85 },
86 }
87
88 equalRequestLimitCPUMemory = v1.Pod{
89 Spec: v1.PodSpec{
90 Containers: []v1.Container{
91 {
92 Resources: v1.ResourceRequirements{
93 Requests: v1.ResourceList{
94 v1.ResourceName(v1.ResourceMemory): resource.MustParse("10G"),
95 v1.ResourceName(v1.ResourceCPU): resource.MustParse("5m"),
96 },
97 Limits: v1.ResourceList{
98 v1.ResourceName(v1.ResourceCPU): resource.MustParse("5m"),
99 v1.ResourceName(v1.ResourceMemory): resource.MustParse("10G"),
100 },
101 },
102 },
103 },
104 },
105 }
106
107 cpuUnlimitedMemoryLimitedWithRequests = v1.Pod{
108 Spec: v1.PodSpec{
109 Containers: []v1.Container{
110 {
111 Resources: v1.ResourceRequirements{
112 Requests: v1.ResourceList{
113 v1.ResourceName(v1.ResourceMemory): resource.MustParse(strconv.FormatInt(standardMemoryAmount/2, 10)),
114 v1.ResourceName(v1.ResourceCPU): resource.MustParse("5m"),
115 },
116 Limits: v1.ResourceList{
117 v1.ResourceName(v1.ResourceMemory): resource.MustParse("10G"),
118 },
119 },
120 },
121 },
122 },
123 }
124
125 requestNoLimit = v1.Pod{
126 Spec: v1.PodSpec{
127 Containers: []v1.Container{
128 {
129 Resources: v1.ResourceRequirements{
130 Requests: v1.ResourceList{
131 v1.ResourceName(v1.ResourceMemory): resource.MustParse(strconv.FormatInt(standardMemoryAmount-1, 10)),
132 v1.ResourceName(v1.ResourceCPU): resource.MustParse("5m"),
133 },
134 },
135 },
136 },
137 },
138 }
139
140 systemCritical = scheduling.SystemCriticalPriority
141
142 clusterCritical = v1.Pod{
143 Spec: v1.PodSpec{
144 PriorityClassName: scheduling.SystemClusterCritical,
145 Priority: &systemCritical,
146 Containers: []v1.Container{
147 {
148 Resources: v1.ResourceRequirements{},
149 },
150 },
151 },
152 }
153
154 systemNodeCritical = scheduling.SystemCriticalPriority + 1000
155
156 nodeCritical = v1.Pod{
157 Spec: v1.PodSpec{
158 PriorityClassName: scheduling.SystemNodeCritical,
159 Priority: &systemNodeCritical,
160 Containers: []v1.Container{
161 {
162 Resources: v1.ResourceRequirements{},
163 },
164 },
165 },
166 }
167 )
168
169 type oomTest struct {
170 pod *v1.Pod
171 memoryCapacity int64
172 lowOOMScoreAdj int
173 highOOMScoreAdj int
174 }
175
176 func TestGetContainerOOMScoreAdjust(t *testing.T) {
177 oomTests := []oomTest{
178 {
179 pod: &cpuLimit,
180 memoryCapacity: 4000000000,
181 lowOOMScoreAdj: 999,
182 highOOMScoreAdj: 999,
183 },
184 {
185 pod: &memoryLimitCPURequest,
186 memoryCapacity: 8000000000,
187 lowOOMScoreAdj: 999,
188 highOOMScoreAdj: 999,
189 },
190 {
191 pod: &zeroMemoryLimit,
192 memoryCapacity: 7230457451,
193 lowOOMScoreAdj: 1000,
194 highOOMScoreAdj: 1000,
195 },
196 {
197 pod: &noRequestLimit,
198 memoryCapacity: 4000000000,
199 lowOOMScoreAdj: 1000,
200 highOOMScoreAdj: 1000,
201 },
202 {
203 pod: &equalRequestLimitCPUMemory,
204 memoryCapacity: 123456789,
205 lowOOMScoreAdj: -997,
206 highOOMScoreAdj: -997,
207 },
208 {
209 pod: &cpuUnlimitedMemoryLimitedWithRequests,
210 memoryCapacity: standardMemoryAmount,
211 lowOOMScoreAdj: 495,
212 highOOMScoreAdj: 505,
213 },
214 {
215 pod: &requestNoLimit,
216 memoryCapacity: standardMemoryAmount,
217 lowOOMScoreAdj: 3,
218 highOOMScoreAdj: 3,
219 },
220 {
221 pod: &clusterCritical,
222 memoryCapacity: 4000000000,
223 lowOOMScoreAdj: 1000,
224 highOOMScoreAdj: 1000,
225 },
226 {
227 pod: &nodeCritical,
228 memoryCapacity: 4000000000,
229 lowOOMScoreAdj: -997,
230 highOOMScoreAdj: -997,
231 },
232 }
233 for _, test := range oomTests {
234 oomScoreAdj := GetContainerOOMScoreAdjust(test.pod, &test.pod.Spec.Containers[0], test.memoryCapacity)
235 if oomScoreAdj < test.lowOOMScoreAdj || oomScoreAdj > test.highOOMScoreAdj {
236 t.Errorf("oom_score_adj should be between %d and %d, but was %d", test.lowOOMScoreAdj, test.highOOMScoreAdj, oomScoreAdj)
237 }
238 }
239 }
240
View as plain text