Skip to content
This repository was archived by the owner on Nov 12, 2025. It is now read-only.

Commit df34d2b

Browse files
authored
Merge pull request #43 from GDATASoftwareAG/configure-failover-groups
configure failover groups
2 parents 469179c + ebf3e38 commit df34d2b

12 files changed

+201
-5
lines changed

api/v1alpha1/ionoscloudcluster_types.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,15 @@ type IONOSLanSpec struct {
140140
LanID *int32 `json:"lanID,omitempty"` //validate?
141141
Name string `json:"name"` //validate?
142142
Public bool `json:"public"`
143+
// +listType=map
144+
// +listMapKey=id
145+
FailoverGroups []IONOSFailoverGroup `json:"failoverGroups,omitempty"`
143146
//NameTemplate string `json:"nameTemplate"`
144-
//FailoverIPs []string `json:"failoverIPs,omitempty"`
147+
}
148+
149+
type IONOSFailoverGroup struct {
150+
ID string `json:"id"`
151+
// NicUuid string `json:"nicUuid,omitempty"`
145152
}
146153

147154
type IONOSLoadBalancerSpec struct {

api/v1alpha1/zz_generated.deepcopy.go

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/infrastructure.cluster.x-k8s.io_ionoscloudclusters.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,18 @@ spec:
5959
lans:
6060
items:
6161
properties:
62+
failoverGroups:
63+
items:
64+
properties:
65+
id:
66+
type: string
67+
required:
68+
- id
69+
type: object
70+
type: array
71+
x-kubernetes-list-map-keys:
72+
- id
73+
x-kubernetes-list-type: map
6274
lanID:
6375
format: int32
6476
type: integer

config/crd/bases/infrastructure.cluster.x-k8s.io_ionoscloudclustertemplates.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,18 @@ spec:
6868
lans:
6969
items:
7070
properties:
71+
failoverGroups:
72+
items:
73+
properties:
74+
id:
75+
type: string
76+
required:
77+
- id
78+
type: object
79+
type: array
80+
x-kubernetes-list-map-keys:
81+
- id
82+
x-kubernetes-list-type: map
7183
lanID:
7284
format: int32
7385
type: integer

config/samples/cluster_template_ionoscloudcluster.yaml renamed to config/samples/cluster_ionoscloudcluster.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ spec:
1515
public: true
1616
- name: internet
1717
public: true
18+
failoverGroups:
19+
- id: 3682d039-e520-4837-810c-c43358949463
1820
loadBalancer:
1921
listenerLanRef:
2022
name: public

config/samples/infrastructure_v1alpha1_ionoscloudmachinetemplate-control-plane.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ spec:
99
ram: 4096
1010
cpuFamily: "INTEL_SKYLAKE"
1111
bootVolume:
12-
image: "a9152e16-2482-11ee-9eb0-82cf6aa9b8c3"
12+
image: "3c2a7c7a-8488-11ee-811f-826459b45e91"
1313
type: "HDD"
1414
size: "25"
1515
nics:

config/samples/infrastructure_v1alpha1_ionoscloudmachinetemplate-worker.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ spec:
99
ram: 2048
1010
cpuFamily: "INTEL_SKYLAKE"
1111
bootVolume:
12-
image: "a9152e16-2482-11ee-9eb0-82cf6aa9b8c3"
12+
image: "3c2a7c7a-8488-11ee-811f-826459b45e91"
1313
type: "HDD"
1414
size: "25"
1515
nics:

config/samples/kubeadmcontrolplane.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,4 @@ spec:
4747
kind: IONOSCloudMachineTemplate
4848
name: ionoscloudcluster-control-plane
4949
replicas: 3
50-
version: "1.25.11"
50+
version: "1.27.6"

config/samples/machinedeployment.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ spec:
2525
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
2626
kind: IONOSCloudMachineTemplate
2727
name: ionoscloudcluster-worker
28-
version: "1.25.11"
28+
version: "1.27.6"

internal/controller/ionoscloudmachine_controller.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
422476
func (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+
497562
func findAndDeleteByIP(s []ionoscloud.NetworkLoadBalancerForwardingRuleTarget, item ionoscloud.NetworkLoadBalancerForwardingRuleTarget) []ionoscloud.NetworkLoadBalancerForwardingRuleTarget {
498563
index := 0
499564
for _, i := range s {

0 commit comments

Comments
 (0)