@@ -28,6 +28,8 @@ import (
2828 controllerutil "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/controller"
2929 eiptypes "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/crd/egressip/v1"
3030 ratypes "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/crd/routeadvertisements/v1"
31+ apitypes "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/crd/types"
32+ userdefinednetworkv1 "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/crd/userdefinednetwork/v1"
3133 "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/factory"
3234 "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/networkmanager"
3335 ovntest "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/testing"
@@ -42,6 +44,7 @@ type testRA struct {
4244 NetworkSelector map [string ]string
4345 NodeSelector map [string ]string
4446 FRRConfigurationSelector map [string ]string
47+ SelectsDefault bool
4548 AdvertisePods bool
4649 AdvertiseEgressIPs bool
4750}
@@ -63,9 +66,19 @@ func (tra testRA) RouteAdvertisements() *ratypes.RouteAdvertisements {
6366 ra .Spec .Advertisements = append (ra .Spec .Advertisements , ratypes .EgressIP )
6467 }
6568 if tra .NetworkSelector != nil {
66- ra .Spec .NetworkSelector = metav1.LabelSelector {
67- MatchLabels : tra .NetworkSelector ,
68- }
69+ ra .Spec .NetworkSelectors = append (ra .Spec .NetworkSelectors , apitypes.NetworkSelector {
70+ NetworkSelectionType : apitypes .ClusterUserDefinedNetworks ,
71+ ClusterUserDefinedNetworkSelector : & apitypes.ClusterUserDefinedNetworkSelector {
72+ NetworkSelector : metav1.LabelSelector {
73+ MatchLabels : tra .NetworkSelector ,
74+ },
75+ },
76+ })
77+ }
78+ if tra .SelectsDefault {
79+ ra .Spec .NetworkSelectors = append (ra .Spec .NetworkSelectors , apitypes.NetworkSelector {
80+ NetworkSelectionType : apitypes .DefaultNetwork ,
81+ })
6982 }
7083 if tra .NodeSelector != nil {
7184 ra .Spec .NodeSelector = metav1.LabelSelector {
@@ -291,6 +304,13 @@ func (tn testNAD) NAD() *nadtypes.NetworkAttachmentDefinition {
291304 Annotations : tn .Annotations ,
292305 },
293306 }
307+ if strings .HasPrefix (tn .Network , types .CUDNPrefix ) {
308+ ownerRef := * metav1 .NewControllerRef (
309+ & metav1.ObjectMeta {Name : tn .Network },
310+ userdefinednetworkv1 .SchemeGroupVersion .WithKind ("ClusterUserDefinedNetwork" ),
311+ )
312+ nad .ObjectMeta .OwnerReferences = []metav1.OwnerReference {ownerRef }
313+ }
294314 topology := tn .Topology
295315 if topology == "" {
296316 topology = "layer3"
@@ -378,7 +398,7 @@ func TestController_reconcile(t *testing.T) {
378398 }{
379399 {
380400 name : "reconciles pod+eip RouteAdvertisement for a single FRR config, node and default network and target VRF" ,
381- ra : & testRA {Name : "ra" , AdvertisePods : true , AdvertiseEgressIPs : true },
401+ ra : & testRA {Name : "ra" , AdvertisePods : true , AdvertiseEgressIPs : true , SelectsDefault : true },
382402 frrConfigs : []* testFRRConfig {
383403 {
384404 Name : "frrConfig" ,
@@ -409,7 +429,7 @@ func TestController_reconcile(t *testing.T) {
409429 },
410430 {
411431 name : "reconciles dual-stack pod+eip RouteAdvertisement for a single FRR config, node and default network and target VRF" ,
412- ra : & testRA {Name : "ra" , AdvertisePods : true , AdvertiseEgressIPs : true },
432+ ra : & testRA {Name : "ra" , AdvertisePods : true , AdvertiseEgressIPs : true , SelectsDefault : true },
413433 frrConfigs : []* testFRRConfig {
414434 {
415435 Name : "frrConfig" ,
@@ -455,8 +475,8 @@ func TestController_reconcile(t *testing.T) {
455475 },
456476 },
457477 nads : []* testNAD {
458- {Name : "red" , Namespace : "red" , Network : util . GenerateCUDNNetworkName ( "red" ) , Topology : "layer3" , Subnet : "1.2.0.0/16" , Labels : map [string ]string {"selected" : "true" }},
459- {Name : "blue" , Namespace : "blue" , Network : util . GenerateCUDNNetworkName ( "blue" ) , Topology : "layer3" , Subnet : "1.3.0.0/16" , Labels : map [string ]string {"selected" : "true" }},
478+ {Name : "red" , Namespace : "red" , Network : "cluster_udn_red" , Topology : "layer3" , Subnet : "1.2.0.0/16" , Labels : map [string ]string {"selected" : "true" }},
479+ {Name : "blue" , Namespace : "blue" , Network : "cluster_udn_blue" , Topology : "layer3" , Subnet : "1.3.0.0/16" , Labels : map [string ]string {"selected" : "true" }},
460480 },
461481 nodes : []* testNode {{Name : "node" , SubnetsAnnotation : "{\" default\" :\" 1.1.0.0/24\" , \" cluster_udn_red\" :\" 1.2.0.0/24\" , \" cluster_udn_blue\" :\" 1.3.0.0/24\" }" }},
462482 eips : []* testEIP {{Name : "eip" , EIPs : map [string ]string {"node" : "1.0.1.1" }}},
@@ -493,11 +513,11 @@ func TestController_reconcile(t *testing.T) {
493513 },
494514 nads : []* testNAD {
495515 {Name : "default" , Namespace : "ovn-kubernetes" , Network : "default" },
496- {Name : "red" , Namespace : "red" , Network : "cluster.udn.red " , Topology : "layer3" , Subnet : "1.2.0.0/16" },
497- {Name : "blue" , Namespace : "blue" , Network : "cluster.udn.blue " , Topology : "layer3" , Subnet : "1.3.0.0/16" , Labels : map [string ]string {"selected" : "true" }},
516+ {Name : "red" , Namespace : "red" , Network : "cluster_udn_red " , Topology : "layer3" , Subnet : "1.2.0.0/16" },
517+ {Name : "blue" , Namespace : "blue" , Network : "cluster_udn_blue " , Topology : "layer3" , Subnet : "1.3.0.0/16" , Labels : map [string ]string {"selected" : "true" }},
498518 },
499519 nodes : []* testNode {
500- {Name : "node" , SubnetsAnnotation : "{\" default\" :\" 1.1.1.0/24\" , \" cluster.udn.red \" :\" 1.2.1.0/24\" , \" cluster.udn.blue \" :\" 1.3.1.0/24\" }" },
520+ {Name : "node" , SubnetsAnnotation : "{\" default\" :\" 1.1.1.0/24\" , \" cluster_udn_red \" :\" 1.2.1.0/24\" , \" cluster_udn_blue \" :\" 1.3.1.0/24\" }" },
501521 },
502522 namespaces : []* testNamespace {
503523 {Name : "default" , Labels : map [string ]string {"selected" : "default" }},
@@ -526,7 +546,7 @@ func TestController_reconcile(t *testing.T) {
526546 },
527547 {
528548 name : "reconciles a RouteAdvertisement updating the generated FRRConfigurations if needed" ,
529- ra : & testRA {Name : "ra" , AdvertisePods : true , AdvertiseEgressIPs : true },
549+ ra : & testRA {Name : "ra" , AdvertisePods : true , AdvertiseEgressIPs : true , SelectsDefault : true },
530550 frrConfigs : []* testFRRConfig {
531551 {
532552 Name : "frrConfig" ,
@@ -594,11 +614,12 @@ func TestController_reconcile(t *testing.T) {
594614 TargetVRF : "auto" ,
595615 FRRConfigurationSelector : map [string ]string {"selected" : "true" },
596616 NetworkSelector : map [string ]string {"selected" : "true" },
617+ SelectsDefault : true ,
597618 },
598619 nads : []* testNAD {
599620 {Name : "default" , Namespace : "ovn-kubernetes" , Network : "default" , Labels : map [string ]string {"selected" : "true" }},
600- {Name : "red" , Namespace : "red" , Network : util . GenerateCUDNNetworkName ( "red" ) , Topology : "layer3" , Subnet : "1.2.0.0/16" , Labels : map [string ]string {"selected" : "true" }},
601- {Name : "blue" , Namespace : "blue" , Network : util . GenerateCUDNNetworkName ( "blue" ) , Topology : "layer3" }, // not selected
621+ {Name : "red" , Namespace : "red" , Network : "cluster_udn_red" , Topology : "layer3" , Subnet : "1.2.0.0/16" , Labels : map [string ]string {"selected" : "true" }},
622+ {Name : "blue" , Namespace : "blue" , Network : "cluster_udn_blue" , Topology : "layer3" }, // not selected
602623 },
603624 frrConfigs : []* testFRRConfig {
604625 {
@@ -708,6 +729,15 @@ func TestController_reconcile(t *testing.T) {
708729 reconcile : "ra" ,
709730 expectAcceptedStatus : metav1 .ConditionFalse ,
710731 },
732+ {
733+ name : "fails to reconcile an non-cluster UDN" ,
734+ ra : & testRA {Name : "ra" , AdvertisePods : true , NetworkSelector : map [string ]string {"selected" : "true" }},
735+ nads : []* testNAD {
736+ {Name : "red" , Namespace : "red" , Network : "red" , Topology : "layer3" , Subnet : "1.2.0.0/16" , Labels : map [string ]string {"selected" : "true" }},
737+ },
738+ reconcile : "ra" ,
739+ expectAcceptedStatus : metav1 .ConditionFalse ,
740+ },
711741 {
712742 name : "fails to reconcile pod network if node selector is not empty" ,
713743 ra : & testRA {Name : "ra" , AdvertisePods : true , NodeSelector : map [string ]string {"selected" : "true" }},
@@ -794,8 +824,8 @@ func TestController_reconcile(t *testing.T) {
794824 name : "fails to reconcile if not all VRFs were matched with 'auto' target VRF" ,
795825 ra : & testRA {Name : "ra" , TargetVRF : "auto" , AdvertisePods : true , NetworkSelector : map [string ]string {"selected" : "true" }},
796826 nads : []* testNAD {
797- {Name : "red" , Namespace : "red" , Network : "red " , Topology : "layer3" , Labels : map [string ]string {"selected" : "true" }},
798- {Name : "blue" , Namespace : "blue" , Network : "blue " , Topology : "layer3" , Labels : map [string ]string {"selected" : "true" }},
827+ {Name : "red" , Namespace : "red" , Network : "cluster_udn_red " , Topology : "layer3" , Labels : map [string ]string {"selected" : "true" }},
828+ {Name : "blue" , Namespace : "blue" , Network : "cluster_udn_blue " , Topology : "layer3" , Labels : map [string ]string {"selected" : "true" }},
799829 },
800830 frrConfigs : []* testFRRConfig {
801831 {
@@ -808,7 +838,7 @@ func TestController_reconcile(t *testing.T) {
808838 },
809839 },
810840 },
811- nodes : []* testNode {{Name : "node" , SubnetsAnnotation : "{\" red \" :\" 1.1.0.0/24\" , \" blue \" :\" 1.2.0.0/24\" }" }},
841+ nodes : []* testNode {{Name : "node" , SubnetsAnnotation : "{\" cluster_udn_red \" :\" 1.1.0.0/24\" , \" cluster_udn_blue \" :\" 1.2.0.0/24\" }" }},
812842 reconcile : "ra" ,
813843 expectAcceptedStatus : metav1 .ConditionFalse ,
814844 },
0 commit comments