Skip to content

Commit 23bfa5c

Browse files
Merge pull request #29 from PDOK/jd/aliasses
Added IngressRouteURLs
2 parents 60f514b + a44b0d7 commit 23bfa5c

File tree

5 files changed

+217
-1
lines changed

5 files changed

+217
-1
lines changed

api/v1/zz_generated.deepcopy.go

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

model/ingress_route_urls.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package model
2+
3+
// IngressRouteURLs
4+
// +kubebuilder:validation:MinItems:=1
5+
// Without maxItems x-kubernetes-validation complains about an exceeded computation budget as the list can grow infinitely in theory
6+
// +kubebuilder:validation:MaxItems:=30
7+
type IngressRouteURLs []IngressRouteURL
8+
9+
type IngressRouteURL struct {
10+
URL URL `json:"url"`
11+
}

model/zz_generated.deepcopy.go

Lines changed: 37 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package validation
2+
3+
import (
4+
"fmt"
5+
"github.com/pdok/smooth-operator/model"
6+
"k8s.io/apimachinery/pkg/util/validation/field"
7+
)
8+
9+
func ValidateIngressRouteURLsContainsBaseURL(urls model.IngressRouteURLs, baseURL model.URL, path *field.Path) *field.Error {
10+
if path == nil {
11+
path = field.NewPath("spec").Child("ingressRouteUrls")
12+
}
13+
14+
if len(urls) == 0 {
15+
return nil
16+
}
17+
18+
for _, url := range urls {
19+
if url.URL.String() == baseURL.String() {
20+
return nil
21+
}
22+
}
23+
24+
return field.Invalid(path, urls, fmt.Sprintf("must contain baseURL: %s", baseURL))
25+
}
26+
27+
func ValidateIngressRouteURLsNotRemoved(oldURLs, newURLs model.IngressRouteURLs, allErrs *field.ErrorList, path *field.Path) {
28+
if path == nil {
29+
path = field.NewPath("spec").Child("ingressRouteUrls")
30+
}
31+
32+
for _, url := range oldURLs {
33+
s := url.URL.String()
34+
found := false
35+
36+
for _, newURL := range newURLs {
37+
if newURL.URL.String() == s {
38+
found = true
39+
break
40+
}
41+
}
42+
43+
if !found {
44+
*allErrs = append(*allErrs, field.Invalid(path, newURLs, fmt.Sprintf("urls cannot be removed: %s", url)))
45+
}
46+
}
47+
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package validation
2+
3+
import (
4+
"github.com/pdok/smooth-operator/model"
5+
"github.com/stretchr/testify/assert"
6+
"k8s.io/apimachinery/pkg/util/validation/field"
7+
"testing"
8+
)
9+
10+
func TestURLsContainsBaseURL(t *testing.T) {
11+
URL1, _ := model.ParseURL("http://test.com/test")
12+
URL2, _ := model.ParseURL("http://test.com/other")
13+
URL3, _ := model.ParseURL("http://test.com/other/path")
14+
type args struct {
15+
urls model.IngressRouteURLs
16+
baseURL model.URL
17+
}
18+
tests := []struct {
19+
name string
20+
args args
21+
wantErr bool
22+
}{
23+
{
24+
name: "Contains BaseURL",
25+
args: args{
26+
urls: model.IngressRouteURLs{{URL: model.URL{URL: URL1}}, {URL: model.URL{URL: URL2}}},
27+
baseURL: model.URL{URL: URL1},
28+
},
29+
wantErr: false,
30+
},
31+
{
32+
name: "Does not contain BaseURL",
33+
args: args{
34+
urls: model.IngressRouteURLs{{URL: model.URL{URL: URL1}}, {URL: model.URL{URL: URL2}}},
35+
baseURL: model.URL{URL: URL3},
36+
},
37+
wantErr: true,
38+
},
39+
{
40+
name: "No ingressRouteURLs",
41+
args: args{
42+
urls: model.IngressRouteURLs{},
43+
baseURL: model.URL{URL: URL3},
44+
},
45+
wantErr: false,
46+
},
47+
}
48+
for _, tt := range tests {
49+
t.Run(tt.name, func(t *testing.T) {
50+
err := ValidateIngressRouteURLsContainsBaseURL(tt.args.urls, tt.args.baseURL, nil)
51+
if tt.wantErr {
52+
assert.NotEmpty(t, err)
53+
} else {
54+
assert.Empty(t, err)
55+
}
56+
})
57+
}
58+
}
59+
60+
func TestURLsNotRemoved(t *testing.T) {
61+
URL1, _ := model.ParseURL("http://test.com/test")
62+
URL2, _ := model.ParseURL("http://test.com/other")
63+
URL3, _ := model.ParseURL("http://test.com/other/path")
64+
type args struct {
65+
old model.IngressRouteURLs
66+
new model.IngressRouteURLs
67+
}
68+
tests := []struct {
69+
name string
70+
args args
71+
wantErr bool
72+
}{
73+
{
74+
name: "Same set",
75+
args: args{
76+
old: model.IngressRouteURLs{{URL: model.URL{URL: URL1}}, {URL: model.URL{URL: URL2}}},
77+
new: model.IngressRouteURLs{{URL: model.URL{URL: URL1}}, {URL: model.URL{URL: URL2}}},
78+
},
79+
wantErr: false,
80+
},
81+
{
82+
name: "Same set (both empty)",
83+
args: args{
84+
old: model.IngressRouteURLs{},
85+
new: model.IngressRouteURLs{},
86+
},
87+
wantErr: false,
88+
},
89+
{
90+
name: "One URL removed",
91+
args: args{
92+
old: model.IngressRouteURLs{{URL: model.URL{URL: URL1}}, {URL: model.URL{URL: URL2}}},
93+
new: model.IngressRouteURLs{{URL: model.URL{URL: URL1}}},
94+
},
95+
wantErr: true,
96+
},
97+
{
98+
name: "One URL added",
99+
args: args{
100+
old: model.IngressRouteURLs{{URL: model.URL{URL: URL1}}, {URL: model.URL{URL: URL2}}},
101+
new: model.IngressRouteURLs{{URL: model.URL{URL: URL1}}, {URL: model.URL{URL: URL2}}, {URL: model.URL{URL: URL3}}},
102+
},
103+
wantErr: false,
104+
},
105+
}
106+
for _, tt := range tests {
107+
t.Run(tt.name, func(t *testing.T) {
108+
allErrs := field.ErrorList{}
109+
ValidateIngressRouteURLsNotRemoved(tt.args.old, tt.args.new, &allErrs, nil)
110+
if tt.wantErr {
111+
assert.NotEmpty(t, allErrs)
112+
} else {
113+
assert.Empty(t, allErrs)
114+
}
115+
})
116+
}
117+
}

0 commit comments

Comments
 (0)