in controllers/solrbackup_controller.go [326:370]
func (r *SolrBackupReconciler) indexAndWatchForSolrClouds(mgr ctrl.Manager, ctrlBuilder *builder.Builder) (*builder.Builder, error) {
solrCloudField := ".spec.solrCloud"
if err := mgr.GetFieldIndexer().IndexField(context.Background(), &solrv1beta1.SolrBackup{}, solrCloudField, func(rawObj client.Object) []string {
// grab the SolrBackup object, extract the used SolrCloud...
return []string{rawObj.(*solrv1beta1.SolrBackup).Spec.SolrCloud}
}); err != nil {
return ctrlBuilder, err
}
return ctrlBuilder.Watches(
&solrv1beta1.SolrCloud{},
handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, obj client.Object) []reconcile.Request {
solrCloud := obj.(*solrv1beta1.SolrCloud)
foundBackups := &solrv1beta1.SolrBackupList{}
listOps := &client.ListOptions{
FieldSelector: fields.OneTermEqualSelector(solrCloudField, obj.GetName()),
Namespace: obj.GetNamespace(),
}
err := r.List(ctx, foundBackups, listOps)
if err != nil {
// if no exporters found, just no-op this
return []reconcile.Request{}
}
requests := make([]reconcile.Request, 0)
for _, item := range foundBackups.Items {
// Only queue the request if the Cloud is ready.
cloudIsReady := solrCloud.Status.BackupRestoreReady
if item.Spec.RepositoryName != "" {
cloudIsReady = solrCloud.Status.BackupRepositoriesAvailable[item.Spec.RepositoryName]
}
if cloudIsReady {
requests = append(requests, reconcile.Request{
NamespacedName: types.NamespacedName{
Name: item.GetName(),
Namespace: item.GetNamespace(),
},
})
}
}
return requests
}),
builder.WithPredicates(predicate.GenerationChangedPredicate{})), nil
}