Skip to content

Commit 393d29e

Browse files
authored
Merge pull request #183 from feloy/tests-1099/test-ParseDevfileAndValidate
Improve tests for ParseDevfileAndValidate
2 parents 6eae8c3 + 3d08664 commit 393d29e

File tree

3 files changed

+312
-39
lines changed

3 files changed

+312
-39
lines changed

pkg/devfile/parse_test.go

+273-39
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,173 @@
1616
package devfile
1717

1818
import (
19+
"context"
1920
"net"
2021
"net/http"
2122
"net/http/httptest"
23+
"path/filepath"
2224
"reflect"
2325
"strings"
2426
"testing"
2527

2628
v1 "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
2729

30+
schema "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
2831
"github.com/devfile/api/v2/pkg/validation/variables"
2932
"github.com/devfile/library/v2/pkg/devfile/parser"
3033
"github.com/devfile/library/v2/pkg/devfile/parser/data/v2/common"
34+
"github.com/devfile/library/v2/pkg/testingutil"
35+
36+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
37+
"sigs.k8s.io/controller-runtime/pkg/client"
3138
)
3239

3340
func TestParseDevfileAndValidate(t *testing.T) {
3441
falseValue := false
3542
trueValue := true
3643
convertUriToInline := false
3744
K8sLikeComponentOriginalURIKey := "api.devfile.io/k8sLikeComponent-originalURI"
45+
46+
devfileStruct := schema.DevWorkspaceTemplate{
47+
TypeMeta: metav1.TypeMeta{
48+
APIVersion: "2.1.0",
49+
},
50+
Spec: schema.DevWorkspaceTemplateSpec{
51+
DevWorkspaceTemplateSpecContent: schema.DevWorkspaceTemplateSpecContent{
52+
Commands: []schema.Command{
53+
{
54+
Id: "run",
55+
CommandUnion: schema.CommandUnion{
56+
Exec: &schema.ExecCommand{
57+
CommandLine: "./main {{ PARAMS }}",
58+
Component: "runtime",
59+
WorkingDir: "${PROJECT_SOURCE}",
60+
LabeledCommand: schema.LabeledCommand{
61+
BaseCommand: schema.BaseCommand{
62+
Group: &schema.CommandGroup{
63+
Kind: "run",
64+
IsDefault: &trueValue,
65+
},
66+
},
67+
},
68+
},
69+
},
70+
},
71+
},
72+
Components: []schema.Component{
73+
{
74+
Name: "runtime",
75+
ComponentUnion: schema.ComponentUnion{
76+
Container: &schema.ContainerComponent{
77+
Endpoints: []schema.Endpoint{
78+
{
79+
Name: "http",
80+
TargetPort: 8080,
81+
},
82+
},
83+
Container: schema.Container{
84+
Image: "golang:latest",
85+
MemoryLimit: "1024Mi",
86+
MountSources: &trueValue,
87+
},
88+
},
89+
},
90+
},
91+
{
92+
Name: "outerloop-deploy",
93+
ComponentUnion: schema.ComponentUnion{
94+
Kubernetes: &schema.KubernetesComponent{
95+
K8sLikeComponent: schema.K8sLikeComponent{
96+
K8sLikeComponentLocation: schema.K8sLikeComponentLocation{
97+
Uri: "http://127.0.0.1:8080/outerloop-deploy.yaml",
98+
},
99+
},
100+
},
101+
},
102+
},
103+
{
104+
Name: "outerloop-deploy2",
105+
ComponentUnion: schema.ComponentUnion{
106+
Openshift: &schema.OpenshiftComponent{
107+
K8sLikeComponent: schema.K8sLikeComponent{
108+
K8sLikeComponentLocation: schema.K8sLikeComponentLocation{
109+
Uri: "http://127.0.0.1:8080/outerloop-service.yaml",
110+
},
111+
},
112+
},
113+
},
114+
},
115+
},
116+
},
117+
},
118+
}
119+
120+
devfileContent := `commands:
121+
- exec:
122+
commandLine: ./main {{ PARAMS }}
123+
component: runtime
124+
group:
125+
isDefault: true
126+
kind: run
127+
workingDir: ${PROJECT_SOURCE}
128+
id: run
129+
components:
130+
- container:
131+
endpoints:
132+
- name: http
133+
targetPort: 8080
134+
image: golang:latest
135+
memoryLimit: 1024Mi
136+
mountSources: true
137+
name: runtime
138+
- kubernetes:
139+
uri: http://127.0.0.1:8080/outerloop-deploy.yaml
140+
name: outerloop-deploy
141+
- openshift:
142+
uri: http://127.0.0.1:8080/outerloop-service.yaml
143+
name: outerloop-deploy2
144+
metadata:
145+
description: Stack with the latest Go version
146+
displayName: Go Runtime
147+
icon: https://raw.githubusercontent.com/devfile-samples/devfile-stack-icons/main/golang.svg
148+
language: go
149+
name: my-go-app
150+
projectType: go
151+
tags:
152+
- Go
153+
version: 1.0.0
154+
schemaVersion: 2.2.0
155+
`
156+
157+
devfileContentWithVariable := devfileContent + `variables:
158+
PARAMS: foo`
159+
devfileContentWithParent := `schemaVersion: 2.2.0
160+
parent:
161+
id: devfile1
162+
registryUrl: http://127.0.0.1:8080/registry
163+
`
164+
devfileContentWithParentNoRegistry := `schemaVersion: 2.2.0
165+
parent:
166+
id: devfile1
167+
`
168+
devfileContentWithCRDParent := `schemaVersion: 2.2.0
169+
parent:
170+
kubernetes:
171+
name: devfile1
172+
registryUrl: http://127.0.0.1:8080/registry
173+
`
174+
175+
registryIndex := `[{
176+
"name": "devfile1",
177+
"version": "1.0.0",
178+
"type": "stack",
179+
"links": {
180+
"self": "devfile-catalog/devfile1:1.0.0"
181+
},
182+
"resources": [
183+
"devfile.yaml"
184+
]
185+
}]`
38186
outerloopDeployContent := `
39187
kind: Deployment
40188
apiVersion: apps/v1
@@ -88,6 +236,12 @@ spec:
88236
_, err = w.Write([]byte(outerloopDeployContent))
89237
} else if strings.Contains(r.URL.Path, "/outerloop-service.yaml") {
90238
_, err = w.Write([]byte(outerloopServiceContent))
239+
} else if strings.Contains(r.URL.Path, "/devfile1.yaml") {
240+
_, err = w.Write([]byte(devfileContent))
241+
} else if r.URL.Path == "/registry/devfiles/devfile1/" {
242+
_, err = w.Write([]byte(devfileContent))
243+
} else if r.URL.Path == "/index" {
244+
_, err = w.Write([]byte(registryIndex))
91245
}
92246
if err != nil {
93247
t.Errorf("unexpected error while writing yaml: %v", err)
@@ -108,45 +262,6 @@ spec:
108262
testServer.Start()
109263
defer testServer.Close()
110264

111-
devfileContent := `commands:
112-
- exec:
113-
commandLine: ./main {{ PARAMS }}
114-
component: runtime
115-
group:
116-
isDefault: true
117-
kind: run
118-
workingDir: ${PROJECT_SOURCE}
119-
id: run
120-
components:
121-
- container:
122-
endpoints:
123-
- name: http
124-
targetPort: 8080
125-
image: golang:latest
126-
memoryLimit: 1024Mi
127-
mountSources: true
128-
name: runtime
129-
- kubernetes:
130-
uri: http://127.0.0.1:8080/outerloop-deploy.yaml
131-
name: outerloop-deploy
132-
- openshift:
133-
uri: http://127.0.0.1:8080/outerloop-service.yaml
134-
name: outerloop-deploy2
135-
metadata:
136-
description: Stack with the latest Go version
137-
displayName: Go Runtime
138-
icon: https://raw.githubusercontent.com/devfile-samples/devfile-stack-icons/main/golang.svg
139-
language: go
140-
name: my-go-app
141-
projectType: go
142-
tags:
143-
- Go
144-
version: 1.0.0
145-
schemaVersion: 2.2.0
146-
`
147-
148-
devfileContentWithVariable := devfileContent + `variables:
149-
PARAMS: foo`
150265
type args struct {
151266
args parser.ParserArgs
152267
}
@@ -293,6 +408,125 @@ schemaVersion: 2.2.0
293408
StarterProjects: map[string][]string{},
294409
},
295410
},
411+
{
412+
name: "get content from path",
413+
args: args{
414+
args: parser.ParserArgs{
415+
ExternalVariables: map[string]string{
416+
"PARAMS": "baz",
417+
},
418+
Path: "./testdata/devfile1.yaml",
419+
},
420+
},
421+
wantCommandLine: "./main baz",
422+
wantVariables: map[string]string{
423+
"PARAMS": "baz",
424+
},
425+
wantVarWarning: variables.VariableWarning{
426+
Commands: map[string][]string{},
427+
Components: map[string][]string{},
428+
Projects: map[string][]string{},
429+
StarterProjects: map[string][]string{},
430+
},
431+
},
432+
{
433+
name: "get content from url",
434+
args: args{
435+
args: parser.ParserArgs{
436+
ExternalVariables: map[string]string{
437+
"PARAMS": "baz",
438+
},
439+
URL: "http://" + filepath.Join(uri, "devfile1.yaml"),
440+
},
441+
},
442+
wantCommandLine: "./main baz",
443+
wantVariables: map[string]string{
444+
"PARAMS": "baz",
445+
},
446+
wantVarWarning: variables.VariableWarning{
447+
Commands: map[string][]string{},
448+
Components: map[string][]string{},
449+
Projects: map[string][]string{},
450+
StarterProjects: map[string][]string{},
451+
},
452+
},
453+
{
454+
name: "with parent and registry url in devfile",
455+
args: args{
456+
args: parser.ParserArgs{
457+
ExternalVariables: map[string]string{
458+
"PARAMS": "baz",
459+
},
460+
Data: []byte(devfileContentWithParent),
461+
},
462+
},
463+
wantCommandLine: "./main baz",
464+
wantVariables: map[string]string{
465+
"PARAMS": "baz",
466+
},
467+
wantVarWarning: variables.VariableWarning{
468+
Commands: map[string][]string{},
469+
Components: map[string][]string{},
470+
Projects: map[string][]string{},
471+
StarterProjects: map[string][]string{},
472+
},
473+
},
474+
{
475+
name: "with parent and no registry url in devfile",
476+
args: args{
477+
args: parser.ParserArgs{
478+
ExternalVariables: map[string]string{
479+
"PARAMS": "baz",
480+
},
481+
Data: []byte(devfileContentWithParentNoRegistry),
482+
RegistryURLs: []string{
483+
"http://127.0.0.1:8080/registry",
484+
},
485+
},
486+
},
487+
wantCommandLine: "./main baz",
488+
wantVariables: map[string]string{
489+
"PARAMS": "baz",
490+
},
491+
wantVarWarning: variables.VariableWarning{
492+
Commands: map[string][]string{},
493+
Components: map[string][]string{},
494+
Projects: map[string][]string{},
495+
StarterProjects: map[string][]string{},
496+
},
497+
},
498+
{
499+
name: "getting from cluster and setting default namespace",
500+
args: args{
501+
args: parser.ParserArgs{
502+
ExternalVariables: map[string]string{
503+
"PARAMS": "baz",
504+
},
505+
Data: []byte(devfileContentWithCRDParent),
506+
K8sClient: func() client.Client {
507+
testK8sClient := &testingutil.FakeK8sClient{
508+
ExpectedNamespace: "my-namespace",
509+
DevWorkspaceResources: map[string]schema.DevWorkspaceTemplate{
510+
"devfile1": devfileStruct,
511+
},
512+
}
513+
return testK8sClient
514+
}(),
515+
Context: context.Background(),
516+
DefaultNamespace: "my-namespace",
517+
},
518+
},
519+
wantCommandLine: "./main baz",
520+
wantVariables: map[string]string{
521+
"PARAMS": "baz",
522+
},
523+
wantVarWarning: variables.VariableWarning{
524+
Commands: map[string][]string{},
525+
Components: map[string][]string{},
526+
Projects: map[string][]string{},
527+
StarterProjects: map[string][]string{},
528+
},
529+
},
296530
}
297531
for _, tt := range tests {
298532
t.Run(tt.name, func(t *testing.T) {

pkg/devfile/testdata/devfile1.yaml

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
commands:
2+
- exec:
3+
commandLine: ./main {{ PARAMS }}
4+
component: runtime
5+
group:
6+
isDefault: true
7+
kind: run
8+
workingDir: ${PROJECT_SOURCE}
9+
id: run
10+
components:
11+
- container:
12+
endpoints:
13+
- name: http
14+
targetPort: 8080
15+
image: golang:latest
16+
memoryLimit: 1024Mi
17+
mountSources: true
18+
name: runtime
19+
- kubernetes:
20+
uri: http://127.0.0.1:8080/outerloop-deploy.yaml
21+
name: outerloop-deploy
22+
- openshift:
23+
uri: http://127.0.0.1:8080/outerloop-service.yaml
24+
name: outerloop-deploy2
25+
metadata:
26+
description: Stack with the latest Go version
27+
displayName: Go Runtime
28+
icon: https://raw.githubusercontent.com/devfile-samples/devfile-stack-icons/main/golang.svg
29+
language: go
30+
name: my-go-app
31+
projectType: go
32+
tags:
33+
- Go
34+
version: 1.0.0
35+
schemaVersion: 2.2.0

0 commit comments

Comments
 (0)