Skip to content

Commit 70364e3

Browse files
authored
Merge pull request #119 from yangcao77/641-resource-limits
add more resource requirement in generator
2 parents f858c8e + fd79c14 commit 70364e3

File tree

4 files changed

+107
-19
lines changed

4 files changed

+107
-19
lines changed

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module github.com/devfile/library
33
go 1.15
44

55
require (
6-
github.com/devfile/api/v2 v2.0.0-20210917193329-089a48011460
6+
github.com/devfile/api/v2 v2.0.0-20211012194348-adf74d82f446
77
github.com/fatih/color v1.7.0
88
github.com/gobwas/glob v0.2.3
99
github.com/golang/mock v1.5.0

go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ
8383
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
8484
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
8585
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
86-
github.com/devfile/api/v2 v2.0.0-20210917193329-089a48011460 h1:cmd+3poyUwevcWchYdvE02YT1nQU4SJpA5/wrdLrpWE=
87-
github.com/devfile/api/v2 v2.0.0-20210917193329-089a48011460/go.mod h1:kLX/nW93gigOHXK3NLeJL2fSS/sgEe+OHu8bo3aoOi4=
86+
github.com/devfile/api/v2 v2.0.0-20211012194348-adf74d82f446 h1:4/lT2y37QMUQpqF0JnYPy2JkJ58X/dHEwr3goiWbzD4=
87+
github.com/devfile/api/v2 v2.0.0-20211012194348-adf74d82f446/go.mod h1:d99eTN6QxgzihOOFyOZA+VpUyD4Q1pYRYHZ/ci9J96Q=
8888
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
8989
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
9090
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=

pkg/devfile/generator/utils.go

+52-8
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package generator
22

33
import (
44
"fmt"
5+
"github.com/hashicorp/go-multierror"
56
"path/filepath"
7+
"reflect"
68
"strings"
79

810
v1 "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
@@ -58,17 +60,56 @@ func convertPorts(endpoints []v1.Endpoint) []corev1.ContainerPort {
5860
}
5961

6062
// getResourceReqs creates a kubernetes ResourceRequirements object based on resource requirements set in the devfile
61-
func getResourceReqs(comp v1.Component) corev1.ResourceRequirements {
63+
func getResourceReqs(comp v1.Component) (corev1.ResourceRequirements, error) {
6264
reqs := corev1.ResourceRequirements{}
6365
limits := make(corev1.ResourceList)
64-
if comp.Container != nil && comp.Container.MemoryLimit != "" {
65-
memoryLimit, err := resource.ParseQuantity(comp.Container.MemoryLimit)
66-
if err == nil {
67-
limits[corev1.ResourceMemory] = memoryLimit
66+
requests := make(corev1.ResourceList)
67+
var returnedErr error
68+
if comp.Container != nil {
69+
if comp.Container.MemoryLimit != "" {
70+
memoryLimit, err := resource.ParseQuantity(comp.Container.MemoryLimit)
71+
if err != nil {
72+
errMsg := fmt.Errorf("error parsing memoryLimit requirement for component %s: %v", comp.Name, err.Error())
73+
returnedErr = multierror.Append(returnedErr, errMsg)
74+
} else {
75+
limits[corev1.ResourceMemory] = memoryLimit
76+
}
77+
}
78+
if comp.Container.CpuLimit != "" {
79+
cpuLimit, err := resource.ParseQuantity(comp.Container.CpuLimit)
80+
if err != nil {
81+
errMsg := fmt.Errorf("error parsing cpuLimit requirement for component %s: %v", comp.Name, err.Error())
82+
returnedErr = multierror.Append(returnedErr, errMsg)
83+
} else {
84+
limits[corev1.ResourceCPU] = cpuLimit
85+
}
86+
}
87+
if comp.Container.MemoryRequest != "" {
88+
memoryRequest, err := resource.ParseQuantity(comp.Container.MemoryRequest)
89+
if err != nil {
90+
errMsg := fmt.Errorf("error parsing memoryRequest requirement for component %s: %v", comp.Name, err.Error())
91+
returnedErr = multierror.Append(returnedErr, errMsg)
92+
} else {
93+
requests[corev1.ResourceMemory] = memoryRequest
94+
}
95+
}
96+
if comp.Container.CpuRequest != "" {
97+
cpuRequest, err := resource.ParseQuantity(comp.Container.CpuRequest)
98+
if err != nil {
99+
errMsg := fmt.Errorf("error parsing cpuRequest requirement for component %s: %v", comp.Name, err.Error())
100+
returnedErr = multierror.Append(returnedErr, errMsg)
101+
} else {
102+
requests[corev1.ResourceCPU] = cpuRequest
103+
}
104+
}
105+
if !reflect.DeepEqual(limits, corev1.ResourceList{}) {
106+
reqs.Limits = limits
107+
}
108+
if !reflect.DeepEqual(requests, corev1.ResourceList{}) {
109+
reqs.Requests = requests
68110
}
69-
reqs.Limits = limits
70111
}
71-
return reqs
112+
return reqs, returnedErr
72113
}
73114

74115
// addSyncRootFolder adds the sync root folder to the container env
@@ -517,7 +558,10 @@ func getAllContainers(devfileObj parser.DevfileObj, options common.DevfileOption
517558
}
518559
for _, comp := range containerComponents {
519560
envVars := convertEnvs(comp.Container.Env)
520-
resourceReqs := getResourceReqs(comp)
561+
resourceReqs, err := getResourceReqs(comp)
562+
if err != nil {
563+
return containers, err
564+
}
521565
ports := convertPorts(comp.Container.Endpoints)
522566
containerParams := containerParams{
523567
Name: comp.Name,

pkg/devfile/generator/utils_test.go

+52-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package generator
22

33
import (
4+
"github.com/hashicorp/go-multierror"
45
"github.com/stretchr/testify/assert"
56
"path/filepath"
67
"reflect"
@@ -162,31 +163,47 @@ func TestConvertPorts(t *testing.T) {
162163
}
163164

164165
func TestGetResourceReqs(t *testing.T) {
165-
limit := "1024Mi"
166-
quantity, err := resource.ParseQuantity(limit)
166+
memoryLimit := "1024Mi"
167+
memoryRequest := "1Gi"
168+
cpuRequest := "1m"
169+
cpuLimit := "1m"
170+
171+
memoryLimitQuantity, err := resource.ParseQuantity(memoryLimit)
172+
memoryRequestQuantity, err := resource.ParseQuantity(memoryRequest)
173+
cpuRequestQuantity, err := resource.ParseQuantity(cpuRequest)
174+
cpuLimitQuantity, err := resource.ParseQuantity(cpuLimit)
167175
if err != nil {
168176
t.Errorf("TestGetResourceReqs() unexpected error: %v", err)
169177
}
170178
tests := []struct {
171179
name string
172180
component v1.Component
173181
want corev1.ResourceRequirements
182+
wantErr []string
174183
}{
175184
{
176-
name: "One Endpoint",
185+
name: "generate resource limit",
177186
component: v1.Component{
178187
Name: "testcomponent",
179188
ComponentUnion: v1.ComponentUnion{
180189
Container: &v1.ContainerComponent{
181190
Container: v1.Container{
182-
MemoryLimit: "1024Mi",
191+
MemoryLimit: memoryLimit,
192+
MemoryRequest: memoryRequest,
193+
CpuRequest: cpuRequest,
194+
CpuLimit: cpuLimit,
183195
},
184196
},
185197
},
186198
},
187199
want: corev1.ResourceRequirements{
188200
Limits: corev1.ResourceList{
189-
corev1.ResourceMemory: quantity,
201+
corev1.ResourceMemory: memoryLimitQuantity,
202+
corev1.ResourceCPU: cpuLimitQuantity,
203+
},
204+
Requests: corev1.ResourceList{
205+
corev1.ResourceMemory: memoryRequestQuantity,
206+
corev1.ResourceCPU: cpuRequestQuantity,
190207
},
191208
},
192209
},
@@ -209,13 +226,40 @@ func TestGetResourceReqs(t *testing.T) {
209226
},
210227
want: corev1.ResourceRequirements{},
211228
},
229+
{
230+
name: "test error case",
231+
component: v1.Component{
232+
Name: "testcomponent",
233+
ComponentUnion: v1.ComponentUnion{
234+
Container: &v1.ContainerComponent{
235+
Container: v1.Container{
236+
MemoryLimit: "invalid",
237+
MemoryRequest: "invalid",
238+
CpuRequest: "invalid",
239+
CpuLimit: "invalid",
240+
},
241+
},
242+
},
243+
},
244+
wantErr: []string{
245+
"error parsing memoryLimit requirement.*",
246+
"error parsing cpuLimit requirement.*",
247+
"error parsing memoryRequest requirement.*",
248+
"error parsing cpuRequest requirement.*",
249+
},
250+
},
212251
}
213252

214253
for _, tt := range tests {
215254
t.Run(tt.name, func(t *testing.T) {
216-
req := getResourceReqs(tt.component)
217-
if !reflect.DeepEqual(tt.want, req) {
218-
t.Errorf("TestGetResourceReqs() error: expected %v, wanted %v", req, tt.want)
255+
req, err := getResourceReqs(tt.component)
256+
if merr, ok := err.(*multierror.Error); ok && tt.wantErr != nil {
257+
assert.Equal(t, len(tt.wantErr), len(merr.Errors), "Error list length should match")
258+
for i := 0; i < len(merr.Errors); i++ {
259+
assert.Regexp(t, tt.wantErr[i], merr.Errors[i].Error(), "Error message should match")
260+
}
261+
} else if !reflect.DeepEqual(tt.want, req) {
262+
assert.Equal(t, tt.want, req, "TestGetResourceReqs(): The two values should be the same.")
219263
}
220264
})
221265
}

0 commit comments

Comments
 (0)