@@ -19,6 +19,7 @@ package controllers
19
19
import (
20
20
"context"
21
21
"fmt"
22
+ "reflect"
22
23
23
24
"github.com/go-logr/logr"
24
25
"github.com/gophercloud/gophercloud"
@@ -41,7 +42,11 @@ import (
41
42
"sigs.k8s.io/controller-runtime/pkg/client"
42
43
"sigs.k8s.io/controller-runtime/pkg/controller"
43
44
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
45
+ "sigs.k8s.io/controller-runtime/pkg/event"
46
+ "sigs.k8s.io/controller-runtime/pkg/handler"
47
+ "sigs.k8s.io/controller-runtime/pkg/predicate"
44
48
"sigs.k8s.io/controller-runtime/pkg/reconcile"
49
+ "sigs.k8s.io/controller-runtime/pkg/source"
45
50
)
46
51
47
52
// OpenStackClusterReconciler reconciles a OpenStackCluster object
@@ -75,11 +80,6 @@ func (r *OpenStackClusterReconciler) Reconcile(req ctrl.Request) (_ ctrl.Result,
75
80
return reconcile.Result {}, err
76
81
}
77
82
78
- if isPaused (cluster , openStackCluster ) {
79
- log .Info ("OpenStackCluster or linked Cluster is marked as paused. Won't reconcile" )
80
- return reconcile.Result {}, nil
81
- }
82
-
83
83
if cluster == nil {
84
84
log .Info ("Cluster Controller has not yet set OwnerRef" )
85
85
return reconcile.Result {}, nil
@@ -438,9 +438,109 @@ func (r *OpenStackClusterReconciler) reconcileNetworkComponents(log logr.Logger,
438
438
}
439
439
440
440
func (r * OpenStackClusterReconciler ) SetupWithManager (mgr ctrl.Manager , options controller.Options ) error {
441
- return ctrl .NewControllerManagedBy (mgr ).
441
+ controller , err := ctrl .NewControllerManagedBy (mgr ).
442
442
WithOptions (options ).
443
443
For (& infrav1.OpenStackCluster {}).
444
- WithEventFilter (pausePredicates ).
445
- Complete (r )
444
+ WithEventFilter (pausedPredicates (r .Log )).
445
+ WithEventFilter (
446
+ predicate.Funcs {
447
+ // Avoid reconciling if the event triggering the reconciliation is related to incremental status updates
448
+ // for OpenStackCluster resources only
449
+ UpdateFunc : func (e event.UpdateEvent ) bool {
450
+ if e .ObjectOld .GetObjectKind ().GroupVersionKind ().Kind != "OpenStackCluster" {
451
+ return true
452
+ }
453
+
454
+ oldCluster := e .ObjectOld .(* infrav1.OpenStackCluster ).DeepCopy ()
455
+ newCluster := e .ObjectNew .(* infrav1.OpenStackCluster ).DeepCopy ()
456
+
457
+ oldCluster .Status = infrav1.OpenStackClusterStatus {}
458
+ newCluster .Status = infrav1.OpenStackClusterStatus {}
459
+
460
+ oldCluster .ObjectMeta .ResourceVersion = ""
461
+ newCluster .ObjectMeta .ResourceVersion = ""
462
+
463
+ return ! reflect .DeepEqual (oldCluster , newCluster )
464
+ },
465
+ },
466
+ ).
467
+ Build (r )
468
+ if err != nil {
469
+ return errors .Wrap (err , "error creating controller" )
470
+ }
471
+
472
+ return controller .Watch (
473
+ & source.Kind {Type : & clusterv1.Cluster {}},
474
+ & handler.EnqueueRequestsFromMapFunc {
475
+ ToRequests : handler .ToRequestsFunc (r .requeueOpenStackClusterForUnpausedCluster ),
476
+ },
477
+ predicate.Funcs {
478
+ UpdateFunc : func (e event.UpdateEvent ) bool {
479
+ oldCluster := e .ObjectOld .(* clusterv1.Cluster )
480
+ newCluster := e .ObjectNew .(* clusterv1.Cluster )
481
+ log := r .Log .WithValues ("predicate" , "updateEvent" , "namespace" , newCluster .Namespace , "cluster" , newCluster .Name )
482
+ switch {
483
+ // return true if Cluster.Spec.Paused has changed from true to false
484
+ case oldCluster .Spec .Paused && ! newCluster .Spec .Paused :
485
+ log .V (4 ).Info ("Cluster was unpaused, will attempt to map associated OpenStackCluster." )
486
+ return true
487
+ // otherwise, return false
488
+ default :
489
+ log .V (4 ).Info ("Cluster did not match expected conditions, will not attempt to map associated OpenStackCluster." )
490
+ return false
491
+ }
492
+ },
493
+ CreateFunc : func (e event.CreateEvent ) bool {
494
+ cluster := e .Object .(* clusterv1.Cluster )
495
+ log := r .Log .WithValues ("predicate" , "createEvent" , "namespace" , cluster .Namespace , "cluster" , cluster .Name )
496
+
497
+ // Only need to trigger a reconcile if the Cluster.Spec.Paused is false
498
+ if ! cluster .Spec .Paused {
499
+ log .V (4 ).Info ("Cluster is not paused, will attempt to map associated OpenStackCluster." )
500
+ return true
501
+ }
502
+ log .V (4 ).Info ("Cluster did not match expected conditions, will not attempt to map associated OpenStackCluster." )
503
+ return false
504
+ },
505
+ DeleteFunc : func (e event.DeleteEvent ) bool {
506
+ log := r .Log .WithValues ("predicate" , "deleteEvent" , "namespace" , e .Meta .GetNamespace (), "cluster" , e .Meta .GetName ())
507
+ log .V (4 ).Info ("Cluster did not match expected conditions, will not attempt to map associated OpenStackCluster." )
508
+ return false
509
+ },
510
+ GenericFunc : func (e event.GenericEvent ) bool {
511
+ log := r .Log .WithValues ("predicate" , "genericEvent" , "namespace" , e .Meta .GetNamespace (), "cluster" , e .Meta .GetName ())
512
+ log .V (4 ).Info ("Cluster did not match expected conditions, will not attempt to map associated OpenStackCluster." )
513
+ return false
514
+ },
515
+ },
516
+ )
517
+ }
518
+
519
+ func (r * OpenStackClusterReconciler ) requeueOpenStackClusterForUnpausedCluster (o handler.MapObject ) []ctrl.Request {
520
+ c := o .Object .(* clusterv1.Cluster )
521
+ log := r .Log .WithValues ("objectMapper" , "clusterToOpenStackCluster" , "namespace" , c .Namespace , "cluster" , c .Name )
522
+
523
+ // Don't handle deleted clusters
524
+ if ! c .ObjectMeta .DeletionTimestamp .IsZero () {
525
+ log .V (4 ).Info ("Cluster has a deletion timestamp, skipping mapping." )
526
+ return nil
527
+ }
528
+
529
+ // Make sure the ref is set
530
+ if c .Spec .InfrastructureRef == nil {
531
+ log .V (4 ).Info ("Cluster does not have an InfrastructureRef, skipping mapping." )
532
+ return nil
533
+ }
534
+
535
+ if c .Spec .InfrastructureRef .GroupVersionKind ().Kind != "OpenStackCluster" {
536
+ log .V (4 ).Info ("Cluster has an InfrastructureRef for a different type, skipping mapping." )
537
+ return nil
538
+ }
539
+
540
+ log .V (4 ).Info ("Adding request." , "openstackCluster" , c .Spec .InfrastructureRef .Name )
541
+ return []ctrl.Request {
542
+ {
543
+ NamespacedName : client.ObjectKey {Namespace : c .Namespace , Name : c .Spec .InfrastructureRef .Name },
544
+ },
545
+ }
446
546
}
0 commit comments