Skip to content

Commit da2a4f2

Browse files
committed
[WIP] API for no-overlay mode in OVN-Kubernetes
Signed-off-by: Riccardo Ravaioli <[email protected]>
1 parent 230d0e0 commit da2a4f2

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

operator/v1/types_network.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,11 @@ type OpenShiftSDNConfig struct {
399399

400400
// ovnKubernetesConfig contains the configuration parameters for networks
401401
// using the ovn-kubernetes network project
402+
// +kubebuilder:validation:XValidation:rule='self.defaultNetworkTransport == "NoOverlay" || !has(self.defaultNetworkNoOverlayOptions)',message="defaultNetworkNoOverlayOptions is only supported for no-overlay networks"
403+
// +kubebuilder:validation:XValidation:rule='!(self.defaultNetworkTransport == "NoOverlay" && has(self.defaultNetworkNoOverlayOptions) && self.defaultNetworkNoOverlayOptions.routing == "Managed") || has(self.bgpManagedConfig)',message="bgpManagedConfig is required when DefaultNetworkTransport is NoOverlay, DefaultNetworkNoOverlayOptions is set and DefaultNetworkNoOverlayOptions.Routing=\"Managed\""
404+
// +kubebuilder:validation:XValidation:rule='self.defaultNetworkTransport == oldSelf.defaultNetworkTransport',message="DefaultNetworkTransport field is immutable"
405+
// +kubebuilder:validation:XValidation:rule='self.defaultNetworkNoOverlayOptions == oldSelf.defaultNetworkNoOverlayOptions',message="defaultNetworkNoOverlayOptions field is immutable"
406+
// +kubebuilder:validation:XValidation:rule='self.bgpManagedConfig == oldSelf.bgpManagedConfig',message="bgpManagedConfig field is immutable"
402407
type OVNKubernetesConfig struct {
403408
// mtu is the MTU to use for the tunnel interface. This must be 100
404409
// bytes smaller than the uplink mtu.
@@ -468,6 +473,44 @@ type OVNKubernetesConfig struct {
468473
// +openshift:enable:FeatureGate=RouteAdvertisements
469474
// +optional
470475
RouteAdvertisements RouteAdvertisementsEnablement `json:"routeAdvertisements,omitempty"`
476+
477+
// DefaultNetworkTransport describes the transport protocol for east-west traffic for the default network.
478+
// Allowed values are "NoOverlay" and "Geneve".
479+
// - "NoOverlay": The default network operates in no-overlay mode.
480+
// - "Geneve": The default network uses Geneve overlay.
481+
// Defaults to "Geneve".
482+
// +kubebuilder:validation:Enum=NoOverlay;Geneve
483+
// +kubebuilder:default=Geneve
484+
// +optional
485+
DefaultNetworkTransport TransportOption `json:"defaultNetworkTransport,omitempty"`
486+
// DefaultNetworkNoOverlayOptions contains configuration for no-overlay mode for the default network.
487+
// It is required when DefaultNetworkTransport is "NoOverlay".
488+
// +optional
489+
DefaultNetworkNoOverlayOptions *NoOverlayOptions `json:"defaultNetworkNoOverlayOptions,omitempty"`
490+
491+
// NoOverlayManagedConfig configures the BGP properties for networks (default network or CUDNs)
492+
// in no-overlay mode that specify routing="managed" in their NoOverlayOptions.
493+
// It is required when DefaultNetworkNoOverlayOptions.Routing is set to "Managed".
494+
// +optional
495+
BGPManagedConfig *bgpManagedConfig `json:"BGPManagedConfig,omitempty"`
496+
}
497+
498+
// NoOverlayManagedConfig contains configuration options for BGP when routing is "Managed".
499+
type bgpManagedConfig struct {
500+
// ASNumber is the 2-byte or 4-byte Autonomous System Number (ASN)
501+
// to be used in the generated FRR configuration. It is required
502+
// when NoOverlayOptions.Routing is "Managed".
503+
// +kubebuilder:validation:Minimum=1
504+
// +kubebuilder:validation:Maximum=4294967295
505+
ASNumber *uint32 `json:"asNumber,omitempty"`
506+
507+
// BGPTopology defines the BGP topology to be used. Allowed values
508+
// are "fullMesh".
509+
// - "fullMesh": Every node deploys a BGP router, forming a BGP full mesh.
510+
// Defaults to "fullMesh".
511+
// +kubebuilder:validation:Enum=fullMesh
512+
// +optional
513+
BGPTopology BGPTopology `json:"bgpTopology,omitempty"`
471514
}
472515

473516
type IPv4OVNKubernetesConfig struct {
@@ -898,3 +941,34 @@ type AdditionalRoutingCapabilities struct {
898941
// +kubebuilder:validation:XValidation:rule="self.all(x, self.exists_one(y, x == y))"
899942
Providers []RoutingCapabilitiesProvider `json:"providers"`
900943
}
944+
945+
type TransportOption string
946+
type SnatOption string
947+
type RoutingOption string
948+
type BGPTopology string
949+
950+
const (
951+
TransportOptionNoOverlay TransportOption = "NoOverlay"
952+
TransportOptionGeneve TransportOption = "Geneve"
953+
954+
SnatEnable SnatOption = "Enable"
955+
SnatDisable SnatOption = "Disable"
956+
957+
RoutingManaged RoutingOption = "Managed"
958+
RoutingUnmanaged RoutingOption = "Unmanaged"
959+
960+
// BGPTopologyRouteReflector BGPTopology = "routeReflector" // TODO: Enable when route reflector is implemented in FRR-Kubernetes (and OVN-Kubernetes)
961+
BGPTopologyFullMesh BGPTopology = "fullMesh"
962+
)
963+
964+
// NoOverlayOptions contains configuration options for networks operating in no-overlay mode.
965+
type NoOverlayOptions struct {
966+
// OutboundSNAT defines the SNAT behavior for outbound traffic from pods.
967+
// +kubebuilder:validation:Enum=Enable;Disable
968+
// +required
969+
OutboundSNAT SnatOption `json:"outboundSNAT,omitempty"`
970+
// Routing specifies whether the pod network routing is managed by OVN-Kubernetes or users.
971+
// +kubebuilder:validation:Enum=Managed;Unmanaged
972+
// +required
973+
Routing RoutingOption `json:"routing,omitempty"`
974+
}

0 commit comments

Comments
 (0)