Skip to content

Commit 86d3c1c

Browse files
committed
add unit test for AddSourceAttributesForOverrideAndMerge
Signed-off-by: Stephanie <yangcao@redhat.com>
1 parent dbf9043 commit 86d3c1c

4 files changed

Lines changed: 210 additions & 34 deletions

File tree

pkg/devfile/parser/parse.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,11 +212,17 @@ func parseParentAndPlugin(d DevfileObj, resolveCtx *resolutionContextTree, tool
212212

213213
parentWorkspaceContent := parentDevfileObj.Data.GetDevfileWorkspaceSpecContent()
214214
// add attribute to parent elements
215-
AddSourceAttributesForOverrideAndMerge(parent.ImportReference, parentWorkspaceContent)
215+
err = addSourceAttributesForOverrideAndMerge(parent.ImportReference, parentWorkspaceContent)
216+
if err != nil {
217+
return err
218+
}
216219
if !reflect.DeepEqual(parent.ParentOverrides, v1.ParentOverrides{}) {
217220
// add attribute to parentOverrides elements
218221
curNodeImportReference := resolveCtx.importReference
219-
AddSourceAttributesForOverrideAndMerge(curNodeImportReference, &parent.ParentOverrides)
222+
err = addSourceAttributesForOverrideAndMerge(curNodeImportReference, &parent.ParentOverrides)
223+
if err != nil {
224+
return err
225+
}
220226
flattenedParent, err = apiOverride.OverrideDevWorkspaceTemplateSpec(parentWorkspaceContent, parent.ParentOverrides)
221227
if err != nil {
222228
return err
@@ -256,12 +262,18 @@ func parseParentAndPlugin(d DevfileObj, resolveCtx *resolutionContextTree, tool
256262
}
257263
pluginWorkspaceContent := pluginDevfileObj.Data.GetDevfileWorkspaceSpecContent()
258264
// add attribute to plugin elements
259-
AddSourceAttributesForOverrideAndMerge(plugin.ImportReference, pluginWorkspaceContent)
265+
err = addSourceAttributesForOverrideAndMerge(plugin.ImportReference, pluginWorkspaceContent)
266+
if err != nil {
267+
return err
268+
}
260269
flattenedPlugin := pluginWorkspaceContent
261270
if !reflect.DeepEqual(plugin.PluginOverrides, v1.PluginOverrides{}) {
262271
// add attribute to pluginOverrides elements
263272
curNodeImportReference := resolveCtx.importReference
264-
AddSourceAttributesForOverrideAndMerge(curNodeImportReference, &plugin.PluginOverrides)
273+
err = addSourceAttributesForOverrideAndMerge(curNodeImportReference, &plugin.PluginOverrides)
274+
if err != nil {
275+
return err
276+
}
265277
flattenedPlugin, err = apiOverride.OverrideDevWorkspaceTemplateSpec(pluginWorkspaceContent, plugin.PluginOverrides)
266278
if err != nil {
267279
return err

pkg/devfile/parser/parse_test.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ const schemaV200 = "2.0.0"
2929
func Test_parseParentAndPluginFromURI(t *testing.T) {
3030
const uri1 = "127.0.0.1:8080"
3131
const uri2 = "127.0.0.1:9090"
32-
importFromUri1 := attributes.Attributes{}.PutString(ImportSourceAttribute, fmt.Sprintf("uri: http://%s", uri1))
33-
importFromUri2 := attributes.Attributes{}.PutString(ImportSourceAttribute, fmt.Sprintf("uri: http://%s", uri2))
34-
parentOverridesFromMainDevfile := attributes.Attributes{}.PutString(ImportSourceAttribute,
35-
fmt.Sprintf("uri: http://%s", uri1)).PutString(ParentOverrideAttribute, "main devfile")
36-
pluginOverridesFromMainDevfile := attributes.Attributes{}.PutString(ImportSourceAttribute,
37-
fmt.Sprintf("uri: http://%s", uri2)).PutString(PluginOverrideAttribute, "main devfile")
32+
importFromUri1 := attributes.Attributes{}.PutString(importSourceAttribute, fmt.Sprintf("uri: http://%s", uri1))
33+
importFromUri2 := attributes.Attributes{}.PutString(importSourceAttribute, fmt.Sprintf("uri: http://%s", uri2))
34+
parentOverridesFromMainDevfile := attributes.Attributes{}.PutString(importSourceAttribute,
35+
fmt.Sprintf("uri: http://%s", uri1)).PutString(parentOverrideAttribute, "main devfile")
36+
pluginOverridesFromMainDevfile := attributes.Attributes{}.PutString(importSourceAttribute,
37+
fmt.Sprintf("uri: http://%s", uri2)).PutString(pluginOverrideAttribute, "main devfile")
3838

3939
parentDevfile := DevfileObj{
4040
Data: &v2.DevfileV2{
@@ -2522,9 +2522,9 @@ func Test_parseParentFromRegistry(t *testing.T) {
25222522
},
25232523
}
25242524

2525-
importFromRegistry := attributes.Attributes{}.PutString(ImportSourceAttribute, resolveImportReference(mainDevfileContent.Parent.ImportReference))
2526-
parentOverridesFromMainDevfile := attributes.Attributes{}.PutString(ImportSourceAttribute,
2527-
resolveImportReference(mainDevfileContent.Parent.ImportReference)).PutString(ParentOverrideAttribute, "main devfile")
2525+
importFromRegistry := attributes.Attributes{}.PutString(importSourceAttribute, resolveImportReference(mainDevfileContent.Parent.ImportReference))
2526+
parentOverridesFromMainDevfile := attributes.Attributes{}.PutString(importSourceAttribute,
2527+
resolveImportReference(mainDevfileContent.Parent.ImportReference)).PutString(parentOverrideAttribute, "main devfile")
25282528

25292529
wantDevfileContent := v1.Devfile{
25302530
DevWorkspaceTemplateSpec: v1.DevWorkspaceTemplateSpec{
@@ -2786,9 +2786,9 @@ func Test_parseParentFromKubeCRD(t *testing.T) {
27862786
},
27872787
}
27882788

2789-
importFromKubeCRD := attributes.Attributes{}.PutString(ImportSourceAttribute, resolveImportReference(kubeCRDReference))
2790-
parentOverridesFromMainDevfile := attributes.Attributes{}.PutString(ImportSourceAttribute,
2791-
resolveImportReference(kubeCRDReference)).PutString(ParentOverrideAttribute, "main devfile")
2789+
importFromKubeCRD := attributes.Attributes{}.PutString(importSourceAttribute, resolveImportReference(kubeCRDReference))
2790+
parentOverridesFromMainDevfile := attributes.Attributes{}.PutString(importSourceAttribute,
2791+
resolveImportReference(kubeCRDReference)).PutString(parentOverrideAttribute, "main devfile")
27922792

27932793
parentSpec := v1.DevWorkspaceTemplateSpec{
27942794
DevWorkspaceTemplateSpecContent: v1.DevWorkspaceTemplateSpecContent{

pkg/devfile/parser/sourceAttribute.go

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,38 @@ import (
66
"github.com/devfile/api/v2/pkg/attributes"
77
)
88

9-
const ImportSourceAttribute = "library.devfile.io/imported-from"
10-
const PluginOverrideAttribute = "library.devfile.io/plugin-override-from"
11-
const ParentOverrideAttribute = "library.devfile.io/parent-override-from"
9+
const (
10+
importSourceAttribute = "library.devfile.io/imported-from"
11+
pluginOverrideAttribute = "library.devfile.io/plugin-override-from"
12+
parentOverrideAttribute = "library.devfile.io/parent-override-from"
13+
)
1214

13-
// addSourceAttributesForTemplateSpecContent adds an attribute 'library.devfile.io/imported-from=<source reference>'
15+
// addSourceAttributesForTemplateSpecContent adds an attribute 'library.devfile.io/parent-override-from=<source reference>'
1416
// to all elements of template spec content that support attributes.
1517
func addSourceAttributesForTemplateSpecContent(sourceImportReference v1.ImportReference, template *v1.DevWorkspaceTemplateSpecContent) {
1618
for idx, component := range template.Components {
1719
if component.Attributes == nil {
1820
template.Components[idx].Attributes = attributes.Attributes{}
1921
}
20-
template.Components[idx].Attributes.PutString(ImportSourceAttribute, resolveImportReference(sourceImportReference))
22+
template.Components[idx].Attributes.PutString(importSourceAttribute, resolveImportReference(sourceImportReference))
2123
}
2224
for idx, command := range template.Commands {
2325
if command.Attributes == nil {
2426
template.Commands[idx].Attributes = attributes.Attributes{}
2527
}
26-
template.Commands[idx].Attributes.PutString(ImportSourceAttribute, resolveImportReference(sourceImportReference))
28+
template.Commands[idx].Attributes.PutString(importSourceAttribute, resolveImportReference(sourceImportReference))
2729
}
2830
for idx, project := range template.Projects {
2931
if project.Attributes == nil {
3032
template.Projects[idx].Attributes = attributes.Attributes{}
3133
}
32-
template.Projects[idx].Attributes.PutString(ImportSourceAttribute, resolveImportReference(sourceImportReference))
34+
template.Projects[idx].Attributes.PutString(importSourceAttribute, resolveImportReference(sourceImportReference))
3335
}
3436
for idx, project := range template.StarterProjects {
3537
if project.Attributes == nil {
3638
template.StarterProjects[idx].Attributes = attributes.Attributes{}
3739
}
38-
template.StarterProjects[idx].Attributes.PutString(ImportSourceAttribute, resolveImportReference(sourceImportReference))
40+
template.StarterProjects[idx].Attributes.PutString(importSourceAttribute, resolveImportReference(sourceImportReference))
3941
}
4042
}
4143

@@ -46,51 +48,51 @@ func addSourceAttributesForParentOverride(sourceImportReference v1.ImportReferen
4648
if component.Attributes == nil {
4749
parentOverrides.Components[idx].Attributes = attributes.Attributes{}
4850
}
49-
parentOverrides.Components[idx].Attributes.PutString(ParentOverrideAttribute, resolveImportReference(sourceImportReference))
51+
parentOverrides.Components[idx].Attributes.PutString(parentOverrideAttribute, resolveImportReference(sourceImportReference))
5052
}
5153
for idx, command := range parentOverrides.Commands {
5254
if command.Attributes == nil {
5355
parentOverrides.Commands[idx].Attributes = attributes.Attributes{}
5456
}
55-
parentOverrides.Commands[idx].Attributes.PutString(ParentOverrideAttribute, resolveImportReference(sourceImportReference))
57+
parentOverrides.Commands[idx].Attributes.PutString(parentOverrideAttribute, resolveImportReference(sourceImportReference))
5658
}
5759
for idx, project := range parentOverrides.Projects {
5860
if project.Attributes == nil {
5961
parentOverrides.Projects[idx].Attributes = attributes.Attributes{}
6062
}
61-
parentOverrides.Projects[idx].Attributes.PutString(ParentOverrideAttribute, resolveImportReference(sourceImportReference))
63+
parentOverrides.Projects[idx].Attributes.PutString(parentOverrideAttribute, resolveImportReference(sourceImportReference))
6264
}
6365
for idx, project := range parentOverrides.StarterProjects {
6466
if project.Attributes == nil {
6567
parentOverrides.StarterProjects[idx].Attributes = attributes.Attributes{}
6668
}
67-
parentOverrides.StarterProjects[idx].Attributes.PutString(ParentOverrideAttribute, resolveImportReference(sourceImportReference))
69+
parentOverrides.StarterProjects[idx].Attributes.PutString(parentOverrideAttribute, resolveImportReference(sourceImportReference))
6870
}
6971

7072
}
7173

72-
// addSourceAttributesForPluginOverride adds an attribute 'library.devfile.io/imported-from=<source reference>'
74+
// addSourceAttributesForPluginOverride adds an attribute 'library.devfile.io/plugin-override-from=<source reference>'
7375
// to all elements of plugin override that support attributes.
7476
func addSourceAttributesForPluginOverride(sourceImportReference v1.ImportReference, pluginOverrides *v1.PluginOverrides) {
7577
for idx, component := range pluginOverrides.Components {
7678
if component.Attributes == nil {
7779
pluginOverrides.Components[idx].Attributes = attributes.Attributes{}
7880
}
79-
pluginOverrides.Components[idx].Attributes.PutString(PluginOverrideAttribute, resolveImportReference(sourceImportReference))
81+
pluginOverrides.Components[idx].Attributes.PutString(pluginOverrideAttribute, resolveImportReference(sourceImportReference))
8082
}
8183
for idx, command := range pluginOverrides.Commands {
8284
if command.Attributes == nil {
8385
pluginOverrides.Commands[idx].Attributes = attributes.Attributes{}
8486
}
85-
pluginOverrides.Commands[idx].Attributes.PutString(PluginOverrideAttribute, resolveImportReference(sourceImportReference))
87+
pluginOverrides.Commands[idx].Attributes.PutString(pluginOverrideAttribute, resolveImportReference(sourceImportReference))
8688
}
8789

8890
}
8991

90-
// AddSourceAttributesForOverrideAndMerge adds an attribute record the import reference to all elements of template that support attributes.
91-
func AddSourceAttributesForOverrideAndMerge(sourceImportReference v1.ImportReference, template interface{}) error {
92+
// addSourceAttributesForOverrideAndMerge adds an attribute record the import reference to all elements of template that support attributes.
93+
func addSourceAttributesForOverrideAndMerge(sourceImportReference v1.ImportReference, template interface{}) error {
9294
if template == nil {
93-
fmt.Errorf("cannot add source attributes to nil")
95+
return fmt.Errorf("cannot add source attributes to nil")
9496
}
9597

9698
mainContent, isMainContent := template.(*v1.DevWorkspaceTemplateSpecContent)
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
package parser
2+
3+
import (
4+
v1 "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
5+
"github.com/devfile/api/v2/pkg/attributes"
6+
"github.com/kylelemons/godebug/pretty"
7+
"reflect"
8+
"testing"
9+
)
10+
11+
func TestAddSourceAttributesForOverrideAndMerge(t *testing.T) {
12+
importReference := v1.ImportReference{
13+
ImportReferenceUnion: v1.ImportReferenceUnion{
14+
Uri: "127.0.0.1:8080",
15+
},
16+
}
17+
uriImportAttribute := attributes.Attributes{}.PutString(importSourceAttribute, resolveImportReference(importReference))
18+
pluginOverrideImportAttribute := attributes.Attributes{}.PutString(pluginOverrideAttribute, "main devfile")
19+
parentOverrideImportAttribute := attributes.Attributes{}.PutString(parentOverrideAttribute, "main devfile")
20+
21+
tests := []struct {
22+
name string
23+
wantErr bool
24+
importReference v1.ImportReference
25+
template interface{}
26+
wantResult interface{}
27+
}{
28+
{
29+
name: "should fail if template is nil",
30+
template: nil,
31+
wantErr: true,
32+
},
33+
{
34+
name: "should fail if template is a not support type",
35+
template: "invalid template",
36+
wantErr: true,
37+
},
38+
{
39+
name: "template is with type *DevWorkspaceTemplateSpecContent",
40+
importReference: importReference,
41+
template: &v1.DevWorkspaceTemplateSpecContent{
42+
Components: []v1.Component{
43+
{
44+
Name: "nodejs",
45+
ComponentUnion: v1.ComponentUnion{
46+
Container: &v1.ContainerComponent{
47+
Container: v1.Container{
48+
Image: "quay.io/nodejs-10",
49+
},
50+
},
51+
},
52+
},
53+
},
54+
},
55+
wantResult: &v1.DevWorkspaceTemplateSpecContent{
56+
Components: []v1.Component{
57+
{
58+
Attributes: uriImportAttribute,
59+
Name: "nodejs",
60+
ComponentUnion: v1.ComponentUnion{
61+
Container: &v1.ContainerComponent{
62+
Container: v1.Container{
63+
Image: "quay.io/nodejs-10",
64+
},
65+
},
66+
},
67+
},
68+
},
69+
},
70+
wantErr: false,
71+
},
72+
{
73+
name: "template is with type *PluginOverrides",
74+
importReference: v1.ImportReference{},
75+
template: &v1.PluginOverrides{
76+
Components: []v1.ComponentPluginOverride{
77+
{
78+
Name: "nodejs",
79+
ComponentUnionPluginOverride: v1.ComponentUnionPluginOverride{
80+
Container: &v1.ContainerComponentPluginOverride{
81+
ContainerPluginOverride: v1.ContainerPluginOverride{
82+
Image: "quay.io/nodejs-10",
83+
},
84+
},
85+
},
86+
},
87+
},
88+
},
89+
wantResult: &v1.PluginOverrides{
90+
Components: []v1.ComponentPluginOverride{
91+
{
92+
Name: "nodejs",
93+
Attributes: pluginOverrideImportAttribute,
94+
ComponentUnionPluginOverride: v1.ComponentUnionPluginOverride{
95+
Container: &v1.ContainerComponentPluginOverride{
96+
ContainerPluginOverride: v1.ContainerPluginOverride{
97+
Image: "quay.io/nodejs-10",
98+
},
99+
},
100+
},
101+
},
102+
},
103+
},
104+
wantErr: false,
105+
},
106+
{
107+
name: "template is with type *ParentOverrides",
108+
importReference: v1.ImportReference{},
109+
template: &v1.ParentOverrides{
110+
Components: []v1.ComponentParentOverride{
111+
{
112+
Name: "nodejs",
113+
ComponentUnionParentOverride: v1.ComponentUnionParentOverride{
114+
Container: &v1.ContainerComponentParentOverride{
115+
ContainerParentOverride: v1.ContainerParentOverride{
116+
Image: "quay.io/nodejs-10",
117+
},
118+
},
119+
},
120+
},
121+
},
122+
},
123+
wantResult: &v1.ParentOverrides{
124+
Components: []v1.ComponentParentOverride{
125+
{
126+
Name: "nodejs",
127+
Attributes: parentOverrideImportAttribute,
128+
ComponentUnionParentOverride: v1.ComponentUnionParentOverride{
129+
Container: &v1.ContainerComponentParentOverride{
130+
ContainerParentOverride: v1.ContainerParentOverride{
131+
Image: "quay.io/nodejs-10",
132+
},
133+
},
134+
},
135+
},
136+
},
137+
},
138+
wantErr: false,
139+
},
140+
}
141+
142+
for _, tt := range tests {
143+
t.Run(tt.name, func(t *testing.T) {
144+
err := addSourceAttributesForOverrideAndMerge(tt.importReference, tt.template)
145+
146+
if tt.wantErr == (err == nil) {
147+
t.Errorf("Test_AddSourceAttributesForOverrideAndMerge() error = %v, wantErr %v", err, tt.wantErr)
148+
return
149+
}
150+
151+
if err != nil {
152+
return
153+
}
154+
155+
if !reflect.DeepEqual(tt.template, tt.wantResult) {
156+
t.Errorf("wanted: %v, got: %v, difference at %v", tt.wantResult, tt.template, pretty.Compare(tt.template, tt.wantResult))
157+
}
158+
159+
})
160+
}
161+
162+
}

0 commit comments

Comments
 (0)