@@ -33,6 +33,16 @@ func ApplyContainerResourceRequirements(container *core.Container, resources cor
33
33
container .Resources .Requests = ApplyContainerResourceList (container .Resources .Requests , resources .Requests )
34
34
}
35
35
36
+ // MergeContainerResource updates resources from `from` to `to` ResourceList
37
+ func MergeContainerResource (to core.ResourceRequirements , from core.ResourceRequirements ) core.ResourceRequirements {
38
+ var r core.ResourceRequirements
39
+
40
+ r .Limits = MergeContainerResourceList (to .Limits , from .Limits )
41
+ r .Requests = MergeContainerResourceList (to .Requests , from .Requests )
42
+
43
+ return r
44
+ }
45
+
36
46
// ApplyContainerResource adds non-existing resources from `from` to `to` ResourceList
37
47
func ApplyContainerResource (to core.ResourceRequirements , from core.ResourceRequirements ) core.ResourceRequirements {
38
48
var r core.ResourceRequirements
@@ -43,6 +53,27 @@ func ApplyContainerResource(to core.ResourceRequirements, from core.ResourceRequ
43
53
return r
44
54
}
45
55
56
+ // MergeContainerResourceList updates resources from `from` to `to` ResourceList
57
+ func MergeContainerResourceList (to core.ResourceList , from core.ResourceList ) core.ResourceList {
58
+ if len (from ) == 0 {
59
+ return to
60
+ }
61
+
62
+ if to == nil {
63
+ to = core.ResourceList {}
64
+ }
65
+
66
+ for k , v := range from {
67
+ if v .IsZero () {
68
+ delete (to , k )
69
+ } else {
70
+ to [k ] = v
71
+ }
72
+ }
73
+
74
+ return to
75
+ }
76
+
46
77
// ApplyContainerResourceList adds non-existing resources from `from` to `to` ResourceList
47
78
func ApplyContainerResourceList (to core.ResourceList , from core.ResourceList ) core.ResourceList {
48
79
if len (from ) == 0 {
@@ -69,16 +100,30 @@ func UpscaleContainerResourceRequirements(container *core.Container, resources c
69
100
70
101
container .Resources .Limits = UpscaleContainerResourceList (container .Resources .Limits , resources .Limits )
71
102
container .Resources .Requests = UpscaleContainerResourceList (container .Resources .Requests , resources .Requests )
103
+
104
+ // Ensure that Limits are always higher or equals requests
105
+ container .Resources .Limits = UpscaleOptionalContainerResourceList (container .Resources .Limits , container .Resources .Requests )
72
106
}
73
107
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
108
+ // UpscaleOptionalContainerResourceList scales up resources from `from` to `to` ResourceList if they exists in `to`
109
+ func UpscaleOptionalContainerResourceList (to core.ResourceList , from core.ResourceList ) core.ResourceList {
110
+ if len (from ) == 0 {
111
+ return to
112
+ }
113
+
114
+ if to == nil {
115
+ to = core.ResourceList {}
116
+ }
77
117
78
- r .Limits = UpscaleContainerResourceList (to .Limits , from .Limits )
79
- r .Requests = UpscaleContainerResourceList (to .Requests , from .Requests )
118
+ for k , v := range from {
119
+ if n , ok := to [k ]; ok {
120
+ if n .Cmp (v ) < 0 {
121
+ to [k ] = v
122
+ }
123
+ }
124
+ }
80
125
81
- return r
126
+ return to
82
127
}
83
128
84
129
// UpscaleContainerResourceList scales up resources from `from` to `to` ResourceList
0 commit comments