-
Notifications
You must be signed in to change notification settings - Fork 8
/
resources.go
114 lines (92 loc) · 3.03 KB
/
resources.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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*
Copyright 2022-2023 Lawrence Livermore National Security, LLC
(c.f. AUTHORS, NOTICE.LLNS, COPYING)
This is part of the Flux resource manager framework.
For details, see https://github.com/flux-framework.
SPDX-License-Identifier: Apache-2.0
*/
package controllers
import (
"fmt"
api "github.com/flux-framework/flux-operator/api/v1alpha2"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
"k8s.io/apimachinery/pkg/util/intstr"
)
// getResourceGroup can return a ResourceList for either requests or limits
func getResourceGroup(items api.ContainerResource) (corev1.ResourceList, error) {
list := corev1.ResourceList{}
for key, unknownValue := range items {
if unknownValue.Type == intstr.Int {
value := unknownValue.IntVal
limit, err := resource.ParseQuantity(fmt.Sprintf("%d", value))
if err != nil {
return list, err
}
if key == "memory" {
list[corev1.ResourceMemory] = limit
} else if key == "cpu" {
list[corev1.ResourceCPU] = limit
} else {
list[corev1.ResourceName(key)] = limit
}
} else if unknownValue.Type == intstr.String {
value := unknownValue.StrVal
if key == "memory" {
list[corev1.ResourceMemory] = resource.MustParse(value)
} else if key == "cpu" {
list[corev1.ResourceCPU] = resource.MustParse(value)
} else {
list[corev1.ResourceName(key)] = resource.MustParse(value)
}
}
}
return list, nil
}
// A pre-set function to give the init container resources
// We do this if all the containers in the pod have memory and cpu.
// This means the QoS class likely is desired to be guaranteed
func getFluxContainerResources(container api.FluxContainer) (corev1.ResourceRequirements, error) {
// memory int, setCPURequest, setCPULimit, setGPULimit int64
resources := corev1.ResourceRequirements{}
// Limits
limits, err := getResourceGroup(container.Resources.Limits)
if err != nil {
return resources, err
}
resources.Limits = limits
// Requests
requests, err := getResourceGroup(container.Resources.Requests)
if err != nil {
return resources, err
}
resources.Requests = requests
return resources, nil
}
// getContainerResources determines if any resources are requested via the spec
func getContainerResources(container *api.MiniClusterContainer) (corev1.ResourceRequirements, error) {
// memory int, setCPURequest, setCPULimit, setGPULimit int64
resources := corev1.ResourceRequirements{}
// Limits
limits, err := getResourceGroup(container.Resources.Limits)
if err != nil {
return resources, err
}
resources.Limits = limits
// Requests
requests, err := getResourceGroup(container.Resources.Requests)
if err != nil {
return resources, err
}
resources.Requests = requests
return resources, nil
}
// getPodResources determines if any resources are requested via the spec
func getPodResources(cluster *api.MiniCluster) (corev1.ResourceList, error) {
// memory int, setCPURequest, setCPULimit, setGPULimit int64
resources, err := getResourceGroup(cluster.Spec.Pod.Resources)
if err != nil {
return resources, err
}
return resources, nil
}