Skip to content

Commit 6b8fc2d

Browse files
authored
Merge pull request #5348 from jcaamano/vrf-lite-e2e
Add VRF-Lite e2e test cases
2 parents 8fadf90 + 6c4bc78 commit 6b8fc2d

38 files changed

+1703
-189
lines changed

dist/templates/ovn-setup.yaml.j2

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@ spec:
8989
networkSelectors:
9090
- networkSelectionType: DefaultNetwork
9191
nodeSelector: {}
92-
frrConfigurationSelector: {}
92+
frrConfigurationSelector:
93+
matchLabels:
94+
name: receive-all
9395
advertisements:
9496
- "PodNetwork"
9597
{%- endif %}

go-controller/pkg/clustermanager/routeadvertisements/controller.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -951,10 +951,18 @@ func (c *Controller) updateRAStatus(ra *ratypes.RouteAdvertisements, hadUpdates
951951
return nil
952952
}
953953

954+
var updateStatus bool
954955
condition := meta.FindStatusCondition(ra.Status.Conditions, "Accepted")
955-
updateStatus := hadUpdates || condition == nil || condition.ObservedGeneration != ra.Generation
956-
updateStatus = updateStatus || err != nil
957-
956+
switch {
957+
case condition == nil:
958+
fallthrough
959+
case condition.ObservedGeneration != ra.Generation:
960+
fallthrough
961+
case (err == nil) != (condition.Status == metav1.ConditionTrue):
962+
fallthrough
963+
case hadUpdates:
964+
updateStatus = true
965+
}
958966
if !updateStatus {
959967
return nil
960968
}

go-controller/pkg/clustermanager/routeadvertisements/controller_test.go

Lines changed: 52 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ type testRA struct {
4747
SelectsDefault bool
4848
AdvertisePods bool
4949
AdvertiseEgressIPs bool
50+
Status *metav1.ConditionStatus
5051
}
5152

5253
func (tra testRA) RouteAdvertisements() *ratypes.RouteAdvertisements {
@@ -92,6 +93,9 @@ func (tra testRA) RouteAdvertisements() *ratypes.RouteAdvertisements {
9293
MatchLabels: tra.FRRConfigurationSelector,
9394
}
9495
}
96+
if tra.Status != nil {
97+
ra.Status.Conditions = []metav1.Condition{{Type: "Accepted", Status: *tra.Status}}
98+
}
9599
return ra
96100
}
97101

