@@ -414,11 +414,65 @@ func (r *IONOSCloudMachineReconciler) reconcileServer(ctx *context.MachineContex
414414 return & reconcile.Result {RequeueAfter : defaultRetryIntervalOnBusy }, errors .New ("server does not have an ip yet" )
415415 }
416416
417+ err = r .reconcileFailoverGroups (ctx , server )
418+ if err != nil {
419+ return & reconcile.Result {RequeueAfter : defaultRetryIntervalOnBusy }, err
420+ }
421+
417422 conditions .MarkTrue (ctx .IONOSCloudMachine , v1alpha1 .ServerCreatedCondition )
418423
419424 return nil , nil
420425}
421426
427+ func (r * IONOSCloudMachineReconciler ) reconcileFailoverGroups (ctx * context.MachineContext , server ionoscloud.Server ) error {
428+ for i := range ctx .IONOSCloudCluster .Spec .Lans {
429+ lanSpec := & ctx .IONOSCloudCluster .Spec .Lans [i ]
430+ serverNic := serverNicByLan (server , lanSpec )
431+ if serverNic == nil {
432+ continue
433+ }
434+ for k := range lanSpec .FailoverGroups {
435+ group := & lanSpec .FailoverGroups [k ]
436+ ctx .Logger .Info ("Reconciling failover group " + group .ID )
437+
438+ block , _ , err := ctx .IONOSClient .GetIPBlock (ctx , group .ID )
439+ if err != nil {
440+ return err
441+ }
442+ for _ , ip := range * block .Properties .Ips {
443+ err = ctx .IONOSClient .EnsureAdditionalIPOnNic (ctx , ctx .IONOSCloudCluster .Spec .DataCenterID , ctx .IONOSCloudMachine .Spec .ProviderID , * serverNic .Id , ip )
444+ if err != nil {
445+ return err
446+ }
447+ lanId := fmt .Sprint (* lanSpec .LanID )
448+ lan , _ , err := ctx .IONOSClient .GetLan (ctx , ctx .IONOSCloudCluster .Spec .DataCenterID , lanId )
449+ if err != nil {
450+ return err
451+ }
452+ registered := false
453+ if lan .Properties .IpFailover != nil {
454+ for _ , f := range * lan .Properties .IpFailover {
455+ if * f .Ip == ip {
456+ registered = true
457+ continue
458+ }
459+ }
460+ if registered {
461+ continue
462+ }
463+ }
464+
465+ //todo only once per cluster and change if machine gets delete
466+ err = ctx .IONOSClient .EnsureFailoverIPOnLan (ctx , ctx .IONOSCloudCluster .Spec .DataCenterID , lanId , ip , * serverNic .Id )
467+ if err != nil {
468+ return err
469+ }
470+ }
471+ }
472+ }
473+ return nil
474+ }
475+
422476func (r * IONOSCloudMachineReconciler ) reconcileLoadBalancerForwardingRule (ctx * context.MachineContext ) (* reconcile.Result , error ) {
423477 ctx .Logger .Info ("Reconciling load balancer forwarding rule" )
424478
@@ -494,6 +548,17 @@ func (r *IONOSCloudMachineReconciler) SetupWithManager(mgr ctrl.Manager) error {
494548 Complete (r )
495549}
496550
551+ func serverNicByLan (server ionoscloud.Server , lan * v1alpha1.IONOSLanSpec ) * ionoscloud.Nic {
552+ var serverNic * ionoscloud.Nic
553+ for _ , nic := range * server .Entities .Nics .Items {
554+ if * nic .Properties .Lan == * lan .LanID {
555+ serverNic = & nic
556+ break
557+ }
558+ }
559+ return serverNic
560+ }
561+
497562func findAndDeleteByIP (s []ionoscloud.NetworkLoadBalancerForwardingRuleTarget , item ionoscloud.NetworkLoadBalancerForwardingRuleTarget ) []ionoscloud.NetworkLoadBalancerForwardingRuleTarget {
498563 index := 0
499564 for _ , i := range s {
0 commit comments