Skip to content

Commit 7def39e

Browse files
authored
[Feature] Allow to pass EphemeralStorage Resource to the Pods (#1401)
1 parent fc7bc29 commit 7def39e

File tree

3 files changed

+85
-11
lines changed

3 files changed

+85
-11
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
- (Feature) Reconciliation Loop Interval option
1515
- (Bugfix) Fix GZIP encoding in case of small responses
1616
- (Bugfix) Fix PVC Rotation Discovery
17+
- (Feature) Allow to pass EphemeralStorage Resource to the Pods
1718

1819
## [1.2.32](https://github.com/arangodb/kube-arangodb/tree/1.2.32) (2023-08-07)
1920
- (Feature) Backup lifetime - remove Backup once its lifetime has been reached

pkg/util/k8sutil/pods.go

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -534,21 +534,33 @@ func operatorInitContainer(name, operatorImage string, command []string, securit
534534

535535
// ExtractPodResourceRequirement filters resource requirements for Pods.
536536
func ExtractPodResourceRequirement(resources core.ResourceRequirements) core.ResourceRequirements {
537+
filter := PodResourceRequirementsFilter(core.ResourceCPU, core.ResourceMemory, core.ResourceEphemeralStorage)
537538

538-
filterStorage := func(list core.ResourceList) core.ResourceList {
539-
newlist := make(core.ResourceList)
540-
if q, ok := list[core.ResourceCPU]; ok {
541-
newlist[core.ResourceCPU] = q
539+
return core.ResourceRequirements{
540+
Limits: filter(resources.Limits),
541+
Requests: filter(resources.Requests),
542+
}
543+
}
544+
545+
func PodResourceRequirementsFilter(filters ...core.ResourceName) func(in core.ResourceList) core.ResourceList {
546+
return func(in core.ResourceList) core.ResourceList {
547+
filtered := map[core.ResourceName]bool{}
548+
549+
for _, k := range filters {
550+
filtered[k] = true
542551
}
543-
if q, ok := list[core.ResourceMemory]; ok {
544-
newlist[core.ResourceMemory] = q
552+
553+
n := core.ResourceList{}
554+
555+
for k, v := range in {
556+
if _, ok := filtered[k]; !ok {
557+
continue
558+
}
559+
560+
n[k] = v
545561
}
546-
return newlist
547-
}
548562

549-
return core.ResourceRequirements{
550-
Limits: filterStorage(resources.Limits),
551-
Requests: filterStorage(resources.Requests),
563+
return n
552564
}
553565
}
554566

pkg/util/k8sutil/pods_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,17 @@ package k8sutil
2222

2323
import (
2424
"context"
25+
"fmt"
2526
"testing"
2627

2728
"github.com/stretchr/testify/assert"
2829
"github.com/stretchr/testify/require"
2930
core "k8s.io/api/core/v1"
31+
resource "k8s.io/apimachinery/pkg/api/resource"
3032
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
3133

3234
"github.com/arangodb/kube-arangodb/pkg/handlers/utils"
35+
"github.com/arangodb/kube-arangodb/pkg/util"
3336
"github.com/arangodb/kube-arangodb/pkg/util/constants"
3437
"github.com/arangodb/kube-arangodb/pkg/util/kclient"
3538
)
@@ -416,3 +419,61 @@ func Test_EnsureFinalizer(t *testing.T) {
416419
require.NotContains(t, pod.Finalizers, f)
417420
})
418421
}
422+
423+
func Test_ExtractPodResourceRequirement(t *testing.T) {
424+
v, err := resource.ParseQuantity("1Gi")
425+
require.NoError(t, err)
426+
427+
t.Run("Filter Storage", func(t *testing.T) {
428+
in := core.ResourceRequirements{
429+
Limits: map[core.ResourceName]resource.Quantity{
430+
core.ResourceCPU: v,
431+
core.ResourceStorage: v,
432+
},
433+
}
434+
require.Len(t, in.Limits, 2)
435+
require.Len(t, in.Requests, 0)
436+
437+
out := ExtractPodResourceRequirement(in)
438+
require.Len(t, out.Limits, 1)
439+
require.Contains(t, out.Limits, core.ResourceCPU)
440+
require.NotContains(t, out.Limits, core.ResourceStorage)
441+
require.Len(t, out.Requests, 0)
442+
})
443+
444+
t.Run("Ensure that all required Resources are filtered", func(t *testing.T) {
445+
resources := map[core.ResourceName]bool{
446+
core.ResourceCPU: true,
447+
core.ResourceMemory: true,
448+
core.ResourceStorage: false,
449+
core.ResourceEphemeralStorage: true,
450+
}
451+
452+
in := core.ResourceRequirements{
453+
Limits: core.ResourceList{},
454+
Requests: core.ResourceList{},
455+
}
456+
457+
for k := range resources {
458+
in.Limits[k] = v
459+
in.Requests[k] = v
460+
}
461+
462+
out := ExtractPodResourceRequirement(in)
463+
464+
for k, v := range resources {
465+
t.Run(fmt.Sprintf("Resource %s should be %s", k, util.BoolSwitch(v, "present", "missing")), func(t *testing.T) {
466+
require.Contains(t, in.Requests, k)
467+
require.Contains(t, in.Limits, k)
468+
469+
if v {
470+
require.Contains(t, out.Requests, k)
471+
require.Contains(t, out.Limits, k)
472+
} else {
473+
require.NotContains(t, out.Requests, k)
474+
require.NotContains(t, out.Limits, k)
475+
}
476+
})
477+
}
478+
})
479+
}

0 commit comments

Comments
 (0)