@@ -776,6 +780,38 @@ func TestController_reconcile(t *testing.T) {
776780
},
777781
expectNADAnnotations: map[string]map[string]string{"default": {types.OvnRouteAdvertisementsKey: "[\"ra\"]"}, "red": {types.OvnRouteAdvertisementsKey: "[\"ra\"]"}},
778782
},
783+
{
784+
name: "reconciles RouteAdvertisements status even when no other updates are required",
785+
ra: &testRA{Name: "ra", AdvertisePods: true, AdvertiseEgressIPs: true, SelectsDefault: true, Status: ptr.To(metav1.ConditionFalse)},
786+
frrConfigs: []*testFRRConfig{
787+
{
788+
Name: "frrConfig",
789+
Namespace: frrNamespace,
790+
Routers: []*testRouter{
791+
{ASN: 1, Prefixes: []string{"1.1.1.0/24"}, Neighbors: []*testNeighbor{
792+
{ASN: 1, Address: "1.0.0.100"},
793+
}},
794+
},
795+
},
796+
{
797+
Labels: map[string]string{types.OvnRouteAdvertisementsKey: "ra"},
798+
Annotations: map[string]string{types.OvnRouteAdvertisementsKey: "ra/frrConfig/node"},
799+
NodeSelector: map[string]string{"kubernetes.io/hostname": "node"},
800+
Routers: []*testRouter{
801+
{ASN: 1, Prefixes: []string{"1.0.1.1/32", "1.1.0.0/24"}, Neighbors: []*testNeighbor{
802+
{ASN: 1, Address: "1.0.0.100", Advertise: []string{"1.0.1.1/32", "1.1.0.0/24"}, Receive: []string{"1.1.0.0/16/24"}},
803+
}},
804+
},
805+
},
806+
},
807+
nads: []*testNAD{
808+
{Name: "default", Namespace: "ovn-kubernetes", Network: "default", Annotations: map[string]string{types.OvnRouteAdvertisementsKey: "[\"ra\"]"}},
809+
},
810+
nodes: []*testNode{{Name: "node", SubnetsAnnotation: "{\"default\":\"1.1.0.0/24\"}"}},
811+
eips: []*testEIP{{Name: "eip", EIPs: map[string]string{"node": "1.0.1.1"}}},
812+
reconcile: "ra",
813+
expectAcceptedStatus: metav1.ConditionTrue,
814+
},
779815
{
780816
name: "fails to reconcile a secondary network",
781817
ra: &testRA{Name: "ra", AdvertisePods: true, NetworkSelector: map[string]string{"selected": "true"}},
@@ -1005,11 +1041,6 @@ func TestController_reconcile(t *testing.T) {
10051041

10061042
c := NewController(nm.Interface(), wf, fakeClientset)
10071043

1008-
// prime the default network NAD
1009-
if defaultNAD == nil {
1010-
defaultNAD, err = c.getOrCreateDefaultNetworkNAD()
1011-
g.Expect(err).ToNot(gomega.HaveOccurred())
1012-
}
10131044
// prime the default network NAD namespace
10141045
namespace := &corev1.Namespace{
10151046
ObjectMeta: metav1.ObjectMeta{
@@ -1018,11 +1049,15 @@ func TestController_reconcile(t *testing.T) {
10181049
}
10191050
_, err = fakeClientset.KubeClient.CoreV1().Namespaces().Create(context.Background(), namespace, metav1.CreateOptions{})
10201051
g.Expect(err).ToNot(gomega.HaveOccurred())
1021-
1022-
// update it with the annotation that network manager would set
1023-
defaultNAD.Annotations = map[string]string{types.OvnNetworkNameAnnotation: types.DefaultNetworkName}
1024-
_, err = fakeClientset.NetworkAttchDefClient.K8sCniCncfIoV1().NetworkAttachmentDefinitions(defaultNAD.Namespace).Update(context.Background(), defaultNAD, metav1.UpdateOptions{})
1025-
g.Expect(err).ToNot(gomega.HaveOccurred())
1052+
// prime the default network NAD
1053+
if defaultNAD == nil {
1054+
defaultNAD, err = c.getOrCreateDefaultNetworkNAD()
1055+
g.Expect(err).ToNot(gomega.HaveOccurred())
1056+
// update it with the annotation that network manager would set
1057+
defaultNAD.Annotations = map[string]string{types.OvnNetworkNameAnnotation: types.DefaultNetworkName}
1058+
_, err = fakeClientset.NetworkAttchDefClient.K8sCniCncfIoV1().NetworkAttachmentDefinitions(defaultNAD.Namespace).Update(context.Background(), defaultNAD, metav1.UpdateOptions{})
1059+
g.Expect(err).ToNot(gomega.HaveOccurred())
1060+
}
10261061

10271062
err = wf.Start()
10281063
g.Expect(err).ToNot(gomega.HaveOccurred())
@@ -1039,7 +1074,13 @@ func TestController_reconcile(t *testing.T) {
10391074
)
10401075

10411076
err = nm.Start()
1042-
g.Expect(err).ToNot(gomega.HaveOccurred())
1077+
// some test cases start with a bad RA status, avoid asserting
1078+
// initial sync in this case as it will fail
1079+
if tt.ra == nil || tt.ra.Status == nil || *tt.ra.Status == metav1.ConditionTrue {
1080+
g.Expect(err).ToNot(gomega.HaveOccurred())
1081+
} else {
1082+
g.Expect(err).To(gomega.HaveOccurred())
1083+
}
10431084
// we just need the inital sync
10441085
nm.Stop()
10451086

test/e2e/deploymentconfig/api/api.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package api
44
// Remove when OVN-Kubernetes exposes its config via an API.
55
type DeploymentConfig interface {
66
OVNKubernetesNamespace() string
7+
FRRK8sNamespace() string
78
ExternalBridgeName() string
89
PrimaryInterfaceName() string
910
}

test/e2e/deploymentconfig/configs/kind/kind.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ func (k kind) OVNKubernetesNamespace() string {
3333
return "ovn-kubernetes"
3434
}
3535

36+
func (k kind) FRRK8sNamespace() string {
37+
return "frr-k8s-system"
38+
}
39+
3640
func (k kind) ExternalBridgeName() string {
3741
return "breth0"
3842
}

test/e2e/e2e.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -712,7 +712,7 @@ var _ = ginkgo.Describe("e2e control plane", func() {
712712
}
713713
secondaryExternalContainerPort := infraprovider.Get().GetExternalContainerPort()
714714
secondaryExternalContainerSpec := infraapi.ExternalContainer{Name: "e2e-ovn-k", Image: images.AgnHost(),
715-
Network: secondaryProviderNetwork, Args: getAgnHostHTTPPortBindCMDArgs(secondaryExternalContainerPort), ExtPort: secondaryExternalContainerPort}
715+
Network: secondaryProviderNetwork, CmdArgs: getAgnHostHTTPPortBindCMDArgs(secondaryExternalContainerPort), ExtPort: secondaryExternalContainerPort}
716716
ginkgo.By("creating container on secondary provider network")
717717
secondaryExternalContainer, err = providerCtx.CreateExternalContainer(secondaryExternalContainerSpec)
718718
framework.ExpectNoError(err, "failed to create external container")
@@ -1275,7 +1275,7 @@ var _ = ginkgo.Describe("e2e ingress traffic validation", func() {
12751275
framework.ExpectNoError(err, "failed to get primary network")
12761276
externalContainerPort := infraprovider.Get().GetExternalContainerPort()
12771277
externalContainer = infraapi.ExternalContainer{Name: "e2e-ingress", Image: images.AgnHost(), Network: primaryProviderNetwork,
1278-
Args: getAgnHostHTTPPortBindCMDArgs(externalContainerPort), ExtPort: externalContainerPort}
1278+
CmdArgs: getAgnHostHTTPPortBindCMDArgs(externalContainerPort), ExtPort: externalContainerPort}
12791279
externalContainer, err = providerCtx.CreateExternalContainer(externalContainer)
12801280
framework.ExpectNoError(err, "failed to create external service", externalContainer.String())
12811281
})
@@ -1672,7 +1672,7 @@ var _ = ginkgo.Describe("e2e ingress traffic validation", func() {
16721672
framework.ExpectNoError(err, "failed to get primary network")
16731673
externalContainerPort := infraprovider.Get().GetExternalContainerPort()
16741674
externalContainer = infraapi.ExternalContainer{Name: "e2e-ingress-add-more", Image: images.AgnHost(), Network: primaryProviderNetwork,
1675-
Args: getAgnHostHTTPPortBindCMDArgs(externalContainerPort), ExtPort: externalContainerPort}
1675+
CmdArgs: getAgnHostHTTPPortBindCMDArgs(externalContainerPort), ExtPort: externalContainerPort}
16761676
externalContainer, err = providerCtx.CreateExternalContainer(externalContainer)
16771677
framework.ExpectNoError(err, "external container %s must be created successfully", externalContainer.Name)
16781678

@@ -1834,7 +1834,7 @@ var _ = ginkgo.Describe("e2e ingress to host-networked pods traffic validation",
18341834
framework.ExpectNoError(err, "failed to get primary network")
18351835
externalContainerPort := infraprovider.Get().GetExternalContainerPort()
18361836
externalContainer = infraapi.ExternalContainer{Name: clientContainerName, Image: images.AgnHost(), Network: primaryProviderNetwork,
1837-
Args: getAgnHostHTTPPortBindCMDArgs(externalContainerPort), ExtPort: externalContainerPort}
1837+
CmdArgs: getAgnHostHTTPPortBindCMDArgs(externalContainerPort), ExtPort: externalContainerPort}
18381838
externalContainer, err = providerCtx.CreateExternalContainer(externalContainer)
18391839
framework.ExpectNoError(err, "external container %s must be created successfully", externalContainer.Name)
18401840
})
@@ -1943,7 +1943,7 @@ var _ = ginkgo.Describe("e2e br-int flow monitoring export validation", func() {
19431943
primaryProviderNetwork, err := infraprovider.Get().PrimaryNetwork()
19441944
framework.ExpectNoError(err, "failed to get primary network")
19451945
collectorExternalContainer := infraapi.ExternalContainer{Name: getContainerName(collectorPort), Image: "cloudflare/goflow",
1946-
Network: primaryProviderNetwork, Args: []string{"-kafka=false"}, ExtPort: collectorPort}
1946+
Network: primaryProviderNetwork, CmdArgs: []string{"-kafka=false"}, ExtPort: collectorPort}
19471947
collectorExternalContainer, err = providerCtx.CreateExternalContainer(collectorExternalContainer)
19481948
if err != nil {
19491949
framework.Failf("failed to start flow collector container %s: %v", getContainerName(collectorPort), err)

test/e2e/egress_firewall.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ var _ = ginkgo.Describe("e2e egress firewall policy validation", feature.EgressF
197197
Name: externalContainerName1,
198198
Image: images.AgnHost(),
199199
Network: primaryProviderNetwork,
200-
Args: []string{"netexec", fmt.Sprintf("--http-port=%d", externalContainer1Port)},
200+
CmdArgs: []string{"netexec", fmt.Sprintf("--http-port=%d", externalContainer1Port)},
201201
ExtPort: externalContainer1Port,
202202
}
203203
externalContainer1, err = providerCtx.CreateExternalContainer(externalContainer1Spec)
@@ -210,7 +210,7 @@ var _ = ginkgo.Describe("e2e egress firewall policy validation", feature.EgressF
210210
Name: externalContainerName2,
211211
Image: images.AgnHost(),
212212
Network: primaryProviderNetwork,
213-
Args: []string{"netexec", fmt.Sprintf("--http-port=%d", externalContainer2Port)},
213+
CmdArgs: []string{"netexec", fmt.Sprintf("--http-port=%d", externalContainer2Port)},
214214
ExtPort: externalContainer2Port,
215215
}
216216
externalContainer2, err = providerCtx.CreateExternalContainer(externalContainer2Spec)

test/e2e/egress_services.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ var _ = ginkgo.Describe("EgressService", feature.EgressService, func() {
8585
framework.ExpectNoError(err, "failed to get primary provider network")
8686
externalContainer = infraapi.ExternalContainer{Name: externalContainerName, Image: images.AgnHost(),
8787
Network: primaryProviderNetwork, ExtPort: 8080,
88-
Args: getAgnHostHTTPPortBindCMDArgs(8080)}
88+
CmdArgs: getAgnHostHTTPPortBindCMDArgs(8080)}
8989
externalContainer, err = providerCtx.CreateExternalContainer(externalContainer)
9090
framework.ExpectNoError(err, "failed to create external container")
9191
})
@@ -1239,7 +1239,7 @@ metadata:
12391239
ginkgo.By(fmt.Sprintf("Creating container %s", net.containerName))
12401240
// Setting the --hostname here is important since later we poke the container's /hostname endpoint
12411241
extContainerSecondaryNet := infraapi.ExternalContainer{Name: net.containerName, Image: images.AgnHost(), Network: network,
1242-
Args: []string{"netexec", "--http-port=8080"}, ExtPort: 8080}
1242+
CmdArgs: []string{"netexec", "--http-port=8080"}, ExtPort: 8080}
12431243
extContainerSecondaryNet, err = providerCtx.CreateExternalContainer(extContainerSecondaryNet)
12441244
ginkgo.By(fmt.Sprintf("Adding a listener for the shared IPv4 %s on %s", sharedIPv4, net.containerName))
12451245
out, err := infraprovider.Get().ExecExternalContainerCommand(extContainerSecondaryNet, []string{"ip", "address", "add", sharedIPv4 + "/32", "dev", "lo"})

test/e2e/egressip.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ func isSupportedAgnhostForEIP(externalContainer infraapi.ExternalContainer) bool
219219
if externalContainer.Image != images.AgnHost() {
220220
return false
221221
}
222-
if !util.SliceHasStringItem(externalContainer.Args, "netexec") {
222+
if !util.SliceHasStringItem(externalContainer.CmdArgs, "netexec") {
223223
return false
224224
}
225225
return true
@@ -754,13 +754,13 @@ var _ = ginkgo.DescribeTableSubtree("e2e egress IP validation", feature.EgressIP
754754
// attach containers to the primary network
755755
primaryTargetExternalContainerPort := infraprovider.Get().GetExternalContainerPort()
756756
primaryTargetExternalContainerSpec := infraapi.ExternalContainer{Name: targetNodeName, Image: images.AgnHost(),
757-
Network: primaryProviderNetwork, Args: getAgnHostHTTPPortBindCMDArgs(primaryTargetExternalContainerPort), ExtPort: primaryTargetExternalContainerPort}
757+
Network: primaryProviderNetwork, CmdArgs: getAgnHostHTTPPortBindCMDArgs(primaryTargetExternalContainerPort), ExtPort: primaryTargetExternalContainerPort}
758758
primaryTargetExternalContainer, err = providerCtx.CreateExternalContainer(primaryTargetExternalContainerSpec)
759759
framework.ExpectNoError(err, "failed to create external target container on primary network", primaryTargetExternalContainerSpec.String())
760760

761761
primaryDeniedExternalContainerPort := infraprovider.Get().GetExternalContainerPort()
762762
primaryDeniedExternalContainerSpec := infraapi.ExternalContainer{Name: deniedTargetNodeName, Image: images.AgnHost(),
763-
Network: primaryProviderNetwork, Args: getAgnHostHTTPPortBindCMDArgs(primaryDeniedExternalContainerPort), ExtPort: primaryDeniedExternalContainerPort}
763+
Network: primaryProviderNetwork, CmdArgs: getAgnHostHTTPPortBindCMDArgs(primaryDeniedExternalContainerPort), ExtPort: primaryDeniedExternalContainerPort}
764764
primaryDeniedExternalContainer, err = providerCtx.CreateExternalContainer(primaryDeniedExternalContainerSpec)
765765
framework.ExpectNoError(err, "failed to create external denied container on primary network", primaryDeniedExternalContainer.String())
766766

@@ -791,7 +791,7 @@ var _ = ginkgo.DescribeTableSubtree("e2e egress IP validation", feature.EgressIP
791791
Name: targetSecondaryNodeName,
792792
Image: images.AgnHost(),
793793
Network: secondaryProviderNetwork,
794-
Args: getAgnHostHTTPPortBindCMDArgs(secondaryTargetExternalContainerPort),
794+
CmdArgs: getAgnHostHTTPPortBindCMDArgs(secondaryTargetExternalContainerPort),
795795
ExtPort: secondaryTargetExternalContainerPort,
796796
}
797797
secondaryTargetExternalContainer, err = providerCtx.CreateExternalContainer(secondaryTargetExternalContainerSpec)
@@ -972,7 +972,7 @@ spec:
972972
if isClusterDefaultNetwork(netConfigParams) {
973973
pod2IP = getPodAddress(pod2Name, f.Namespace.Name)
974974
} else {
975-
pod2IP, err = podIPsForUserDefinedPrimaryNetwork(
975+
pod2IP, err = getPodAnnotationIPsForAttachmentByIndex(
976976
f.ClientSet,
977977
f.Namespace.Name,
978978
pod2Name,
@@ -2125,7 +2125,7 @@ spec:
21252125
providerPrimaryNetwork, err := infraprovider.Get().PrimaryNetwork()
21262126
framework.ExpectNoError(err, "failed to get providers primary network")
21272127
externalContainerPrimary := infraapi.ExternalContainer{Name: "external-container-for-egressip-mtu-test", Image: images.AgnHost(),
2128-
Network: providerPrimaryNetwork, Args: []string{"pause"}, ExtPort: externalContainerPrimaryPort}
2128+
Network: providerPrimaryNetwork, CmdArgs: []string{"pause"}, ExtPort: externalContainerPrimaryPort}
21292129
externalContainerPrimary, err = providerCtx.CreateExternalContainer(externalContainerPrimary)
21302130
framework.ExpectNoError(err, "failed to create external container: %s", externalContainerPrimary.String())
21312131

0 commit comments

Comments
 (0)