Skip to content

Commit b085209

Browse files
authored
[Bugfix] Fix Resources Copy mechanism to prevent invalid pod creation (#1601)
1 parent 4049362 commit b085209

File tree

3 files changed

+57
-6
lines changed

3 files changed

+57
-6
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## [master](https://github.com/arangodb/kube-arangodb/tree/master) (N/A)
44
- (Feature) Extract Scheduler API
55
- (Bugfix) Fix Image Discovery
6+
- (Bugfix) Fix Resources Copy mechanism to prevent invalid pod creation
67

78
## [1.2.38](https://github.com/arangodb/kube-arangodb/tree/1.2.38) (2024-02-22)
89
- (Feature) Extract GRPC Server

pkg/util/k8sutil/resources/resources.go

+20-6
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,30 @@ func UpscaleContainerResourceRequirements(container *core.Container, resources c
6969

7070
container.Resources.Limits = UpscaleContainerResourceList(container.Resources.Limits, resources.Limits)
7171
container.Resources.Requests = UpscaleContainerResourceList(container.Resources.Requests, resources.Requests)
72+
73+
// Ensure that Limits are always higher or equals requests
74+
container.Resources.Limits = UpscaleOptionalContainerResourceList(container.Resources.Limits, container.Resources.Requests)
7275
}
7376

74-
// UpscaleContainerResource scales up resources from `from` to `to` ResourceList
75-
func UpscaleContainerResource(to core.ResourceRequirements, from core.ResourceRequirements) core.ResourceRequirements {
76-
var r core.ResourceRequirements
77+
// UpscaleOptionalContainerResourceList scales up resources from `from` to `to` ResourceList if they exists in `to`
78+
func UpscaleOptionalContainerResourceList(to core.ResourceList, from core.ResourceList) core.ResourceList {
79+
if len(from) == 0 {
80+
return to
81+
}
7782

78-
r.Limits = UpscaleContainerResourceList(to.Limits, from.Limits)
79-
r.Requests = UpscaleContainerResourceList(to.Requests, from.Requests)
83+
if to == nil {
84+
to = core.ResourceList{}
85+
}
8086

81-
return r
87+
for k, v := range from {
88+
if n, ok := to[k]; ok {
89+
if n.Cmp(v) < 0 {
90+
to[k] = v
91+
}
92+
}
93+
}
94+
95+
return to
8296
}
8397

8498
// UpscaleContainerResourceList scales up resources from `from` to `to` ResourceList

pkg/util/k8sutil/resources/resources_test.go

+36
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,9 @@ func Test_ApplyContainerResourceRequirements(t *testing.T) {
163163
}
164164

165165
func Test_UpsertContainerResourceRequirements(t *testing.T) {
166+
v0, err := resource.ParseQuantity("512Mi")
167+
require.NoError(t, err)
168+
166169
v1, err := resource.ParseQuantity("1Gi")
167170
require.NoError(t, err)
168171

@@ -174,6 +177,39 @@ func Test_UpsertContainerResourceRequirements(t *testing.T) {
174177

175178
var container core.Container
176179

180+
t.Run("Ensure limits are applied optionally", func(t *testing.T) {
181+
UpscaleContainerResourceRequirements(&container, core.ResourceRequirements{
182+
Requests: core.ResourceList{
183+
core.ResourceMemory: v1,
184+
},
185+
})
186+
187+
require.Len(t, container.Resources.Requests, 1)
188+
require.Contains(t, container.Resources.Requests, core.ResourceMemory)
189+
require.Equal(t, v1, container.Resources.Requests[core.ResourceMemory])
190+
191+
require.Len(t, container.Resources.Limits, 0)
192+
})
193+
194+
t.Run("Ensure limits are upscaled optionally", func(t *testing.T) {
195+
UpscaleContainerResourceRequirements(&container, core.ResourceRequirements{
196+
Limits: core.ResourceList{
197+
core.ResourceMemory: v0,
198+
},
199+
Requests: core.ResourceList{
200+
core.ResourceMemory: v1,
201+
},
202+
})
203+
204+
require.Len(t, container.Resources.Requests, 1)
205+
require.Contains(t, container.Resources.Requests, core.ResourceMemory)
206+
require.Equal(t, v1, container.Resources.Requests[core.ResourceMemory])
207+
208+
require.Len(t, container.Resources.Limits, 1)
209+
require.Contains(t, container.Resources.Limits, core.ResourceMemory)
210+
require.Equal(t, v1, container.Resources.Limits[core.ResourceMemory])
211+
})
212+
177213
t.Run("Ensure limits are copied", func(t *testing.T) {
178214
UpscaleContainerResourceRequirements(&container, core.ResourceRequirements{
179215
Limits: core.ResourceList{

0 commit comments

Comments
 (0)