Skip to content

Commit 9643251

Browse files
committed
Add fatal switch to handleUpdateOSCError
so we have the else path for some future logging/state improvments Set most errors to transient/non-fatal
1 parent a63ce56 commit 9643251

File tree

2 files changed

+42
-35
lines changed

2 files changed

+42
-35
lines changed

controllers/openstackcluster_controller.go

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -175,31 +175,31 @@ func (r *OpenStackClusterReconciler) reconcileDelete(ctx context.Context, scope
175175
}
176176

177177
if err = loadBalancerService.DeleteLoadBalancer(openStackCluster, clusterResourceName); err != nil {
178-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete load balancer: %w", err))
178+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete load balancer: %w", err), false)
179179
return reconcile.Result{}, fmt.Errorf("failed to delete load balancer: %w", err)
180180
}
181181
}
182182

183183
// if ManagedSubnets was not set, no network was created.
184184
if len(openStackCluster.Spec.ManagedSubnets) > 0 {
185185
if err = networkingService.DeleteRouter(openStackCluster, clusterResourceName); err != nil {
186-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete router: %w", err))
186+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete router: %w", err), false)
187187
return ctrl.Result{}, fmt.Errorf("failed to delete router: %w", err)
188188
}
189189

190190
if err = networkingService.DeleteClusterPorts(openStackCluster); err != nil {
191-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete ports: %w", err))
191+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete ports: %w", err), false)
192192
return reconcile.Result{}, fmt.Errorf("failed to delete ports: %w", err)
193193
}
194194

195195
if err = networkingService.DeleteNetwork(openStackCluster, clusterResourceName); err != nil {
196-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete network: %w", err))
196+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete network: %w", err), false)
197197
return ctrl.Result{}, fmt.Errorf("failed to delete network: %w", err)
198198
}
199199
}
200200

201201
if err = networkingService.DeleteSecurityGroups(openStackCluster, clusterResourceName); err != nil {
202-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete security groups: %w", err))
202+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete security groups: %w", err), false)
203203
return reconcile.Result{}, fmt.Errorf("failed to delete security groups: %w", err)
204204
}
205205

