Skip to content

Commit ccf448c

Browse files
committed
Add management port package, interfaces and usage
Add the new management port package interface and use it externally. Signed-off-by: Jaime Caamaño Ruiz <[email protected]>
1 parent 018d314 commit ccf448c

File tree

14 files changed

+1094
-254
lines changed

14 files changed

+1094
-254
lines changed

go-controller/.mockery.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ packages:
2424
config:
2525
all: true
2626
dir: pkg/kube/mocks
27+
github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node:
28+
interfaces:
29+
ManagementPort:
2730
github.com/ovn-org/ovn-kubernetes/go-controller/pkg/ovn/address_set:
2831
config:
2932
all: true
@@ -33,6 +36,10 @@ packages:
3336
DNSOps:
3437
ExecRunner:
3538
FileSystemOps:
39+
NetInfo:
40+
# need separate package to avoid circular dependency
41+
config:
42+
dir: pkg/util/mocks/multinetwork
3643
NetLinkOps:
3744
SriovnetOps:
3845
VdpaDevice:

go-controller/pkg/node/default_node_network_controller.go

Lines changed: 48 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import (
3737
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/controllers/egressip"
3838
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/controllers/egressservice"
3939
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/linkmanager"
40+
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/managementport"
4041
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/ovspinning"
4142
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/routemanager"
4243
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/ovn/controller/apbroute"
@@ -101,7 +102,9 @@ func NewCommonNodeNetworkControllerInfo(kubeClient clientset.Interface, apbExter
101102
type DefaultNodeNetworkController struct {
102103
BaseNodeNetworkController
103104

104-
Gateway Gateway
105+
mgmtPortController managementport.Controller
106+
Gateway Gateway
107+
105108
// Node healthcheck server for cloud load balancers
106109
healthzServer *proxierHealthUpdater
107110
routeManager *routemanager.Controller
@@ -118,16 +121,10 @@ type DefaultNodeNetworkController struct {
118121

119122
cniServer *cni.Server
120123

121-
gatewaySetup *preStartSetup
122-
123124
udnHostIsolationManager *UDNHostIsolationManager
124-
}
125125

126-
type preStartSetup struct {
127-
mgmtPorts []*managementPortEntry
128-
mgmtPortConfig *managementPortConfig
129-
nodeAddress net.IP
130-
sbZone string
126+
nodeAddress net.IP
127+
sbZone string
131128
}
132129

133130
func newDefaultNodeNetworkController(cnnci *CommonNodeNetworkControllerInfo, stopChan chan struct{},
@@ -207,9 +204,9 @@ func (oc *DefaultNodeNetworkController) Reconcile(netInfo util.NetInfo) error {
207204
return fmt.Errorf("failed to reconcile gateway: %v", err)
208205
}
209206
}
210-
for _, mgmtPort := range oc.gatewaySetup.mgmtPorts {
211-
mgmtPort.SetDefaultPodNetworkAdvertised(isPodNetworkAdvertisedAtNode)
212-
mgmtPort.Reconcile()
207+
208+
if oc.mgmtPortController != nil {
209+
oc.mgmtPortController.Reconcile()
213210
}
214211
}
215212

@@ -223,10 +220,6 @@ func (oc *DefaultNodeNetworkController) Reconcile(netInfo util.NetInfo) error {
223220
return nil
224221
}
225222

226-
func (oc *DefaultNodeNetworkController) isPodNetworkAdvertisedAtNode() bool {
227-
return util.IsPodNetworkAdvertisedAtNode(oc, oc.name)
228-
}
229-
230223
func clearOVSFlowTargets() error {
231224
_, _, err := util.RunOVSVsctl(
232225
"--",
@@ -694,43 +687,25 @@ func getMgmtPortAndRepName(node *corev1.Node) (string, string, error) {
694687
}
695688
}
696689

697-
func createNodeManagementPorts(
690+
func createNodeManagementPortController(
698691
node *corev1.Node,
699-
nodeAnnotator kube.Annotator,
700692
subnets []*net.IPNet,
693+
nodeAnnotator kube.Annotator,
701694
routeManager *routemanager.Controller,
702-
isRoutingAdvertised bool,
703-
) ([]*managementPortEntry, *managementPortConfig, error) {
695+
netInfo util.NetInfo,
696+
) (managementport.Controller, error) {
704697
netdevName, rep, err := getMgmtPortAndRepName(node)
705698
if err != nil {
706-
return nil, nil, err
699+
return nil, err
707700
}
708701

709702
if config.OvnKubeNode.Mode == types.NodeModeDPUHost {
710703
err := exportManagementPortAnnotation(netdevName, nodeAnnotator)
711704
if err != nil {
712-
return nil, nil, err
705+
return nil, err
713706
}
714707
}
715-
ports := NewManagementPorts(node.Name, subnets, netdevName, rep)
716-
717-
var mgmtPortConfig *managementPortConfig
718-
mgmtPorts := make([]*managementPortEntry, 0)
719-
for _, port := range ports {
720-
config, err := port.Create(isRoutingAdvertised, routeManager, node)
721-
if err != nil {
722-
return nil, nil, err
723-
}
724-
mgmtPorts = append(mgmtPorts, NewManagementPortEntry(port, config, routeManager))
725-
726-
// Save this management port config for later usage.
727-
// Since only one OVS internal port / Representor config may exist it is fine just to overwrite it
728-
if _, ok := port.(*managementPortNetdev); !ok {
729-
mgmtPortConfig = config
730-
}
731-
}
732-
733-
return mgmtPorts, mgmtPortConfig, nil
708+
return managementport.NewManagementPortController(node, subnets, netdevName, rep, routeManager, netInfo)
734709
}
735710

736711
// getOVNSBZone returns the zone name stored in the Southbound db.
@@ -813,8 +788,6 @@ func (nc *DefaultNodeNetworkController) Init(ctx context.Context) error {
813788
var subnets []*net.IPNet
814789
var cniServer *cni.Server
815790

816-
gatewaySetup := &preStartSetup{}
817-
818791
// Setting debug log level during node bring up to expose bring up process.
819792
// Log level is returned to configured value when bring up is complete.
820793
var level klog.Level
@@ -932,18 +905,17 @@ func (nc *DefaultNodeNetworkController) Init(ctx context.Context) error {
932905
nodeAnnotator := kube.NewNodeAnnotator(nc.Kube, node.Name)
933906

934907
// Setup management ports
935-
mgmtPorts, mgmtPortConfig, err := createNodeManagementPorts(
908+
nc.mgmtPortController, err = createNodeManagementPortController(
936909
node,
937-
nodeAnnotator,
938910
subnets,
911+
nodeAnnotator,
939912
nc.routeManager,
940-
nc.isPodNetworkAdvertisedAtNode())
913+
nc.GetNetInfo(),
914+
)
941915
if err != nil {
942916
return err
943917
}
944-
gatewaySetup.mgmtPorts = mgmtPorts
945-
gatewaySetup.mgmtPortConfig = mgmtPortConfig
946-
gatewaySetup.nodeAddress = nodeAddr
918+
nc.nodeAddress = nodeAddr
947919

948920
if err := util.SetNodeZone(nodeAnnotator, sbZone); err != nil {
949921
return fmt.Errorf("failed to set node zone annotation for node %s: %w", nc.name, err)
@@ -964,7 +936,7 @@ func (nc *DefaultNodeNetworkController) Init(ctx context.Context) error {
964936
// First part of gateway initialization. It will be completed by (nc *DefaultNodeNetworkController) Start()
965937
if config.OvnKubeNode.Mode != types.NodeModeDPUHost {
966938
// Initialize gateway for OVS internal port or representor management port
967-
gw, err := nc.initGatewayPreStart(subnets, nodeAnnotator, mgmtPortConfig, nodeAddr)
939+
gw, err := nc.initGatewayPreStart(subnets, nodeAnnotator, nc.mgmtPortController, nodeAddr)
968940
if err != nil {
969941
return err
970942
}
@@ -974,11 +946,9 @@ func (nc *DefaultNodeNetworkController) Init(ctx context.Context) error {
974946
if err := level.Set(strconv.Itoa(config.Logging.Level)); err != nil {
975947
klog.Errorf("Reset of initial klog \"loglevel\" failed, err: %v", err)
976948
}
977-
gatewaySetup.sbZone = sbZone
978-
nc.gatewaySetup = gatewaySetup
949+
nc.sbZone = sbZone
979950

980951
return nil
981-
982952
}
983953

984954
// Start learns the subnets assigned to it by the master controller
@@ -989,7 +959,7 @@ func (nc *DefaultNodeNetworkController) Start(ctx context.Context) error {
989959
var err error
990960
var node *corev1.Node
991961

992-
if nc.gatewaySetup == nil {
962+
if nc.mgmtPortController == nil {
993963
return fmt.Errorf("default node network controller hasn't been pre-started")
994964
}
995965

@@ -1029,7 +999,7 @@ func (nc *DefaultNodeNetworkController) Start(ctx context.Context) error {
1029999

10301000
// Complete gateway initialization
10311001
if config.OvnKubeNode.Mode == types.NodeModeDPUHost {
1032-
err = nc.initGatewayDPUHost(nc.gatewaySetup.nodeAddress)
1002+
err = nc.initGatewayDPUHost(nc.nodeAddress)
10331003
if err != nil {
10341004
return err
10351005
}
@@ -1073,7 +1043,7 @@ func (nc *DefaultNodeNetworkController) Start(ctx context.Context) error {
10731043
// plumbing (takes 80ms based on what we saw in CI runs so we might still have that small window of disruption).
10741044
// NOTE: ovnkube-node in DPU host mode doesn't go through upgrades for OVN-IC and has no SBDB to connect to. Thus this part shall be skipped.
10751045
var syncNodes, syncServices, syncPods bool
1076-
if config.OvnKubeNode.Mode != types.NodeModeDPUHost && config.OVNKubernetesFeature.EnableInterconnect && nc.gatewaySetup.sbZone != types.OvnDefaultZone && !util.HasNodeMigratedZone(node) {
1046+
if config.OvnKubeNode.Mode != types.NodeModeDPUHost && config.OVNKubernetesFeature.EnableInterconnect && nc.sbZone != types.OvnDefaultZone && !util.HasNodeMigratedZone(node) {
10771047
klog.Info("Upgrade Hack: Interconnect is enabled")
10781048
var err1 error
10791049
start := time.Now()
@@ -1155,7 +1125,7 @@ func (nc *DefaultNodeNetworkController) Start(ctx context.Context) error {
11551125
if err != nil {
11561126
return fmt.Errorf("upgrade hack: failed while waiting for the remote ovnkube-controller to be ready: %v, %v", err, err1)
11571127
}
1158-
if err := util.SetNodeZoneMigrated(nodeAnnotator, nc.gatewaySetup.sbZone); err != nil {
1128+
if err := util.SetNodeZoneMigrated(nodeAnnotator, nc.sbZone); err != nil {
11591129
return fmt.Errorf("upgrade hack: failed to set node zone annotation for node %s: %w", nc.name, err)
11601130
}
11611131
if err := nodeAnnotator.Run(); err != nil {
@@ -1231,14 +1201,15 @@ func (nc *DefaultNodeNetworkController) Start(ctx context.Context) error {
12311201
klog.Errorf("Reset of initial klog \"loglevel\" failed, err: %v", err)
12321202
}
12331203

1234-
// start management ports health check
1235-
for _, mgmtPort := range nc.gatewaySetup.mgmtPorts {
1236-
mgmtPort.Start(nc.stopChan)
1237-
if config.OVNKubernetesFeature.EnableEgressIP {
1238-
// Start the health checking server used by egressip, if EgressIPNodeHealthCheckPort is specified
1239-
if err := nc.startEgressIPHealthCheckingServer(mgmtPort); err != nil {
1240-
return err
1241-
}
1204+
// start management port controller
1205+
err = nc.mgmtPortController.Start(nc.stopChan)
1206+
if err != nil {
1207+
return fmt.Errorf("failed to start management port controller: %w", err)
1208+
}
1209+
if config.OVNKubernetesFeature.EnableEgressIP {
1210+
// Start the health checking server used by egressip, if EgressIPNodeHealthCheckPort is specified
1211+
if err := nc.startEgressIPHealthCheckingServer(nc.mgmtPortController); err != nil {
1212+
return err
12421213
}
12431214
}
12441215

@@ -1248,7 +1219,7 @@ func (nc *DefaultNodeNetworkController) Start(ctx context.Context) error {
12481219
// "k8s.ovn.org/external-gw-pod-ips". In that case, we need ovnkube-node to flush
12491220
// conntrack on every node. In multi-zone-interconnect case, we will handle the flushing
12501221
// directly on the ovnkube-controller code to avoid an extra namespace annotation
1251-
if !config.OVNKubernetesFeature.EnableInterconnect || nc.gatewaySetup.sbZone == types.OvnDefaultZone {
1222+
if !config.OVNKubernetesFeature.EnableInterconnect || nc.sbZone == types.OvnDefaultZone {
12521223
err := nc.WatchNamespaces()
12531224
if err != nil {
12541225
return fmt.Errorf("failed to watch namespaces: %w", err)
@@ -1336,34 +1307,25 @@ func (nc *DefaultNodeNetworkController) Stop() {
13361307
nc.wg.Wait()
13371308
}
13381309

1339-
func (nc *DefaultNodeNetworkController) startEgressIPHealthCheckingServer(mgmtPortEntry *managementPortEntry) error {
1310+
func (nc *DefaultNodeNetworkController) startEgressIPHealthCheckingServer(mgmtPort managementport.Interface) error {
13401311
healthCheckPort := config.OVNKubernetesFeature.EgressIPNodeHealthCheckPort
13411312
if healthCheckPort == 0 {
13421313
klog.Infof("Egress IP health check server skipped: no port specified")
13431314
return nil
13441315
}
13451316

1346-
var nodeMgmtIP net.IP
1347-
var mgmtPortConfig *managementPortConfig = mgmtPortEntry.config
1348-
// Not all management port interfaces can have IP addresses assignable to them.
1349-
if mgmtPortEntry.port.HasIpAddr() {
1350-
if mgmtPortConfig.ipv4 != nil {
1351-
nodeMgmtIP = mgmtPortConfig.ipv4.ifAddr.IP
1352-
} else if mgmtPortConfig.ipv6 != nil {
1353-
nodeMgmtIP = mgmtPortConfig.ipv6.ifAddr.IP
1354-
// Wait for IPv6 address to become usable.
1355-
if err := ip.SettleAddresses(mgmtPortConfig.ifName, 10); err != nil {
1356-
return fmt.Errorf("failed to start Egress IP health checking server due to unsettled IPv6: %w on interface %s", err, mgmtPortConfig.ifName)
1357-
}
1358-
} else {
1359-
return fmt.Errorf("unable to start Egress IP health checking server on interface %s: no mgmt ip", mgmtPortConfig.ifName)
1360-
}
1361-
} else {
1362-
klog.Infof("Skipping interface %s as it does not have an IP address", mgmtPortConfig.ifName)
1363-
return nil
1317+
ifName := mgmtPort.GetInterfaceName()
1318+
mgmtAddresses := mgmtPort.GetAddresses()
1319+
if len(mgmtAddresses) == 0 {
1320+
return fmt.Errorf("unable to start Egress IP health checking server on interface %s: no mgmt ip", ifName)
1321+
}
1322+
1323+
mgmtAddress := mgmtAddresses[0]
1324+
if err := ip.SettleAddresses(ifName, 10); err != nil {
1325+
return fmt.Errorf("failed to start Egress IP health checking server due to unsettled IPv6: %w on interface %s", err, ifName)
13641326
}
13651327

1366-
healthServer, err := healthcheck.NewEgressIPHealthServer(nodeMgmtIP, healthCheckPort)
1328+
healthServer, err := healthcheck.NewEgressIPHealthServer(mgmtAddress.IP, healthCheckPort)
13671329
if err != nil {
13681330
return fmt.Errorf("unable to allocate health checking server: %v", err)
13691331
}

go-controller/pkg/node/gateway.go

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -527,14 +527,7 @@ func (g *gateway) addAllServices() []error {
527527
}
528528

529529
func (g *gateway) updateSNATRules() error {
530-
var ipnets []*net.IPNet
531-
if g.nodeIPManager.mgmtPortConfig.ipv4 != nil {
532-
ipnets = append(ipnets, g.nodeIPManager.mgmtPortConfig.ipv4.ifAddr)
533-
}
534-
if g.nodeIPManager.mgmtPortConfig.ipv6 != nil {
535-
ipnets = append(ipnets, g.nodeIPManager.mgmtPortConfig.ipv6.ifAddr)
536-
}
537-
subnets := util.IPsToNetworkIPs(ipnets...)
530+
subnets := util.IPsToNetworkIPs(g.nodeIPManager.mgmtPort.GetAddresses()...)
538531

539532
if g.GetDefaultPodNetworkAdvertised() || config.Gateway.Mode != config.GatewayModeLocal {
540533
return delLocalGatewayPodSubnetNATRules(subnets...)

go-controller/pkg/node/gateway_init.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config"
1616
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/factory"
1717
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/kube"
18+
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/managementport"
1819
nodenft "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/nftables"
1920
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/routemanager"
2021
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/types"
@@ -319,8 +320,12 @@ func configureSvcRouteViaInterface(routeManager *routemanager.Controller, iface
319320
// once OVN controller is ready and the patch port exists for this node.
320321
// It is split from initGatewayMainStart to allow for the gateway object and openflow manager to be created
321322
// before the rest of the gateway functionality is started.
322-
func (nc *DefaultNodeNetworkController) initGatewayPreStart(subnets []*net.IPNet, nodeAnnotator kube.Annotator,
323-
managementPortConfig *managementPortConfig, kubeNodeIP net.IP) (*gateway, error) {
323+
func (nc *DefaultNodeNetworkController) initGatewayPreStart(
324+
subnets []*net.IPNet,
325+
nodeAnnotator kube.Annotator,
326+
mgmtPort managementport.Interface,
327+
kubeNodeIP net.IP,
328+
) (*gateway, error) {
324329

325330
klog.Info("Initializing Gateway Functionality for Gateway PreStart")
326331
var err error
@@ -368,7 +373,7 @@ func (nc *DefaultNodeNetworkController) initGatewayPreStart(subnets []*net.IPNet
368373
egressGWInterface,
369374
ifAddrs,
370375
nodeAnnotator,
371-
managementPortConfig,
376+
mgmtPort,
372377
nc.Kube,
373378
nc.watchFactory,
374379
nc.routeManager,

0 commit comments

Comments
 (0)