@@ -29,7 +29,9 @@ import (
29
29
"github.com/pkg/errors"
30
30
apierrors "k8s.io/apimachinery/pkg/api/errors"
31
31
"k8s.io/client-go/tools/record"
32
+ "k8s.io/utils/pointer"
32
33
clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha4"
34
+ capierrors "sigs.k8s.io/cluster-api/errors"
33
35
"sigs.k8s.io/cluster-api/util"
34
36
"sigs.k8s.io/cluster-api/util/annotations"
35
37
"sigs.k8s.io/cluster-api/util/patch"
@@ -143,21 +145,25 @@ func reconcileDelete(ctx context.Context, log logr.Logger, client client.Client,
143
145
144
146
if openStackCluster .Spec .ManagedAPIServerLoadBalancer {
145
147
if err = loadBalancerService .DeleteLoadBalancer (openStackCluster , clusterName ); err != nil {
148
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to delete load balancer: %v" , err ))
146
149
return reconcile.Result {}, errors .Errorf ("failed to delete load balancer: %v" , err )
147
150
}
148
151
}
149
152
150
153
if err = networkingService .DeleteSecurityGroups (openStackCluster , clusterName ); err != nil {
154
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to delete security groups: %v" , err ))
151
155
return reconcile.Result {}, errors .Errorf ("failed to delete security groups: %v" , err )
152
156
}
153
157
154
158
// if NodeCIDR was not set, no network was created.
155
159
if openStackCluster .Spec .NodeCIDR != "" {
156
160
if err = networkingService .DeleteRouter (openStackCluster , clusterName ); err != nil {
161
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to delete router: %v" , err ))
157
162
return ctrl.Result {}, errors .Errorf ("failed to delete router: %v" , err )
158
163
}
159
164
160
165
if err = networkingService .DeleteNetwork (openStackCluster , clusterName ); err != nil {
166
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to delete network: %v" , err ))
161
167
return ctrl.Result {}, errors .Errorf ("failed to delete network: %v" , err )
162
168
}
163
169
}
@@ -197,22 +203,26 @@ func deleteBastion(log logr.Logger, osProviderClient *gophercloud.ProviderClient
197
203
198
204
if instance != nil && instance .FloatingIP != "" {
199
205
if err = networkingService .DisassociateFloatingIP (openStackCluster , instance .FloatingIP ); err != nil {
206
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to disassociate floating IP: %v" , err ))
200
207
return errors .Errorf ("failed to disassociate floating IP: %v" , err )
201
208
}
202
209
if err = networkingService .DeleteFloatingIP (openStackCluster , instance .FloatingIP ); err != nil {
210
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to delete floating IP: %v" , err ))
203
211
return errors .Errorf ("failed to delete floating IP: %v" , err )
204
212
}
205
213
}
206
214
207
215
if instance != nil && instance .Name != "" {
208
216
if err = computeService .DeleteInstance (openStackCluster , instance .Name ); err != nil {
217
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to delete bastion: %v" , err ))
209
218
return errors .Errorf ("failed to delete bastion: %v" , err )
210
219
}
211
220
}
212
221
213
222
openStackCluster .Status .Bastion = nil
214
223
215
224
if err = networkingService .DeleteBastionSecurityGroup (openStackCluster , fmt .Sprintf ("%s-%s" , cluster .Namespace , cluster .Name )); err != nil {
225
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to delete bastion security group: %v" , err ))
216
226
return errors .Errorf ("failed to delete bastion security group: %v" , err )
217
227
}
218
228
openStackCluster .Status .BastionSecurityGroup = nil
@@ -307,6 +317,7 @@ func reconcileBastion(log logr.Logger, osProviderClient *gophercloud.ProviderCli
307
317
308
318
instance , err = computeService .CreateBastion (openStackCluster , cluster .Name )
309
319
if err != nil {
320
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to reconcile bastion: %v" , err ))
310
321
return errors .Errorf ("failed to reconcile bastion: %v" , err )
311
322
}
312
323
@@ -317,10 +328,12 @@ func reconcileBastion(log logr.Logger, osProviderClient *gophercloud.ProviderCli
317
328
clusterName := fmt .Sprintf ("%s-%s" , cluster .Namespace , cluster .Name )
318
329
fp , err := networkingService .GetOrCreateFloatingIP (openStackCluster , clusterName , openStackCluster .Spec .Bastion .Instance .FloatingIP )
319
330
if err != nil {
331
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to get or create floating IP for bastion: %v" , err ))
320
332
return errors .Errorf ("failed to get or create floating IP for bastion: %v" , err )
321
333
}
322
334
err = computeService .AssociateFloatingIP (instance .ID , fp .FloatingIP )
323
335
if err != nil {
336
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to associate floating IP with bastion: %v" , err ))
324
337
return errors .Errorf ("failed to associate floating IP with bastion: %v" , err )
325
338
}
326
339
instance .FloatingIP = fp .FloatingIP
@@ -345,6 +358,7 @@ func reconcileNetworkComponents(log logr.Logger, osProviderClient *gophercloud.P
345
358
346
359
err = networkingService .ReconcileExternalNetwork (openStackCluster )
347
360
if err != nil {
361
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to reconcile external network: %v" , err ))
348
362
return errors .Errorf ("failed to reconcile external network: %v" , err )
349
363
}
350
364
@@ -354,12 +368,15 @@ func reconcileNetworkComponents(log logr.Logger, osProviderClient *gophercloud.P
354
368
netOpts := networks .ListOpts (openStackCluster .Spec .Network )
355
369
networkList , err := networkingService .GetNetworksByFilter (& netOpts )
356
370
if err != nil {
371
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to find network: %v" , err ))
357
372
return errors .Errorf ("failed to find network: %v" , err )
358
373
}
359
374
if len (networkList ) == 0 {
375
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to find any network: %v" , err ))
360
376
return errors .Errorf ("failed to find any network: %v" , err )
361
377
}
362
378
if len (networkList ) > 1 {
379
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to find only one network (result: %v): %v" , networkList , err ))
363
380
return errors .Errorf ("failed to find only one network (result: %v): %v" , networkList , err )
364
381
}
365
382
openStackCluster .Status .Network = & infrav1.Network {
@@ -372,9 +389,11 @@ func reconcileNetworkComponents(log logr.Logger, osProviderClient *gophercloud.P
372
389
subnetOpts .NetworkID = networkList [0 ].ID
373
390
subnetList , err := networkingService .GetSubnetsByFilter (& subnetOpts )
374
391
if err != nil || len (subnetList ) == 0 {
392
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to find subnet: %v" , err ))
375
393
return errors .Errorf ("failed to find subnet: %v" , err )
376
394
}
377
395
if len (subnetList ) > 1 {
396
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to find only one subnet (result: %v): %v" , subnetList , err ))
378
397
return errors .Errorf ("failed to find only one subnet (result: %v): %v" , subnetList , err )
379
398
}
380
399
openStackCluster .Status .Network .Subnet = & infrav1.Subnet {
@@ -386,14 +405,17 @@ func reconcileNetworkComponents(log logr.Logger, osProviderClient *gophercloud.P
386
405
} else {
387
406
err := networkingService .ReconcileNetwork (openStackCluster , clusterName )
388
407
if err != nil {
408
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to reconcile network: %v" , err ))
389
409
return errors .Errorf ("failed to reconcile network: %v" , err )
390
410
}
391
411
err = networkingService .ReconcileSubnet (openStackCluster , clusterName )
392
412
if err != nil {
413
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to reconcile subnets: %v" , err ))
393
414
return errors .Errorf ("failed to reconcile subnets: %v" , err )
394
415
}
395
416
err = networkingService .ReconcileRouter (openStackCluster , clusterName )
396
417
if err != nil {
418
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to reconcile router: %v" , err ))
397
419
return errors .Errorf ("failed to reconcile router: %v" , err )
398
420
}
399
421
}
@@ -406,6 +428,7 @@ func reconcileNetworkComponents(log logr.Logger, osProviderClient *gophercloud.P
406
428
}
407
429
fp , err := networkingService .GetOrCreateFloatingIP (openStackCluster , clusterName , openStackCluster .Spec .APIServerFloatingIP )
408
430
if err != nil {
431
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("Floating IP cannot be got or created: %v" , err ))
409
432
return errors .Errorf ("Floating IP cannot be got or created: %v" , err )
410
433
}
411
434
// Set APIEndpoints so the Cluster API Cluster Controller can pull them
@@ -417,12 +440,14 @@ func reconcileNetworkComponents(log logr.Logger, osProviderClient *gophercloud.P
417
440
418
441
err = networkingService .ReconcileSecurityGroups (openStackCluster , clusterName )
419
442
if err != nil {
443
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to reconcile security groups: %v" , err ))
420
444
return errors .Errorf ("failed to reconcile security groups: %v" , err )
421
445
}
422
446
423
447
if openStackCluster .Spec .ManagedAPIServerLoadBalancer {
424
448
err = loadBalancerService .ReconcileLoadBalancer (openStackCluster , clusterName )
425
449
if err != nil {
450
+ handleUpdateOSCError (openStackCluster , errors .Errorf ("failed to reconcile load balancer: %v" , err ))
426
451
return errors .Errorf ("failed to reconcile load balancer: %v" , err )
427
452
}
428
453
}
@@ -478,3 +503,9 @@ func (r *OpenStackClusterReconciler) SetupWithManager(ctx context.Context, mgr c
478
503
WithEventFilter (predicates .ResourceIsNotExternallyManaged (ctrl .LoggerFrom (ctx ))).
479
504
Complete (r )
480
505
}
506
+
507
+ func handleUpdateOSCError (openstackCluster * infrav1.OpenStackCluster , message error ) {
508
+ err := capierrors .UpdateClusterError
509
+ openstackCluster .Status .FailureReason = & err
510
+ openstackCluster .Status .FailureMessage = pointer .StringPtr (message .Error ())
511
+ }
0 commit comments