/
helpers.go
94 lines (83 loc) · 2.34 KB
/
helpers.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*
Copyright AppsCode Inc. and Contributors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package apis
import (
core "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
"kmodules.xyz/client-go/apiextensions"
)
const (
Finalizer = "kubedb.com"
)
type ResourceInfo interface {
ResourceFQN() string
ResourceShortCode() string
ResourceKind() string
ResourceSingular() string
ResourcePlural() string
CustomResourceDefinition() *apiextensions.CustomResourceDefinition
}
func SetDefaultResourceLimits(req *core.ResourceRequirements, defaultResources core.ResourceRequirements) {
// if request is set,
// - limit set:
// - return max(limit,request)
// else if limit set:
// - return limit
// else
// - return default
calLimit := func(name core.ResourceName, defaultValue resource.Quantity) resource.Quantity {
if r, ok := req.Requests[name]; ok {
// l is greater than r == 1.
if l, exist := req.Limits[name]; exist && l.Cmp(r) == 1 {
return l
}
return r
}
if l, ok := req.Limits[name]; ok {
return l
}
return defaultValue
}
// if request is not set,
// - if limit exists:
// - copy limit
// - else
// - set default
// else
// - return request
// endif
calRequest := func(name core.ResourceName, defaultValue resource.Quantity) resource.Quantity {
if r, ok := req.Requests[name]; !ok {
if l, exist := req.Limits[name]; exist {
return l
}
return defaultValue
} else {
return r
}
}
if req.Limits == nil {
req.Limits = core.ResourceList{}
}
if req.Requests == nil {
req.Requests = core.ResourceList{}
}
// Calculate the limits first
for l := range defaultResources.Limits {
req.Limits[l] = calLimit(l, defaultResources.Limits[l])
}
// Once the limit is calculated, Calculate requests
for r := range defaultResources.Requests {
req.Requests[r] = calRequest(r, defaultResources.Requests[r])
}
}