@@ -27,6 +27,7 @@ import (
2727
2828 corev1 "k8s.io/api/core/v1"
2929 rbacv1 "k8s.io/api/rbac/v1"
30+ "k8s.io/apimachinery/pkg/api/resource"
3031 "k8s.io/apimachinery/pkg/types"
3132 "sigs.k8s.io/controller-runtime/pkg/client"
3233
@@ -195,4 +196,112 @@ var _ = Describe("builder", func() {
195196 Expect (rb .Name ).Should (Equal (expectName ))
196197 })
197198 })
199+
200+ Context ("cluster default resources" , func () {
201+ AfterEach (func () {
202+ viper .Set (constant .CfgKeyClusterDefaultResources , "" )
203+ })
204+
205+ newInstanceSet := func () * workloads.InstanceSet {
206+ return & workloads.InstanceSet {
207+ Spec : workloads.InstanceSetSpec {
208+ Template : corev1.PodTemplateSpec {
209+ Spec : corev1.PodSpec {
210+ Containers : []corev1.Container {
211+ {Name : "main" },
212+ {Name : "sidecar" },
213+ },
214+ InitContainers : []corev1.Container {
215+ {Name : "init" },
216+ },
217+ },
218+ },
219+ },
220+ }
221+ }
222+
223+ It ("does not inject zero resources into init and sidecar containers when not configured" , func () {
224+ its := newInstanceSet ()
225+
226+ Expect (setDefaultResourceLimits (its )).Should (Succeed ())
227+
228+ Expect (its .Spec .Template .Spec .Containers [0 ].Resources .Limits ).Should (HaveKeyWithValue (corev1 .ResourceCPU , resource .MustParse ("0" )))
229+ Expect (its .Spec .Template .Spec .Containers [1 ].Resources .Requests ).Should (BeNil ())
230+ Expect (its .Spec .Template .Spec .Containers [1 ].Resources .Limits ).Should (BeNil ())
231+ Expect (its .Spec .Template .Spec .InitContainers [0 ].Resources .Requests ).Should (BeNil ())
232+ Expect (its .Spec .Template .Spec .InitContainers [0 ].Resources .Limits ).Should (BeNil ())
233+ })
234+
235+ It ("keeps zero resource limit behavior when zero is true" , func () {
236+ viper .Set (constant .CfgKeyClusterDefaultResources , `{"zero":true,"requests":{},"limits":{}}` )
237+ its := newInstanceSet ()
238+
239+ Expect (setDefaultResourceLimits (its )).Should (Succeed ())
240+
241+ Expect (its .Spec .Template .Spec .Containers [0 ].Resources .Limits ).Should (HaveKeyWithValue (corev1 .ResourceCPU , resource .MustParse ("0" )))
242+ Expect (its .Spec .Template .Spec .Containers [1 ].Resources .Limits ).Should (HaveKeyWithValue (corev1 .ResourceCPU , resource .MustParse ("0" )))
243+ Expect (its .Spec .Template .Spec .InitContainers [0 ].Resources .Limits ).Should (HaveKeyWithValue (corev1 .ResourceCPU , resource .MustParse ("0" )))
244+ })
245+
246+ It ("applies configured resources to init and sidecar containers" , func () {
247+ viper .Set (constant .CfgKeyClusterDefaultResources , `{"zero":true,"requests":{"cpu":"10m","memory":"16Mi"},"limits":{"cpu":"100m","memory":"64Mi"}}` )
248+ its := newInstanceSet ()
249+
250+ Expect (setDefaultResourceLimits (its )).Should (Succeed ())
251+
252+ main := its .Spec .Template .Spec .Containers [0 ]
253+ sidecar := its .Spec .Template .Spec .Containers [1 ]
254+ initContainer := its .Spec .Template .Spec .InitContainers [0 ]
255+ Expect (main .Resources .Requests ).Should (BeNil ())
256+ Expect (main .Resources .Limits ).Should (HaveKeyWithValue (corev1 .ResourceCPU , resource .MustParse ("0" )))
257+ Expect (sidecar .Resources .Requests ).Should (HaveKeyWithValue (corev1 .ResourceCPU , resource .MustParse ("10m" )))
258+ Expect (sidecar .Resources .Requests ).Should (HaveKeyWithValue (corev1 .ResourceMemory , resource .MustParse ("16Mi" )))
259+ Expect (sidecar .Resources .Limits ).Should (HaveKeyWithValue (corev1 .ResourceCPU , resource .MustParse ("100m" )))
260+ Expect (sidecar .Resources .Limits ).Should (HaveKeyWithValue (corev1 .ResourceMemory , resource .MustParse ("64Mi" )))
261+ Expect (initContainer .Resources .Requests ).Should (HaveKeyWithValue (corev1 .ResourceCPU , resource .MustParse ("10m" )))
262+ Expect (initContainer .Resources .Requests ).Should (HaveKeyWithValue (corev1 .ResourceMemory , resource .MustParse ("16Mi" )))
263+ Expect (initContainer .Resources .Limits ).Should (HaveKeyWithValue (corev1 .ResourceCPU , resource .MustParse ("100m" )))
264+ Expect (initContainer .Resources .Limits ).Should (HaveKeyWithValue (corev1 .ResourceMemory , resource .MustParse ("64Mi" )))
265+ })
266+
267+ It ("lets configured resource names override zero by resource name" , func () {
268+ viper .Set (constant .CfgKeyClusterDefaultResources , `{"zero":true,"requests":{"cpu":"10m"},"limits":{}}` )
269+ its := newInstanceSet ()
270+
271+ Expect (setDefaultResourceLimits (its )).Should (Succeed ())
272+
273+ sidecar := its .Spec .Template .Spec .Containers [1 ]
274+ initContainer := its .Spec .Template .Spec .InitContainers [0 ]
275+ Expect (sidecar .Resources .Requests ).Should (HaveKeyWithValue (corev1 .ResourceCPU , resource .MustParse ("10m" )))
276+ Expect (sidecar .Resources .Limits ).Should (HaveKeyWithValue (corev1 .ResourceCPU , resource .MustParse ("10m" )))
277+ Expect (sidecar .Resources .Requests ).ShouldNot (HaveKey (corev1 .ResourceMemory ))
278+ Expect (sidecar .Resources .Limits ).Should (HaveKeyWithValue (corev1 .ResourceMemory , resource .MustParse ("0" )))
279+ Expect (initContainer .Resources .Requests ).Should (HaveKeyWithValue (corev1 .ResourceCPU , resource .MustParse ("10m" )))
280+ Expect (initContainer .Resources .Limits ).Should (HaveKeyWithValue (corev1 .ResourceCPU , resource .MustParse ("10m" )))
281+ Expect (initContainer .Resources .Limits ).Should (HaveKeyWithValue (corev1 .ResourceMemory , resource .MustParse ("0" )))
282+ })
283+
284+ It ("does not override sidecar resource values already set by definitions" , func () {
285+ viper .Set (constant .CfgKeyClusterDefaultResources , `{"zero":true,"requests":{"cpu":"10m","memory":"16Mi"},"limits":{"cpu":"100m","memory":"64Mi"}}` )
286+ its := newInstanceSet ()
287+ its .Spec .Template .Spec .Containers [1 ].Resources .Requests = corev1.ResourceList {
288+ corev1 .ResourceCPU : resource .MustParse ("250m" ),
289+ }
290+
291+ Expect (setDefaultResourceLimits (its )).Should (Succeed ())
292+
293+ sidecar := its .Spec .Template .Spec .Containers [1 ]
294+ Expect (sidecar .Resources .Requests ).Should (HaveKeyWithValue (corev1 .ResourceCPU , resource .MustParse ("250m" )))
295+ Expect (sidecar .Resources .Requests ).Should (HaveKeyWithValue (corev1 .ResourceMemory , resource .MustParse ("16Mi" )))
296+ Expect (sidecar .Resources .Limits ).Should (HaveKeyWithValue (corev1 .ResourceCPU , resource .MustParse ("250m" )))
297+ Expect (sidecar .Resources .Limits ).Should (HaveKeyWithValue (corev1 .ResourceMemory , resource .MustParse ("64Mi" )))
298+ })
299+
300+ It ("returns an error when cluster default resources are invalid" , func () {
301+ viper .Set (constant .CfgKeyClusterDefaultResources , `{"zero":` )
302+ its := newInstanceSet ()
303+
304+ Expect (setDefaultResourceLimits (its )).ShouldNot (Succeed ())
305+ })
306+ })
198307})
0 commit comments