diff --git a/controllers/loadbalancer_controller.go b/controllers/loadbalancer_controller.go index e651177..fa98081 100644 --- a/controllers/loadbalancer_controller.go +++ b/controllers/loadbalancer_controller.go @@ -336,6 +336,13 @@ func (r *LoadBalancerReconciler) applyLoadBalancer(ctx context.Context, log logr return netip.Addr{}, err } log.V(1).Info("Added loadbalancer route if not existed") + + // Since it can not be ensured that we have not missed loadbalancer targets we ask for vni routes + log.V(1).Info("Get routes and add possibly missing route at the first place", "vni", vni) + if err := r.RouteUtil.GetRoutesForVni(ctx, metalbond.VNI(vni)); err != nil { + return netip.Addr{}, err + } + return *lbalancer.Spec.UnderlayRoute, nil } diff --git a/main.go b/main.go index 777ad1f..e9ad6ce 100644 --- a/main.go +++ b/main.go @@ -322,15 +322,6 @@ func main() { mbInstance := mb.NewMetalBond(config, metalnetMBClient) metalbondRouteUtil := metalbond.NewMBRouteUtil(mbInstance) - for _, metalbondPeer := range metalbondPeers { - if err := mbInstance.AddPeer(metalbondPeer, ""); err != nil { - setupLog.Error(err, "failed to add metalbond peer", "MetalbondPeer", metalbondPeer) - os.Exit(1) - } - } - - metalnetMBClient.SetMetalBond(mbInstance) - dpdkUUID, err := dpdkProtoClient.CheckInitialized(context.Background(), &dpdkproto.CheckInitializedRequest{}) if err != nil { _, err = dpdkProtoClient.Initialize(context.Background(), &dpdkproto.InitializeRequest{}) @@ -363,6 +354,15 @@ func main() { "metalnetProtocol", protoVersion.ClientProtocol, "metalnetVersion", protoVersion.ClientVersion) + for _, metalbondPeer := range metalbondPeers { + if err := mbInstance.AddPeer(metalbondPeer, ""); err != nil { + setupLog.Error(err, "failed to add metalbond peer", "MetalbondPeer", metalbondPeer) + os.Exit(1) + } + } + + metalnetMBClient.SetMetalBond(mbInstance) + if err := metalnetclient.SetupNetworkInterfaceNetworkRefNameFieldIndexer(context.TODO(), mgr.GetFieldIndexer()); err != nil { setupLog.Error(err, "unable to set up field indexer", "Field", metalnetclient.NetworkInterfaceNetworkRefNameField) os.Exit(1) diff --git a/metalbond/metalbond_client.go b/metalbond/metalbond_client.go index a2c41fe..eaf3bc8 100644 --- a/metalbond/metalbond_client.go +++ b/metalbond/metalbond_client.go @@ -55,7 +55,8 @@ func (c *MetalnetClient) addLocalRoute(destVni mb.VNI, vni mb.VNI, dest mb.Desti ip := dest.Prefix.Addr().String() uid, ok := c.metalnetCache.GetLoadBalancerServer(uint32(vni), ip) if !ok { - return fmt.Errorf("no registered LoadBalancer on this client for vni %d and ip %s", vni, ip) + c.log.Info(fmt.Sprintf("no registered LoadBalancer on this client for vni %d and ip %s", vni, ip)) + return nil } if c.config.PreferredNetwork != nil { @@ -124,7 +125,8 @@ func (c *MetalnetClient) removeLocalRoute(destVni mb.VNI, vni mb.VNI, dest mb.De ip := dest.Prefix.Addr().String() uid, ok := c.metalnetCache.GetLoadBalancerServer(uint32(vni), ip) if !ok { - return fmt.Errorf("no registered LoadBalancer on this client for vni %d and ip %s", vni, ip) + c.log.Info(fmt.Sprintf("no registered LoadBalancer on this client for vni %d and ip %s", vni, ip)) + return nil } if _, err := c.dpdk.DeleteLoadBalancerTarget( ctx,