Skip to content
This repository was archived by the owner on Mar 16, 2024. It is now read-only.

Commit 7a33960

Browse files
author
Oscar Ward
authored
ComputeClass overprovisioning request floor ignores minimum (#2381) (#2396)
1 parent e32a270 commit 7a33960

File tree

8 files changed

+158
-33
lines changed

8 files changed

+158
-33
lines changed

pkg/computeclasses/computeclasses.go

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
internaladminv1 "github.com/acorn-io/runtime/pkg/apis/internal.admin.acorn.io/v1"
1414
apierrors "k8s.io/apimachinery/pkg/api/errors"
1515
"k8s.io/apimachinery/pkg/api/resource"
16-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1716
"sigs.k8s.io/controller-runtime/pkg/client"
1817
)
1918

@@ -121,11 +120,7 @@ func Validate(cc apiv1.ComputeClass, memory resource.Quantity, memDefault *int64
121120
return nil
122121
}
123122

124-
func CalculateCPU(cc internaladminv1.ProjectComputeClassInstance, memDefault *int64, memory resource.Quantity) (resource.Quantity, error) {
125-
if err := ValidateProjectComputeClass(cc, memory, memDefault); err != nil {
126-
return resource.Quantity{}, err
127-
}
128-
123+
func CalculateCPU(cc internaladminv1.ProjectComputeClassInstance, memory resource.Quantity) (resource.Quantity, error) {
129124
// The CPU scaler calculates the CPUs per Gi of memory so get the memory in a ratio of Gi
130125
memoryInGi := memory.AsApproximateFloat64() / gi
131126
// Since we're putting this in to mili-cpu's, multiply memoryInGi by the scaler and by 1000
@@ -134,18 +129,6 @@ func CalculateCPU(cc internaladminv1.ProjectComputeClassInstance, memDefault *in
134129
return *resource.NewMilliQuantity(int64(math.Ceil(value)), resource.DecimalSI), nil
135130
}
136131

137-
func ValidateProjectComputeClass(cc internaladminv1.ProjectComputeClassInstance, memory resource.Quantity, memDefault *int64) error {
138-
return Validate(apiv1.ComputeClass{
139-
ObjectMeta: metav1.ObjectMeta{
140-
Name: cc.Name,
141-
},
142-
Memory: cc.Memory,
143-
Description: cc.Description,
144-
Default: cc.Default,
145-
SupportedRegions: cc.SupportedRegions,
146-
}, memory, memDefault)
147-
}
148-
149132
func GetComputeClassNameForWorkload(workload string, container internalv1.Container, computeClasses internalv1.ComputeClassMap) string {
150133
var cc string
151134
if specific, ok := computeClasses[workload]; ok {

pkg/controller/scheduling/computeclass_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ func TestGenericResourcesComputeClass(t *testing.T) {
6161
tester.DefaultTest(t, scheme.Scheme, "testdata/computeclass/generic-resources", Calculate)
6262
}
6363

64+
func TestRequestScalerValues(t *testing.T) {
65+
tester.DefaultTest(t, scheme.Scheme, "testdata/computeclass/request-scaler-values", Calculate)
66+
}
67+
6468
func TestRequestScaler(t *testing.T) {
6569
tester.DefaultTest(t, scheme.Scheme, "testdata/computeclass/request-scaler", Calculate)
6670
}

pkg/controller/scheduling/scheduling.go

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -197,17 +197,6 @@ func ResourceRequirements(req router.Request, app *v1.AppInstance, containerName
197197
if computeClass != nil && computeClass.Memory.RequestScaler != 0 {
198198
// The following line should hold up without loss of precision up to 4 petabytes
199199
memoryRequest.Set(int64(memoryLimit.AsApproximateFloat64() * computeClass.Memory.RequestScaler))
200-
201-
// Never allocate less than the defined minimum of the compute class
202-
if computeClass.Memory.Min != "" && computeClass.Memory.Min != "0" {
203-
minValue, err := resource.ParseQuantity(computeClass.Memory.Min)
204-
if err != nil {
205-
return nil, err
206-
}
207-
if minValue.Cmp(memoryRequest) == 1 {
208-
memoryRequest = minValue
209-
}
210-
}
211200
}
212201

213202
if memoryLimit.Value() != 0 {
@@ -216,7 +205,7 @@ func ResourceRequirements(req router.Request, app *v1.AppInstance, containerName
216205
}
217206

218207
if computeClass != nil {
219-
cpuQuantity, err := computeclasses.CalculateCPU(*computeClass, memDefault, memoryRequest)
208+
cpuQuantity, err := computeclasses.CalculateCPU(*computeClass, memoryRequest)
220209
if err != nil {
221210
return nil, err
222211
}

pkg/controller/scheduling/testdata/computeclass/request-scaler-floor/existing.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ memory:
99
min: 1Mi # 1Mi
1010
max: 2Mi # 2Mi
1111
default: 2Mi # 2Mi
12-
requestScaler: .1
12+
requestScaler: .125
1313
affinity:
1414
nodeAffinity:
1515
requiredDuringSchedulingIgnoredDuringExecution:

pkg/controller/scheduling/testdata/computeclass/request-scaler-floor/expected.golden

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ status:
5959
memory: 2Mi
6060
requests:
6161
cpu: 1m
62-
memory: 1Mi
62+
memory: 256Ki
6363
oneimage:
6464
affinity:
6565
nodeAffinity:
@@ -75,7 +75,7 @@ status:
7575
memory: 2Mi
7676
requests:
7777
cpu: 1m
78-
memory: 1Mi
78+
memory: 256Ki
7979
tolerations:
8080
- key: taints.acorn.io/workload
8181
operator: Exists
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
---
2+
kind: ClusterComputeClassInstance
3+
apiVersion: internal.admin.acorn.io/v1
4+
metadata:
5+
name: sample-compute-class
6+
description: Simple description for a simple ComputeClass
7+
cpuScaler: 0.25
8+
memory:
9+
min: 1Mi # 1Mi
10+
max: 2Mi # 2Mi
11+
default: 2Mi # 2Mi
12+
values: [1Mi, 2Mi]
13+
requestScaler: .25
14+
affinity:
15+
nodeAffinity:
16+
requiredDuringSchedulingIgnoredDuringExecution:
17+
nodeSelectorTerms:
18+
- matchExpressions:
19+
- key: foo
20+
operator: In
21+
values:
22+
- bar
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
`apiVersion: internal.acorn.io/v1
2+
kind: AppInstance
3+
metadata:
4+
creationTimestamp: null
5+
name: app-name
6+
namespace: app-namespace
7+
uid: 1234567890abcdef
8+
spec:
9+
computeClass:
10+
oneimage: sample-compute-class
11+
image: test
12+
status:
13+
appImage:
14+
buildContext: {}
15+
id: test
16+
imageData: {}
17+
vcs: {}
18+
appSpec:
19+
containers:
20+
oneimage:
21+
build:
22+
context: .
23+
dockerfile: Dockerfile
24+
image: image-name
25+
metrics: {}
26+
ports:
27+
- port: 80
28+
protocol: http
29+
targetPort: 81
30+
probes: null
31+
sidecars:
32+
left:
33+
image: foo
34+
metrics: {}
35+
ports:
36+
- port: 90
37+
protocol: tcp
38+
targetPort: 91
39+
probes: null
40+
appStatus: {}
41+
columns: {}
42+
conditions:
43+
reason: Success
44+
status: "True"
45+
success: true
46+
type: scheduling
47+
defaults:
48+
memory:
49+
"": 0
50+
left: 2097152
51+
oneimage: 2097152
52+
namespace: app-created-namespace
53+
observedGeneration: 1
54+
resolvedOfferings: {}
55+
scheduling:
56+
left:
57+
requirements:
58+
limits:
59+
memory: 2Mi
60+
requests:
61+
cpu: 1m
62+
memory: 512Ki
63+
oneimage:
64+
affinity:
65+
nodeAffinity:
66+
requiredDuringSchedulingIgnoredDuringExecution:
67+
nodeSelectorTerms:
68+
- matchExpressions:
69+
- key: foo
70+
operator: In
71+
values:
72+
- bar
73+
requirements:
74+
limits:
75+
memory: 2Mi
76+
requests:
77+
cpu: 1m
78+
memory: 512Ki
79+
tolerations:
80+
- key: taints.acorn.io/workload
81+
operator: Exists
82+
staged:
83+
appImage:
84+
buildContext: {}
85+
imageData: {}
86+
vcs: {}
87+
summary: {}
88+
`
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
kind: AppInstance
2+
apiVersion: internal.acorn.io/v1
3+
metadata:
4+
name: app-name
5+
namespace: app-namespace
6+
uid: 1234567890abcdef
7+
spec:
8+
image: test
9+
computeClass:
10+
oneimage: sample-compute-class
11+
status:
12+
observedGeneration: 1
13+
defaults:
14+
memory:
15+
"": 0
16+
left: 2097152 # 2Mi
17+
oneimage: 2097152 # 2Mi
18+
namespace: app-created-namespace
19+
appImage:
20+
id: test
21+
defaults:
22+
appSpec:
23+
containers:
24+
oneimage:
25+
sidecars:
26+
left:
27+
image: "foo"
28+
ports:
29+
- port: 90
30+
targetPort: 91
31+
protocol: tcp
32+
ports:
33+
- port: 80
34+
targetPort: 81
35+
protocol: http
36+
image: "image-name"
37+
build:
38+
dockerfile: "Dockerfile"
39+
context: "."

0 commit comments

Comments
 (0)