@@ -271,7 +271,7 @@ func deleteBastion(scope *scope.WithLogger, cluster *clusterv1.Cluster, openStac
271271

272272
if openStackCluster.Status.Bastion != nil && openStackCluster.Status.Bastion.FloatingIP != "" {
273273
if err = networkingService.DeleteFloatingIP(openStackCluster, openStackCluster.Status.Bastion.FloatingIP); err != nil {
274-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete floating IP: %w", err))
274+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete floating IP: %w", err), false)
275275
return fmt.Errorf("failed to delete floating IP: %w", err)
276276
}
277277
}
@@ -311,14 +311,14 @@ func deleteBastion(scope *scope.WithLogger, cluster *clusterv1.Cluster, openStac
311311
if address.Type == corev1.NodeExternalIP {
312312
// Floating IP may not have properly saved in bastion status (thus not deleted above), delete any remaining floating IP
313313
if err = networkingService.DeleteFloatingIP(openStackCluster, address.Address); err != nil {
314-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete floating IP: %w", err))
314+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete floating IP: %w", err), false)
315315
return fmt.Errorf("failed to delete floating IP: %w", err)
316316
}
317317
}
318318
}
319319

320320
if err = computeService.DeleteInstance(openStackCluster, instanceStatus); err != nil {
321-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete bastion: %w", err))
321+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete bastion: %w", err), false)
322322
return fmt.Errorf("failed to delete bastion: %w", err)
323323
}
324324
}
@@ -330,7 +330,7 @@ func deleteBastion(scope *scope.WithLogger, cluster *clusterv1.Cluster, openStac
330330
}
331331
for _, port := range bastionStatus.Resources.Ports {
332332
if err := networkingService.DeleteInstanceTrunkAndPort(openStackCluster, port, trunkSupported); err != nil {
333-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete port: %w", err))
333+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete port: %w", err), false)
334334
return fmt.Errorf("failed to delete port: %w", err)
335335
}
336336
}
@@ -459,7 +459,7 @@ func reconcileBastion(scope *scope.WithLogger, cluster *clusterv1.Cluster, openS
459459

460460
err = getOrCreateBastionPorts(openStackCluster, networkingService)
461461
if err != nil {
462-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to get or create ports for bastion: %w", err))
462+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to get or create ports for bastion: %w", err), false)
463463
return nil, fmt.Errorf("failed to get or create ports for bastion: %w", err)
464464
}
465465
bastionPortIDs := GetPortIDs(openStackCluster.Status.Bastion.Resources.Ports)
@@ -504,7 +504,7 @@ func reconcileBastion(scope *scope.WithLogger, cluster *clusterv1.Cluster, openS
504504
port, err := computeService.GetManagementPort(openStackCluster, instanceStatus)
505505
if err != nil {
506506
err = fmt.Errorf("getting management port for bastion: %w", err)
507-
handleUpdateOSCError(openStackCluster, err)
507+
handleUpdateOSCError(openStackCluster, err, false)
508508
return nil, err
509509
}
510510

@@ -514,7 +514,7 @@ func reconcileBastion(scope *scope.WithLogger, cluster *clusterv1.Cluster, openS
514514
func bastionAddFloatingIP(openStackCluster *infrav1.OpenStackCluster, clusterResourceName string, port *ports.Port, networkingService *networking.Service) (*reconcile.Result, error) {
515515
fp, err := networkingService.GetFloatingIPByPortID(port.ID)
516516
if err != nil {
517-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to get or create floating IP for bastion: %w", err))
517+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to get or create floating IP for bastion: %w", err), false)
518518
return nil, fmt.Errorf("failed to get floating IP for bastion port: %w", err)
519519
}
520520
if fp != nil {
@@ -535,14 +535,14 @@ func bastionAddFloatingIP(openStackCluster *infrav1.OpenStackCluster, clusterRes
535535
// Check if there is an existing floating IP attached to bastion, in case where FloatingIP would not yet have been stored in cluster status
536536
fp, err = networkingService.GetOrCreateFloatingIP(openStackCluster, openStackCluster, clusterResourceName, floatingIP)
537537
if err != nil {
538-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to get or create floating IP for bastion: %w", err))
538+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to get or create floating IP for bastion: %w", err), false)
539539
return nil, fmt.Errorf("failed to get or create floating IP for bastion: %w", err)
540540
}
541541
openStackCluster.Status.Bastion.FloatingIP = fp.FloatingIP
542542

543543
err = networkingService.AssociateFloatingIP(openStackCluster, fp, port.ID)
544544
if err != nil {
545-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to associate floating IP with bastion: %w", err))
545+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to associate floating IP with bastion: %w", err), false)
546546
return nil, fmt.Errorf("failed to associate floating IP with bastion: %w", err)
547547
}
548548

@@ -644,7 +644,9 @@ func resolveLoadBalancerNetwork(openStackCluster *infrav1.OpenStackCluster, netw
644644
if lbSpec.Network != nil {
645645
lbNet, err := networkingService.GetNetworkByParam(lbSpec.Network)
646646
if err != nil {
647-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to find loadbalancer network: %w", err))
647+
if errors.Is(err, capoerrors.ErrFilterMatch) {
648+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to find loadbalancer network: %w", err), true)
649+
}
648650
return fmt.Errorf("failed to find network: %w", err)
649651
}
650652

@@ -666,7 +668,7 @@ func resolveLoadBalancerNetwork(openStackCluster *infrav1.OpenStackCluster, netw
666668
}
667669
}
668670
if !matchFound {
669-
handleUpdateOSCError(openStackCluster, fmt.Errorf("no subnet match was found in the specified network (specified subnet: %v, available subnets: %v)", s, lbNet.Subnets))
671+
handleUpdateOSCError(openStackCluster, fmt.Errorf("no subnet match was found in the specified network (specified subnet: %v, available subnets: %v)", s, lbNet.Subnets), false)
670672
return fmt.Errorf("no subnet match was found in the specified network (specified subnet: %v, available subnets: %v)", s, lbNet.Subnets)
671673
}
672674
}
@@ -688,7 +690,7 @@ func reconcileNetworkComponents(scope *scope.WithLogger, cluster *clusterv1.Clus
688690

689691
err = networkingService.ReconcileExternalNetwork(openStackCluster)
690692
if err != nil {
691-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to reconcile external network: %w", err))
693+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to reconcile external network: %w", err), false)
692694
return fmt.Errorf("failed to reconcile external network: %w", err)
693695
}
694696

@@ -706,13 +708,13 @@ func reconcileNetworkComponents(scope *scope.WithLogger, cluster *clusterv1.Clus
706708

707709
err = resolveLoadBalancerNetwork(openStackCluster, networkingService)
708710
if err != nil {
709-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to reconcile loadbalancer network: %w", err))
711+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to reconcile loadbalancer network: %w", err), false)
710712
return fmt.Errorf("failed to reconcile loadbalancer network: %w", err)
711713
}
712714

713715
err = networkingService.ReconcileSecurityGroups(openStackCluster, clusterResourceName)
714716
if err != nil {
715-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to reconcile security groups: %w", err))
717+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to reconcile security groups: %w", err), false)
716718
return fmt.Errorf("failed to reconcile security groups: %w", err)
717719
}
718720

@@ -732,7 +734,7 @@ func reconcilePreExistingNetworkComponents(scope *scope.WithLogger, networkingSe
732734
if openStackCluster.Spec.Network != nil {
733735
network, err := networkingService.GetNetworkByParam(openStackCluster.Spec.Network)
734736
if err != nil {
735-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to find network: %w", err))
737+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to find network: %w", err), false)
736738
return fmt.Errorf("error fetching cluster network: %w", err)
737739
}
738740
setClusterNetwork(openStackCluster, network)
@@ -776,17 +778,17 @@ func reconcilePreExistingNetworkComponents(scope *scope.WithLogger, networkingSe
776778
func reconcileProvisionedNetworkComponents(networkingService *networking.Service, openStackCluster *infrav1.OpenStackCluster, clusterResourceName string) error {
777779
err := networkingService.ReconcileNetwork(openStackCluster, clusterResourceName)
778780
if err != nil {
779-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to reconcile network: %w", err))
781+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to reconcile network: %w", err), false)
780782
return fmt.Errorf("failed to reconcile network: %w", err)
781783
}
782784
err = networkingService.ReconcileSubnet(openStackCluster, clusterResourceName)
783785
if err != nil {
784-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to reconcile subnets: %w", err))
786+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to reconcile subnets: %w", err), false)
785787
return fmt.Errorf("failed to reconcile subnets: %w", err)
786788
}
787789
err = networkingService.ReconcileRouter(openStackCluster, clusterResourceName)
788790
if err != nil {
789-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to reconcile router: %w", err))
791+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to reconcile router: %w", err), false)
790792
return fmt.Errorf("failed to reconcile router: %w", err)
791793
}
792794

@@ -815,10 +817,7 @@ func reconcileControlPlaneEndpoint(scope *scope.WithLogger, networkingService *n
815817

816818
terminalFailure, err := loadBalancerService.ReconcileLoadBalancer(openStackCluster, clusterResourceName, apiServerPort)
817819
if err != nil {
818-
// if it's terminalFailure (not Transient), set the Failure reason and message
819-
if terminalFailure {
820-
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to reconcile load balancer: %w", err))
821-
}
820+
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to reconcile load balancer: %w", err), terminalFailure)
822821
return fmt.Errorf("failed to reconcile load balancer: %w", err)
823822
}
824823

@@ -840,7 +839,7 @@ func reconcileControlPlaneEndpoint(scope *scope.WithLogger, networkingService *n
840839
case !ptr.Deref(openStackCluster.Spec.DisableAPIServerFloatingIP, false):
841840
fp, err := networkingService.GetOrCreateFloatingIP(openStackCluster, openStackCluster, clusterResourceName, openStackCluster.Spec.APIServerFloatingIP)
842841
if err != nil {
843-
handleUpdateOSCError(openStackCluster, fmt.Errorf("floating IP cannot be got or created: %w", err))
842+
handleUpdateOSCError(openStackCluster, fmt.Errorf("floating IP cannot be got or created: %w", err), false)
844843
return fmt.Errorf("floating IP cannot be got or created: %w", err)
845844
}
846845
host = fp.FloatingIP
@@ -855,7 +854,7 @@ func reconcileControlPlaneEndpoint(scope *scope.WithLogger, networkingService *n
855854
// Control plane endpoint is not set, and none can be created
856855
default:
857856
err := fmt.Errorf("unable to determine control plane endpoint")
858-
handleUpdateOSCError(openStackCluster, err)
857+
handleUpdateOSCError(openStackCluster, err, false)
859858
return err
860859
}
861860

@@ -912,10 +911,12 @@ func (r *OpenStackClusterReconciler) SetupWithManager(ctx context.Context, mgr c
912911
Complete(r)
913912
}
914913

915-
func handleUpdateOSCError(openstackCluster *infrav1.OpenStackCluster, message error) {
916-
err := capierrors.UpdateClusterError
917-
openstackCluster.Status.FailureReason = &err
918-
openstackCluster.Status.FailureMessage = ptr.To(message.Error())
914+
func handleUpdateOSCError(openstackCluster *infrav1.OpenStackCluster, message error, isFatal bool) {
915+
if isFatal {
916+
err := capierrors.UpdateClusterError
917+
openstackCluster.Status.FailureReason = &err
918+
openstackCluster.Status.FailureMessage = ptr.To(message.Error())
919+
}
919920
}
920921

921922
// getClusterSubnets retrieves the subnets based on the Subnet filters specified on OpenstackCluster.
@@ -941,7 +942,7 @@ func getClusterSubnets(networkingService *networking.Service, openStackCluster *
941942
if err != nil {
942943
err = fmt.Errorf("failed to find subnets: %w", err)
943944
if errors.Is(err, capoerrors.ErrFilterMatch) {
944-
handleUpdateOSCError(openStackCluster, err)
945+
handleUpdateOSCError(openStackCluster, err, true)
945946
}
946947
return nil, err
947948
}
@@ -954,7 +955,7 @@ func getClusterSubnets(networkingService *networking.Service, openStackCluster *
954955
if err != nil {
955956
err = fmt.Errorf("failed to find subnet %d in network %s: %w", subnet, networkID, err)
956957
if errors.Is(err, capoerrors.ErrFilterMatch) {
957-
handleUpdateOSCError(openStackCluster, err)
958+
handleUpdateOSCError(openStackCluster, err, true)
958959
}
959960
return nil, err
960961
}

pkg/cloud/services/loadbalancer/loadbalancer.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
8282

8383
lb, err := s.getOrCreateAPILoadBalancer(openStackCluster, clusterResourceName)
8484
if err != nil {
85+
if errors.Is(err, capoerrors.ErrFilterMatch) {
86+
return true, err
87+
}
8588
return false, err
8689
}
8790

@@ -107,6 +110,9 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
107110

108111
fp, err := s.networkingService.GetOrCreateFloatingIP(openStackCluster, openStackCluster, clusterResourceName, floatingIPAddress)
109112
if err != nil {
113+
if errors.Is(err, capoerrors.ErrFilterMatch) {
114+
return true, err
115+
}
110116
return false, err
111117
}
112118

0 commit comments

Comments
 (0)