Skip to content

Commit 7dabe4b

Browse files
don't remove BYO api server loadbalancer floating IP
Signed-off-by: alexandre.vilain <[email protected]>
1 parent d4baeb1 commit 7dabe4b

File tree

3 files changed

+62
-2
lines changed

3 files changed

+62
-2
lines changed

api/v1alpha7/openstackcluster_webhook.go

+6
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,12 @@ func (r *OpenStackCluster) ValidateUpdate(oldRaw runtime.Object) (admission.Warn
134134
old.Spec.AllowAllInClusterTraffic = false
135135
r.Spec.AllowAllInClusterTraffic = false
136136

137+
// Allow change on the spec.APIServerFloatingIP only if it matches the current api server loadbalancer IP.
138+
if old.Status.APIServerLoadBalancer != nil && r.Spec.APIServerFloatingIP == old.Status.APIServerLoadBalancer.IP {
139+
r.Spec.APIServerFloatingIP = ""
140+
old.Spec.APIServerFloatingIP = ""
141+
}
142+
137143
if !reflect.DeepEqual(old.Spec, r.Spec) {
138144
allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), "cannot be modified"))
139145
}

api/v1alpha7/openstackcluster_webhook_test.go

+48
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,54 @@ func TestOpenStackCluster_ValidateUpdate(t *testing.T) {
295295
},
296296
wantErr: true,
297297
},
298+
{
299+
name: "Changing OpenStackCluster.Spec.APIServerFloatingIP is allowed when it matches the current api server loadbalancer IP",
300+
oldTemplate: &OpenStackCluster{
301+
Spec: OpenStackClusterSpec{
302+
APIServerFloatingIP: "",
303+
},
304+
Status: OpenStackClusterStatus{
305+
APIServerLoadBalancer: &LoadBalancer{
306+
IP: "1.2.3.4",
307+
},
308+
},
309+
},
310+
newTemplate: &OpenStackCluster{
311+
Spec: OpenStackClusterSpec{
312+
APIServerFloatingIP: "1.2.3.4",
313+
},
314+
Status: OpenStackClusterStatus{
315+
APIServerLoadBalancer: &LoadBalancer{
316+
IP: "1.2.3.4",
317+
},
318+
},
319+
},
320+
wantErr: false,
321+
},
322+
{
323+
name: "Changing OpenStackCluster.Spec.APIServerFloatingIP is not allowed when it doesn't matches the current api server loadbalancer IP",
324+
oldTemplate: &OpenStackCluster{
325+
Spec: OpenStackClusterSpec{
326+
APIServerFloatingIP: "",
327+
},
328+
Status: OpenStackClusterStatus{
329+
APIServerLoadBalancer: &LoadBalancer{
330+
IP: "1.2.3.4",
331+
},
332+
},
333+
},
334+
newTemplate: &OpenStackCluster{
335+
Spec: OpenStackClusterSpec{
336+
APIServerFloatingIP: "5.6.7.8",
337+
},
338+
Status: OpenStackClusterStatus{
339+
APIServerLoadBalancer: &LoadBalancer{
340+
IP: "1.2.3.4",
341+
},
342+
},
343+
},
344+
wantErr: true,
345+
},
298346
}
299347
for _, tt := range tests {
300348
t.Run(tt.name, func(t *testing.T) {

pkg/cloud/services/loadbalancer/loadbalancer.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -491,8 +491,14 @@ func (s *Service) DeleteLoadBalancer(openStackCluster *infrav1.OpenStackCluster,
491491
if err = s.networkingService.DisassociateFloatingIP(openStackCluster, fip.FloatingIP); err != nil {
492492
return err
493493
}
494-
if err = s.networkingService.DeleteFloatingIP(openStackCluster, fip.FloatingIP); err != nil {
495-
return err
494+
495+
// If the floating is user-provider (BYO floating IP), don't delete it.
496+
if openStackCluster.Spec.APIServerFloatingIP != fip.FloatingIP {
497+
if err = s.networkingService.DeleteFloatingIP(openStackCluster, fip.FloatingIP); err != nil {
498+
return err
499+
}
500+
} else {
501+
s.scope.Logger().Info("Skipping load balancer floating IP deletion as it's a user-provided resource", "name", loadBalancerName, "fip", fip.FloatingIP)
496502
}
497503
}
498504
}

0 commit comments

Comments
 (0)