Skip to content

Commit ef20f88

Browse files
committed
test,e2e: CUDN CRD CEL validation tests
Introduce tests for CUDN CRD CEL validations, consist of two tests: 1. Positive test verifies various valid CRs created successfully. Apply the YAMLs defined in "test/e2e/testdata/cudn" Expect no error to have occurred. 2. Negative test verifies invalid CRs get rejected by the API server. Apply the YAMLs defined in "test/e2e/testdata/cudn" Expect failure with the expected error. Signed-off-by: Or Mergi <[email protected]>
1 parent a59d8f9 commit ef20f88

9 files changed

+920
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package e2e
2+
3+
import (
4+
. "github.com/onsi/ginkgo/v2"
5+
. "github.com/onsi/gomega"
6+
7+
e2ekubectl "k8s.io/kubernetes/test/e2e/framework/kubectl"
8+
9+
"github.com/ovn-org/ovn-kubernetes/test/e2e/testdata"
10+
testdatacudn "github.com/ovn-org/ovn-kubernetes/test/e2e/testdata/cudn"
11+
)
12+
13+
var _ = Describe("Network Segmentation: API validations", func() {
14+
DescribeTable("api-server should reject invalid CRs",
15+
func(scenarios []testdata.ValidateCRScenario) {
16+
DeferCleanup(func() {
17+
cleanupValidateCRsTest(scenarios)
18+
})
19+
for _, s := range scenarios {
20+
By(s.Description)
21+
_, stderr, err := runKubectlInputWithFullOutput("", s.Manifest, "create", "-f", "-")
22+
Expect(err).To(HaveOccurred(), "should fail to create invalid CR")
23+
Expect(stderr).To(ContainSubstring(s.ExpectedErr))
24+
}
25+
},
26+
Entry("ClusterUserDefinedNetwork, mismatch topology and config", testdatacudn.MismatchTopologyConfig),
27+
Entry("ClusterUserDefinedNetwork, localnet, invalid role", testdatacudn.LocalnetInvalidRole),
28+
Entry("ClusterUserDefinedNetwork, localnet, invalid physicalNetworkName", testdatacudn.LocalnetInvalidPhyNetName),
29+
Entry("ClusterUserDefinedNetwork, localnet, invalid subnets", testdatacudn.LocalnetInvalidSubnets),
30+
Entry("ClusterUserDefinedNetwork, localnet, invalid mtu", testdatacudn.LocalnetInvalidMTU),
31+
Entry("ClusterUserDefinedNetwork, localnet, invalid vlan", testdatacudn.LocalnetInvalidVLAN),
32+
)
33+
34+
DescribeTable("api-server should accept valid CRs",
35+
func(scenarios []testdata.ValidateCRScenario) {
36+
DeferCleanup(func() {
37+
cleanupValidateCRsTest(scenarios)
38+
})
39+
for _, s := range scenarios {
40+
By(s.Description)
41+
_, err := e2ekubectl.RunKubectlInput("", s.Manifest, "apply", "-f", "-")
42+
Expect(err).NotTo(HaveOccurred(), "should create valid CR successfully")
43+
}
44+
},
45+
Entry("ClusterUserDefinedNetwork, localnet", testdatacudn.LocalnetValid),
46+
)
47+
})
48+
49+
// runKubectlInputWithFullOutput is a convenience wrapper over kubectlBuilder that takes input to stdin
50+
// It will also return the command's stderr.
51+
func runKubectlInputWithFullOutput(namespace string, data string, args ...string) (string, string, error) {
52+
return e2ekubectl.NewKubectlCommand(namespace, args...).WithStdinData(data).ExecWithFullOutput()
53+
}
54+
55+
func cleanupValidateCRsTest(scenarios []testdata.ValidateCRScenario) {
56+
for _, s := range scenarios {
57+
e2ekubectl.RunKubectlInput("", s.Manifest, "delete", "-f", "-")
58+
}
59+
_, stderr, err := e2ekubectl.RunKubectlWithFullOutput("", "get", "clusteruserdefinednetworks")
60+
Expect(err).NotTo(HaveOccurred())
61+
Expect(stderr).To(Equal("No resources found\n"))
62+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package cudn
2+
3+
import "github.com/ovn-org/ovn-kubernetes/test/e2e/testdata"
4+
5+
var LocalnetInvalidMTU = []testdata.ValidateCRScenario{
6+
{
7+
Description: "invalid MTU - higher than 65536",
8+
ExpectedErr: `spec.network.localnet.mtu in body should be less than or equal to 65536`,
9+
Manifest: `
10+
apiVersion: k8s.ovn.org/v1
11+
kind: ClusterUserDefinedNetwork
12+
metadata:
13+
name: localnet-mtu-exceed-max-ipam-disabled-fail
14+
spec:
15+
namespaceSelector: {matchLabels: {kubernetes.io/metadata.name: red}}
16+
network:
17+
topology: Localnet
18+
localnet:
19+
role: Secondary
20+
physicalNetworkName: test
21+
mtu: 65537
22+
ipam: {mode: Disabled}
23+
`,
24+
},
25+
{
26+
Description: "invalid MTU - lower than 576",
27+
ExpectedErr: `spec.network.localnet.mtu in body should be greater than or equal to 576`,
28+
Manifest: `
29+
apiVersion: k8s.ovn.org/v1
30+
kind: ClusterUserDefinedNetwork
31+
metadata:
32+
name: localnet-ipv4-mtu-below-min-fail
33+
spec:
34+
namespaceSelector: {matchLabels: {kubernetes.io/metadata.name: red}}
35+
network:
36+
topology: Localnet
37+
localnet:
38+
role: Secondary
39+
physicalNetworkName: test
40+
subnets: [10.0.0.0/24]
41+
mtu: 575
42+
`,
43+
},
44+
{
45+
Description: "invalid MTU - when IPv6 subnet is set, should be at least 1280",
46+
ExpectedErr: `MTU should be greater than or equal to 1280 when an IPv6 subnet is used`,
47+
Manifest: `
48+
apiVersion: k8s.ovn.org/v1
49+
kind: ClusterUserDefinedNetwork
50+
metadata:
51+
name: localnet-ipv6-mtu-below-min-fail
52+
spec:
53+
namespaceSelector: {matchLabels: {kubernetes.io/metadata.name: red}}
54+
network:
55+
topology: Localnet
56+
localnet:
57+
role: Secondary
58+
physicalNetworkName: test
59+
subnets: [2001:dbb::/64]
60+
mtu: 1279
61+
`,
62+
},
63+
{
64+
Description: "invalid MTU - when dualstack subnet is set, should be at least 1280",
65+
ExpectedErr: `MTU should be greater than or equal to 1280 when an IPv6 subnet is used`,
66+
Manifest: `
67+
apiVersion: k8s.ovn.org/v1
68+
kind: ClusterUserDefinedNetwork
69+
metadata:
70+
name: localnet-dualstack-mtu-below-min-fail
71+
spec:
72+
namespaceSelector: {matchLabels: {kubernetes.io/metadata.name: red}}
73+
network:
74+
topology: Localnet
75+
localnet:
76+
role: Secondary
77+
physicalNetworkName: test
78+
subnets: [192.168.0.0/16, 2001:dbb::/64]
79+
mtu: 1279
80+
`,
81+
},
82+
}
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
package cudn
2+
3+
import "github.com/ovn-org/ovn-kubernetes/test/e2e/testdata"
4+
5+
var LocalnetInvalidPhyNetName = []testdata.ValidateCRScenario{
6+
{
7+
Description: "unset PhysicalNetworkName",
8+
ExpectedErr: `spec.network.localnet.physicalNetworkName: Required value`,
9+
Manifest: `
10+
apiVersion: k8s.ovn.org/v1
11+
kind: ClusterUserDefinedNetwork
12+
metadata:
13+
name: localnet-phynetname-unset-fail
14+
spec:
15+
namespaceSelector: {matchLabels: {kubernetes.io/metadata.name: red}}
16+
network:
17+
topology: Localnet
18+
localnet:
19+
role: Secondary
20+
subnets: [10.0.0.0/24]`,
21+
},
22+
{
23+
Description: "invalid PhysicalNetworkName - empty string",
24+
ExpectedErr: `spec.network.localnet.physicalNetworkName in body should be at least 1 chars long`,
25+
Manifest: `
26+
apiVersion: k8s.ovn.org/v1
27+
kind: ClusterUserDefinedNetwork
28+
metadata:
29+
name: localnet-invalid-phynetname-empty-string-fail
30+
spec:
31+
namespaceSelector: {matchLabels: {kubernetes.io/metadata.name: red}}
32+
network:
33+
topology: Localnet
34+
localnet:
35+
role: Secondary
36+
physicalNetworkName: ""
37+
subnets: [10.0.0.0/24]`,
38+
},
39+
{
40+
Description: "invalid PhysicalNetworkName - too long",
41+
ExpectedErr: `spec.network.localnet.physicalNetworkName: Too long: may not be more than 253 bytes`,
42+
Manifest: `
43+
apiVersion: k8s.ovn.org/v1
44+
kind: ClusterUserDefinedNetwork
45+
metadata:
46+
name: localnet-invalid-phynetname-exceed-253-chars-fail
47+
spec:
48+
namespaceSelector: {matchLabels: {kubernetes.io/metadata.name: red}}
49+
network:
50+
topology: Localnet
51+
localnet:
52+
role: Secondary
53+
physicalNetworkName: "ycx7b6dhkhytzva3wrma0cu6mjhqpo2ty20cmpdg9ptvmt1mo9dfnrs56nr0bvg6z6zha5y208js6e2iwk6xb97sp2sojg48lu9d5vxbzzq40rwj1wchae3ju3dpj6qfsjbzjzmc0k489bloe49z4857kds43rqpeca3p5z2dfz562qu59qqb8qa3vo6pmwuaume581dqhlsz57yvbvgu5hmmmzremac7w7l4rmuirkk91767llw0vskanlc33"
54+
subnets: [10.0.0.0/24]`,
55+
},
56+
{
57+
Description: "invalid PhysicalNetworkName - contain `:` chars",
58+
ExpectedErr: "physicalNetworkName cannot contain `,` or `:` characters",
59+
Manifest: `
60+
apiVersion: k8s.ovn.org/v1
61+
kind: ClusterUserDefinedNetwork
62+
metadata:
63+
name: localnet-invalid-phynetname-has-colon-fail
64+
spec:
65+
namespaceSelector: {matchLabels: {kubernetes.io/metadata.name: red}}
66+
network:
67+
topology: Localnet
68+
localnet:
69+
role: Secondary
70+
physicalNetworkName: "t:est"
71+
subnets: [10.0.0.0/24]`,
72+
},
73+
{
74+
Description: "invalid PhysicalNetworkName - contain `,` chars",
75+
ExpectedErr: "physicalNetworkName cannot contain `,` or `:` characters",
76+
Manifest: `
77+
apiVersion: k8s.ovn.org/v1
78+
kind: ClusterUserDefinedNetwork
79+
metadata:
80+
name: localnet-invalid-phynetname-has-comma-fail
81+
spec:
82+
namespaceSelector: {matchLabels: {kubernetes.io/metadata.name: red}}
83+
network:
84+
topology: Localnet
85+
localnet:
86+
role: Secondary
87+
physicalNetworkName: "tes,t"
88+
subnets: [10.0.0.0/24]
89+
`,
90+
},
91+
{
92+
Description: "invalid PhysicalNetworkName - start with `:` char",
93+
ExpectedErr: "physicalNetworkName cannot contain `,` or `:` characters",
94+
Manifest: `
95+
apiVersion: k8s.ovn.org/v1
96+
kind: ClusterUserDefinedNetwork
97+
metadata:
98+
name: localnet-invalid-phynetname-start-with-colon-fail
99+
spec:
100+
namespaceSelector: {matchLabels: {kubernetes.io/metadata.name: red}}
101+
network:
102+
topology: Localnet
103+
localnet:
104+
role: Secondary
105+
physicalNetworkName: ":test"
106+
subnets: [10.0.0.0/24]
107+
`,
108+
},
109+
{
110+
Description: "invalid PhysicalNetworkName - start with `,` char",
111+
Manifest: `
112+
apiVersion: k8s.ovn.org/v1
113+
kind: ClusterUserDefinedNetwork
114+
metadata:
115+
name: localnet-invalid-phynetname-start-with-comma-fail
116+
spec:
117+
namespaceSelector: {matchLabels: {kubernetes.io/metadata.name: red}}
118+
network:
119+
topology: Localnet
120+
localnet:
121+
role: Secondary
122+
physicalNetworkName: ",test"
123+
subnets: [10.0.0.0/24]
124+
`,
125+
ExpectedErr: "physicalNetworkName cannot contain `,` or `:` characters",
126+
},
127+
{
128+
Description: "invalid PhysicalNetworkName - ends with `:` char",
129+
ExpectedErr: "physicalNetworkName cannot contain `,` or `:` characters",
130+
Manifest: `
131+
apiVersion: k8s.ovn.org/v1
132+
kind: ClusterUserDefinedNetwork
133+
metadata:
134+
name: localnet-invalid-phynetname-end-with-colon-fail
135+
spec:
136+
namespaceSelector: {matchLabels: {kubernetes.io/metadata.name: red}}
137+
network:
138+
topology: Localnet
139+
localnet:
140+
role: Secondary
141+
physicalNetworkName: "test:"
142+
subnets: [10.0.0.0/24]`,
143+
},
144+
{
145+
Description: "invalid PhysicalNetworkName - ends with `,` char",
146+
ExpectedErr: "physicalNetworkName cannot contain `,` or `:` characters",
147+
Manifest: `
148+
apiVersion: k8s.ovn.org/v1
149+
kind: ClusterUserDefinedNetwork
150+
metadata:
151+
name: localnet-invalid-phynetname-end-with-comma-fail
152+
spec:
153+
namespaceSelector: {matchLabels: {kubernetes.io/metadata.name: red}}
154+
network:
155+
topology: Localnet
156+
localnet:
157+
role: Secondary
158+
physicalNetworkName: "test,"
159+
subnets: [10.0.0.0/24]`,
160+
},
161+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package cudn
2+
3+
import "github.com/ovn-org/ovn-kubernetes/test/e2e/testdata"
4+
5+
var LocalnetInvalidRole = []testdata.ValidateCRScenario{
6+
{
7+
Description: "role unset",
8+
ExpectedErr: `spec.network.localnet.role: Required value`,
9+
Manifest: `
10+
apiVersion: k8s.ovn.org/v1
11+
kind: ClusterUserDefinedNetwork
12+
metadata:
13+
name: localnet-role-unset-should-fail
14+
spec:
15+
namespaceSelector: {matchLabels: {kubernetes.io/metadata.name: red}}
16+
network:
17+
topology: Localnet
18+
localnet:
19+
physicalNetworkName: test
20+
subnets: [10.0.0.0/24]`,
21+
},
22+
{
23+
Description: "role is primary",
24+
ExpectedErr: `spec.network.localnet.role: Unsupported value: "Primary": supported values: "Secondary"`,
25+
Manifest: `
26+
---
27+
apiVersion: k8s.ovn.org/v1
28+
kind: ClusterUserDefinedNetwork
29+
metadata:
30+
name: localnet-role-primary-should-fail
31+
spec:
32+
namespaceSelector: {matchLabels: {kubernetes.io/metadata.name: red}}
33+
network:
34+
topology: Localnet
35+
localnet:
36+
role: Primary
37+
physicalNetworkName: test
38+
subnets: [10.0.0.0/24]`,
39+
},
40+
}

0 commit comments

Comments
 (0)