Skip to content

Commit a6c32fc

Browse files
authoredApr 13, 2023
update kubernetes/openshift endpoint validation (#1098)
* update endpoint validation Signed-off-by: Stephanie <[email protected]> * update unit test Signed-off-by: Stephanie <[email protected]> * update the test error check to be more clear Signed-off-by: Stephanie <[email protected]> * add unit test for two kube components Signed-off-by: Stephanie <[email protected]> --------- Signed-off-by: Stephanie <[email protected]>
1 parent 832b661 commit a6c32fc

File tree

4 files changed

+50
-13
lines changed

4 files changed

+50
-13
lines changed
 

Diff for: ‎pkg/validation/components.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ func ValidateComponents(components []v1alpha2.Component) (returnedErr error) {
149149
returnedErr = multierror.Append(returnedErr, resolveErrorMessageWithImportAttributes(err, component.Attributes))
150150
}
151151
}
152-
153-
err := validateEndpoints(component.Openshift.Endpoints, processedEndPointPort, processedEndPointName)
152+
currentComponentEndPointPort := make(map[int]bool)
153+
err := validateDuplicatedName(component.Openshift.Endpoints, processedEndPointName, currentComponentEndPointPort)
154154
if len(err) > 0 {
155155
for _, endpointErr := range err {
156156
returnedErr = multierror.Append(returnedErr, resolveErrorMessageWithImportAttributes(endpointErr, component.Attributes))
@@ -163,7 +163,8 @@ func ValidateComponents(components []v1alpha2.Component) (returnedErr error) {
163163
returnedErr = multierror.Append(returnedErr, resolveErrorMessageWithImportAttributes(err, component.Attributes))
164164
}
165165
}
166-
err := validateEndpoints(component.Kubernetes.Endpoints, processedEndPointPort, processedEndPointName)
166+
currentComponentEndPointPort := make(map[int]bool)
167+
err := validateDuplicatedName(component.Kubernetes.Endpoints, processedEndPointName, currentComponentEndPointPort)
167168
if len(err) > 0 {
168169
for _, endpointErr := range err {
169170
returnedErr = multierror.Append(returnedErr, resolveErrorMessageWithImportAttributes(endpointErr, component.Attributes))

Diff for: ‎pkg/validation/components_test.go

+34-8
Original file line numberDiff line numberDiff line change
@@ -327,11 +327,32 @@ func TestValidateComponents(t *testing.T) {
327327
wantErr: []string{sameTargetPortErr},
328328
},
329329
{
330-
name: "Invalid container with same target ports in a single component",
330+
name: "Valid container with same target ports in a single component",
331331
components: []v1alpha2.Component{
332332
generateDummyContainerComponent("name1", nil, []v1alpha2.Endpoint{endpointUrl18080, endpointUrl28080}, nil, v1alpha2.Annotation{}, false),
333333
},
334-
wantErr: []string{sameTargetPortErr},
334+
},
335+
{
336+
name: "Invalid Kube components with the same endpoint names",
337+
components: []v1alpha2.Component{
338+
generateDummyKubernetesComponent("name1", []v1alpha2.Endpoint{endpointUrl18080}, ""),
339+
generateDummyKubernetesComponent("name2", []v1alpha2.Endpoint{endpointUrl18081}, ""),
340+
},
341+
wantErr: []string{sameEndpointNameErr},
342+
},
343+
{
344+
name: "Valid Kube component with the same endpoint target ports as the container component's",
345+
components: []v1alpha2.Component{
346+
generateDummyContainerComponent("name1", nil, []v1alpha2.Endpoint{endpointUrl18080}, nil, v1alpha2.Annotation{}, false),
347+
generateDummyKubernetesComponent("name2", []v1alpha2.Endpoint{endpointUrl28080}, ""),
348+
},
349+
},
350+
{
351+
name: "Invalid Kube components with the same endpoint names",
352+
components: []v1alpha2.Component{
353+
generateDummyKubernetesComponent("name1", []v1alpha2.Endpoint{endpointUrl18080}, ""),
354+
generateDummyKubernetesComponent("name2", []v1alpha2.Endpoint{endpointUrl28080}, ""),
355+
},
335356
},
336357
{
337358
name: "Valid containers with valid resource requirement",
@@ -532,14 +553,19 @@ func TestValidateComponents(t *testing.T) {
532553
t.Run(tt.name, func(t *testing.T) {
533554
err := ValidateComponents(tt.components)
534555

535-
if merr, ok := err.(*multierror.Error); ok && tt.wantErr != nil {
536-
if assert.Equal(t, len(tt.wantErr), len(merr.Errors), "Error list length should match") {
537-
for i := 0; i < len(merr.Errors); i++ {
538-
assert.Regexp(t, tt.wantErr[i], merr.Errors[i].Error(), "Error message should match")
556+
merr, ok := err.(*multierror.Error)
557+
if ok {
558+
if tt.wantErr != nil {
559+
if assert.Equal(t, len(tt.wantErr), len(merr.Errors), "Error list length should match") {
560+
for i := 0; i < len(merr.Errors); i++ {
561+
assert.Regexp(t, tt.wantErr[i], merr.Errors[i].Error(), "Error message should match")
562+
}
539563
}
564+
} else {
565+
t.Errorf("Error should be nil, got %v", err)
540566
}
541-
} else {
542-
assert.Equal(t, nil, err, "Error should be nil")
567+
} else if tt.wantErr != nil {
568+
t.Errorf("Error should not be nil, want %v, got %v", tt.wantErr, err)
543569
}
544570
})
545571
}

Diff for: ‎pkg/validation/endpoints.go

+11-1
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,30 @@ import "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
1010
func validateEndpoints(endpoints []v1alpha2.Endpoint, processedEndPointPort map[int]bool, processedEndPointName map[string]bool) (errList []error) {
1111
currentComponentEndPointPort := make(map[int]bool)
1212

13+
errList = validateDuplicatedName(endpoints, processedEndPointName, currentComponentEndPointPort)
14+
portErrorList := validateDuplicatedPort(processedEndPointPort, currentComponentEndPointPort)
15+
errList = append(errList, portErrorList...)
16+
17+
return errList
18+
}
19+
20+
func validateDuplicatedName(endpoints []v1alpha2.Endpoint, processedEndPointName map[string]bool, currentComponentEndPointPort map[int]bool) (errList []error) {
1321
for _, endPoint := range endpoints {
1422
if _, ok := processedEndPointName[endPoint.Name]; ok {
1523
errList = append(errList, &InvalidEndpointError{name: endPoint.Name})
1624
}
1725
processedEndPointName[endPoint.Name] = true
1826
currentComponentEndPointPort[endPoint.TargetPort] = true
1927
}
28+
return errList
29+
}
2030

31+
func validateDuplicatedPort(processedEndPointPort map[int]bool, currentComponentEndPointPort map[int]bool) (errList []error) {
2132
for targetPort := range currentComponentEndPointPort {
2233
if _, ok := processedEndPointPort[targetPort]; ok {
2334
errList = append(errList, &InvalidEndpointError{port: targetPort})
2435
}
2536
processedEndPointPort[targetPort] = true
2637
}
27-
2838
return errList
2939
}

Diff for: ‎pkg/validation/validation-rule.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ The validation will be done as part of schema validation, the rule will be intro
1414

1515
### Endpoints:
1616
- all the endpoint names are unique across components
17-
- endpoint ports must be unique across components -- two components cannot have the same target port, but one component may have two endpoints with the same target port. This restriction does not apply to container components with `dedicatedPod` set to `true`.
17+
- endpoint ports must be unique across container components -- two container components cannot have the same target port, but one container component may have two endpoints with the same target port. This restriction does not apply to container components with `dedicatedPod` set to `true`.
1818

1919

2020
### Commands:

0 commit comments

Comments
 (0)
Please sign in to comment.