in controllers/cloudstackcluster_controller.go [146:189]
func (r *CloudStackClusterReconciler) SetupWithManager(mgr ctrl.Manager) error {
controller, err := ctrl.NewControllerManagedBy(mgr).
For(&infrav1.CloudStackCluster{}).
WithEventFilter(
predicate.Funcs{
UpdateFunc: func(e event.UpdateEvent) bool {
oldCluster := e.ObjectOld.(*infrav1.CloudStackCluster).DeepCopy()
newCluster := e.ObjectNew.(*infrav1.CloudStackCluster).DeepCopy()
// Ignore resource version because they are unique
oldCluster.ObjectMeta.ResourceVersion = ""
newCluster.ObjectMeta.ResourceVersion = ""
// Ignore finalizers updates
oldCluster.ObjectMeta.Finalizers = nil
newCluster.ObjectMeta.Finalizers = nil
// Ignore ManagedFields because they are mirror of ObjectMeta
oldCluster.ManagedFields = nil
newCluster.ManagedFields = nil
// Ignore incremental status updates
oldCluster.Status = infrav1.CloudStackClusterStatus{}
newCluster.Status = infrav1.CloudStackClusterStatus{}
return !reflect.DeepEqual(oldCluster, newCluster)
},
},
).Build(r)
if err != nil {
return err
}
return controller.Watch( // Add a watch on CAPI Cluster objects for unpause and ready events.
&source.Kind{Type: &capiv1.Cluster{}},
handler.EnqueueRequestsFromMapFunc(
util.ClusterToInfrastructureMapFunc(infrav1.GroupVersion.WithKind("CloudStackCluster"))),
predicate.Funcs{
UpdateFunc: func(e event.UpdateEvent) bool {
oldCluster := e.ObjectOld.(*capiv1.Cluster)
newCluster := e.ObjectNew.(*capiv1.Cluster)
return oldCluster.Spec.Paused && !newCluster.Spec.Paused
},
CreateFunc: func(e event.CreateEvent) bool {
_, ok := e.Object.GetAnnotations()[capiv1.PausedAnnotation]
return ok
}},
)
}