in controllers/cloudstackmachine_controller.go [218:298]
func (r *CloudStackMachineReconciler) SetupWithManager(mgr ctrl.Manager) error {
controller, err := ctrl.NewControllerManagedBy(mgr).
For(&infrav1.CloudStackMachine{}).
WithEventFilter(
predicate.Funcs{
UpdateFunc: func(e event.UpdateEvent) bool {
oldMachine := e.ObjectOld.(*infrav1.CloudStackMachine).DeepCopy()
newMachine := e.ObjectNew.(*infrav1.CloudStackMachine).DeepCopy()
// Ignore resource version because they are unique
oldMachine.ObjectMeta.ResourceVersion = ""
newMachine.ObjectMeta.ResourceVersion = ""
// Ignore generation because it's not used in reconcile
oldMachine.ObjectMeta.Generation = 0
newMachine.ObjectMeta.Generation = 0
// Ignore finalizers updates
oldMachine.ObjectMeta.Finalizers = nil
newMachine.ObjectMeta.Finalizers = nil
// Ignore ManagedFields because they are mirror of ObjectMeta
oldMachine.ManagedFields = nil
newMachine.ManagedFields = nil
// Ignore incremental status updates
oldMachine.Status = infrav1.CloudStackMachineStatus{}
newMachine.Status = infrav1.CloudStackMachineStatus{}
// Ignore provide ID
oldMachine.Spec.ProviderID = nil
newMachine.Spec.ProviderID = nil
// Ignore instance ID
oldMachine.Spec.InstanceID = nil
newMachine.Spec.InstanceID = nil
return !reflect.DeepEqual(oldMachine, newMachine)
},
},
).Build(r)
if err != nil {
return err
}
// Watch CAPI machines for changes.
// Queues a reconcile request for owned CloudStackMachine on change.
// Used to update when bootstrap data becomes available.
if err = controller.Watch(
&source.Kind{Type: &capiv1.Machine{}},
handler.EnqueueRequestsFromMapFunc(
util.MachineToInfrastructureMapFunc(infrav1.GroupVersion.WithKind("CloudStackMachine"))),
predicate.Funcs{
UpdateFunc: func(e event.UpdateEvent) bool {
oldMachine := e.ObjectOld.(*capiv1.Machine)
newMachine := e.ObjectNew.(*capiv1.Machine)
return oldMachine.Spec.Bootstrap.DataSecretName == nil && newMachine.Spec.Bootstrap.DataSecretName != nil
},
},
); err != nil {
return err
}
// Used below, this maps CAPI clusters to CAPC machines
csMachineMapper, err := util.ClusterToObjectsMapper(r.Client, &infrav1.CloudStackMachineList{}, mgr.GetScheme())
if err != nil {
return err
}
// Add a watch on CAPI Cluster objects for unpause and ready events.
return controller.Watch(
&source.Kind{Type: &capiv1.Cluster{}},
handler.EnqueueRequestsFromMapFunc(csMachineMapper),
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
},
},
)
}