Skip to content

Commit 2608863

Browse files
authored
[Feature] Add memory limits env (#532)
1 parent aafeff7 commit 2608863

File tree

9 files changed

+149
-48
lines changed

9 files changed

+149
-48
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.13
44

55
replace (
66
github.com/coreos/prometheus-operator => github.com/coreos/prometheus-operator v0.37.0
7+
github.com/stretchr/testify => github.com/stretchr/testify v1.5.1
78
github.com/ugorji/go => github.com/ugorji/go v0.0.0-20181209151446-772ced7fd4c2
89

910
k8s.io/api => k8s.io/api v0.15.9

go.sum

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -578,12 +578,8 @@ github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
578578
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
579579
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
580580
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
581-
github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
582-
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
583-
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
584-
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
585-
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
586-
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
581+
github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
582+
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
587583
github.com/thanos-io/thanos v0.10.1/go.mod h1:usT/TxtJQ7DzinTt+G9kinDQmRS5sxwu0unVKZ9vdcw=
588584
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
589585
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=

pkg/apis/deployment/v1/server_group_spec.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ type ServerGroupSpec struct {
5050
StorageClassName *string `json:"storageClassName,omitempty"`
5151
// Resources holds resource requests & limits
5252
Resources v1.ResourceRequirements `json:"resources,omitempty"`
53+
// OverrideDetectedTotalMemory determines if memory should be overrided based on values in resources.
54+
OverrideDetectedTotalMemory *bool `json:"overrideDetectedTotalMemory,omitempty"`
5355
// Tolerations specifies the tolerations added to Pods in this group.
5456
Tolerations []v1.Toleration `json:"tolerations,omitempty"`
5557
// Annotations specified the annotations added to Pods in this group.

pkg/apis/deployment/v1/zz_generated.deepcopy.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/deployment/deployment_test.go

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,14 +163,12 @@ func TestEnsurePods(t *testing.T) {
163163

164164
resourcesUnfiltered := v1.ResourceRequirements{
165165
Limits: v1.ResourceList{
166-
v1.ResourceCPU: resource.MustParse("500m"),
167-
v1.ResourceMemory: resource.MustParse("2Gi"),
168-
v1.ResourceStorage: resource.MustParse("8Gi"),
166+
v1.ResourceCPU: resource.MustParse("500m"),
167+
v1.ResourceMemory: resource.MustParse("2Gi"),
169168
},
170169
Requests: v1.ResourceList{
171-
v1.ResourceCPU: resource.MustParse("100m"),
172-
v1.ResourceMemory: resource.MustParse("1Gi"),
173-
v1.ResourceStorage: resource.MustParse("2Gi"),
170+
v1.ResourceCPU: resource.MustParse("100m"),
171+
v1.ResourceMemory: resource.MustParse("1Gi"),
174172
},
175173
}
176174

@@ -219,6 +217,7 @@ func TestEnsurePods(t *testing.T) {
219217
VolumeMounts: []v1.VolumeMount{
220218
k8sutil.ArangodVolumeMount(),
221219
},
220+
Resources: emptyResources,
222221
LivenessProbe: createTestLivenessProbe(false, "", k8sutil.ArangoPort),
223222
ImagePullPolicy: v1.PullAlways,
224223
SecurityContext: securityContext.NewSecurityContext(),
@@ -278,6 +277,7 @@ func TestEnsurePods(t *testing.T) {
278277
VolumeMounts: []v1.VolumeMount{
279278
k8sutil.ArangodVolumeMount(),
280279
},
280+
Resources: emptyResources,
281281
LivenessProbe: createTestLivenessProbe(false, "", k8sutil.ArangoPort),
282282
ImagePullPolicy: v1.PullIfNotPresent,
283283
SecurityContext: securityContext.NewSecurityContext(),
@@ -334,6 +334,7 @@ func TestEnsurePods(t *testing.T) {
334334
VolumeMounts: []v1.VolumeMount{
335335
k8sutil.ArangodVolumeMount(),
336336
},
337+
Resources: emptyResources,
337338
LivenessProbe: createTestLivenessProbe(false, "", k8sutil.ArangoPort),
338339
ImagePullPolicy: v1.PullIfNotPresent,
339340
SecurityContext: securityContext.NewSecurityContext(),
@@ -398,6 +399,7 @@ func TestEnsurePods(t *testing.T) {
398399
VolumeMounts: []v1.VolumeMount{
399400
k8sutil.ArangodVolumeMount(),
400401
},
402+
Resources: emptyResources,
401403
LivenessProbe: createTestLivenessProbe(false, "", k8sutil.ArangoPort),
402404
ImagePullPolicy: v1.PullIfNotPresent,
403405
SecurityContext: securityContext.NewSecurityContext(),
@@ -568,6 +570,7 @@ func TestEnsurePods(t *testing.T) {
568570
VolumeMounts: []v1.VolumeMount{
569571
k8sutil.ArangodVolumeMount(),
570572
},
573+
Resources: emptyResources,
571574
LivenessProbe: createTestLivenessProbe(false, "", k8sutil.ArangoPort),
572575
ImagePullPolicy: v1.PullIfNotPresent,
573576
SecurityContext: securityContext.NewSecurityContext(),
@@ -619,6 +622,7 @@ func TestEnsurePods(t *testing.T) {
619622
VolumeMounts: []v1.VolumeMount{
620623
k8sutil.ArangodVolumeMount(),
621624
},
625+
Resources: emptyResources,
622626
LivenessProbe: createTestLivenessProbe(false, "", k8sutil.ArangoPort),
623627
ImagePullPolicy: v1.PullIfNotPresent,
624628
SecurityContext: securityContext.NewSecurityContext(),
@@ -673,6 +677,7 @@ func TestEnsurePods(t *testing.T) {
673677
VolumeMounts: []v1.VolumeMount{
674678
k8sutil.ArangodVolumeMount(),
675679
},
680+
Resources: emptyResources,
676681
LivenessProbe: createTestLivenessProbe(false, "", k8sutil.ArangoPort),
677682
ImagePullPolicy: v1.PullIfNotPresent,
678683
SecurityContext: securityContext.NewSecurityContext(),
@@ -725,6 +730,7 @@ func TestEnsurePods(t *testing.T) {
725730
k8sutil.ArangodVolumeMount(),
726731
k8sutil.TlsKeyfileVolumeMount(),
727732
},
733+
Resources: emptyResources,
728734
LivenessProbe: createTestLivenessProbe(true, "", k8sutil.ArangoPort),
729735
ImagePullPolicy: v1.PullIfNotPresent,
730736
SecurityContext: securityContext.NewSecurityContext(),
@@ -784,6 +790,7 @@ func TestEnsurePods(t *testing.T) {
784790
k8sutil.ArangodVolumeMount(),
785791
k8sutil.ClusterJWTVolumeMount(),
786792
},
793+
Resources: emptyResources,
787794
ImagePullPolicy: v1.PullIfNotPresent,
788795
SecurityContext: securityContext.NewSecurityContext(),
789796
},
@@ -847,6 +854,7 @@ func TestEnsurePods(t *testing.T) {
847854
k8sutil.TlsKeyfileVolumeMount(),
848855
k8sutil.ClusterJWTVolumeMount(),
849856
},
857+
Resources: emptyResources,
850858
},
851859
},
852860
RestartPolicy: v1.RestartPolicyNever,
@@ -901,6 +909,7 @@ func TestEnsurePods(t *testing.T) {
901909
k8sutil.ArangodVolumeMount(),
902910
k8sutil.RocksdbEncryptionVolumeMount(),
903911
},
912+
Resources: emptyResources,
904913
LivenessProbe: createTestLivenessProbe(false, "", k8sutil.ArangoPort),
905914
ImagePullPolicy: v1.PullIfNotPresent,
906915
SecurityContext: securityContext.NewSecurityContext(),
@@ -952,6 +961,7 @@ func TestEnsurePods(t *testing.T) {
952961
VolumeMounts: []v1.VolumeMount{
953962
k8sutil.ArangodVolumeMount(),
954963
},
964+
Resources: emptyResources,
955965
LivenessProbe: createTestLivenessProbe(false, "", k8sutil.ArangoPort),
956966
ImagePullPolicy: v1.PullIfNotPresent,
957967
SecurityContext: securityContext.NewSecurityContext(),
@@ -1005,6 +1015,7 @@ func TestEnsurePods(t *testing.T) {
10051015
VolumeMounts: []v1.VolumeMount{
10061016
k8sutil.ArangodVolumeMount(),
10071017
},
1018+
Resources: emptyResources,
10081019
LivenessProbe: createTestLivenessProbe(false, "", k8sutil.ArangoPort),
10091020
ImagePullPolicy: v1.PullIfNotPresent,
10101021
SecurityContext: securityContext.NewSecurityContext(),
@@ -1066,6 +1077,7 @@ func TestEnsurePods(t *testing.T) {
10661077
VolumeMounts: []v1.VolumeMount{
10671078
k8sutil.ArangodVolumeMount(),
10681079
},
1080+
Resources: emptyResources,
10691081
LivenessProbe: createTestLivenessProbe(false, "", k8sutil.ArangoPort),
10701082
ImagePullPolicy: v1.PullIfNotPresent,
10711083
SecurityContext: securityContext.NewSecurityContext(),
@@ -1137,6 +1149,7 @@ func TestEnsurePods(t *testing.T) {
11371149
k8sutil.ArangodVolumeMount(),
11381150
k8sutil.LifecycleVolumeMount(),
11391151
},
1152+
Resources: emptyResources,
11401153
Lifecycle: createTestLifecycle(),
11411154
LivenessProbe: createTestLivenessProbe(false, "", k8sutil.ArangoPort),
11421155
ImagePullPolicy: v1.PullIfNotPresent,
@@ -1208,6 +1221,7 @@ func TestEnsurePods(t *testing.T) {
12081221
k8sutil.ArangodVolumeMount(),
12091222
k8sutil.LifecycleVolumeMount(),
12101223
},
1224+
Resources: emptyResources,
12111225
Lifecycle: createTestLifecycle(),
12121226
LivenessProbe: createTestLivenessProbe(false, "", k8sutil.ArangoPort),
12131227
ImagePullPolicy: v1.PullIfNotPresent,
@@ -1306,6 +1320,7 @@ func TestEnsurePods(t *testing.T) {
13061320
k8sutil.RocksdbEncryptionVolumeMount(),
13071321
k8sutil.ClusterJWTVolumeMount(),
13081322
},
1323+
Resources: emptyResources,
13091324
},
13101325
testCreateExporterContainer(true, emptyResources),
13111326
},
@@ -1434,6 +1449,7 @@ func TestEnsurePods(t *testing.T) {
14341449
k8sutil.TlsKeyfileVolumeMount(),
14351450
k8sutil.ClusterJWTVolumeMount(),
14361451
},
1452+
Resources: emptyResources,
14371453
},
14381454
},
14391455
RestartPolicy: v1.RestartPolicyNever,
@@ -1744,6 +1760,7 @@ func TestEnsurePods(t *testing.T) {
17441760
k8sutil.CreateEnvFieldPath(constants.EnvOperatorNodeName, "spec.nodeName"),
17451761
k8sutil.CreateEnvFieldPath(constants.EnvOperatorNodeNameArango, "spec.nodeName"),
17461762
},
1763+
Resources: emptyResources,
17471764
ImagePullPolicy: v1.PullIfNotPresent,
17481765
Lifecycle: createTestLifecycle(),
17491766
SecurityContext: securityContext.NewSecurityContext(),
@@ -1840,7 +1857,7 @@ func TestEnsurePods(t *testing.T) {
18401857
},
18411858
Lifecycle: createTestLifecycle(),
18421859
ImagePullPolicy: v1.PullIfNotPresent,
1843-
Resources: resourcesUnfiltered,
1860+
Resources: k8sutil.ExtractPodResourceRequirement(resourcesUnfiltered),
18441861
SecurityContext: securityContext.NewSecurityContext(),
18451862
VolumeMounts: []v1.VolumeMount{
18461863
k8sutil.LifecycleVolumeMount(),
@@ -2338,7 +2355,7 @@ func testCreateExporterContainer(secure bool, resources v1.ResourceRequirements)
23382355
VolumeMounts: []v1.VolumeMount{
23392356
k8sutil.ExporterJWTVolumeMount(),
23402357
},
2341-
Resources: resources,
2358+
Resources: k8sutil.ExtractPodResourceRequirement(resources),
23422359
LivenessProbe: createTestExporterLivenessProbe(secure),
23432360
ImagePullPolicy: v1.PullIfNotPresent,
23442361
SecurityContext: securityContext.NewSecurityContext(),
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
//
2+
// Copyright 2020 ArangoDB GmbH, Cologne, Germany
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
//
8+
// http://www.apache.org/licenses/LICENSE-2.0
9+
//
10+
// Unless required by applicable law or agreed to in writing, software
11+
// distributed under the License is distributed on an "AS IS" BASIS,
12+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
// See the License for the specific language governing permissions and
14+
// limitations under the License.
15+
//
16+
// Copyright holder is ArangoDB GmbH, Cologne, Germany
17+
//
18+
// Author Adam Janikowski
19+
//
20+
21+
package resources
22+
23+
import core "k8s.io/api/core/v1"
24+
25+
// NewEnvBuilder creates new ENV builder
26+
func NewEnvBuilder() EnvBuilder {
27+
return make(EnvBuilder, 0)
28+
}
29+
30+
// EnvBuilder build environment variables
31+
type EnvBuilder []core.EnvVar
32+
33+
// Add append or override flag in envs. Flag is value was modified is returned
34+
func (e *EnvBuilder) Add(override bool, envs ...core.EnvVar) (modified bool) {
35+
for _, env := range envs {
36+
if id, ok := e.getID(env); ok {
37+
if override {
38+
(*e)[id] = env
39+
modified = true
40+
}
41+
}
42+
43+
*e = append(*e, env)
44+
modified = true
45+
}
46+
47+
return
48+
}
49+
50+
func (e *EnvBuilder) getID(env core.EnvVar) (int, bool) {
51+
for id, currentEnvs := range *e {
52+
if currentEnvs.Name == env.Name {
53+
return id, true
54+
}
55+
}
56+
57+
return -1, false
58+
}
59+
60+
// GetEnvList return copy of env list
61+
func (e EnvBuilder) GetEnvList() []core.EnvVar {
62+
if len(e) == 0 {
63+
return nil
64+
}
65+
66+
l := make([]core.EnvVar, len(e))
67+
68+
for id, env := range e {
69+
l[id] = *env.DeepCopy()
70+
}
71+
72+
return l
73+
}

0 commit comments

Comments
 (0)