in controllers/solrprometheusexporter_controller.go [429:473]
func (r *SolrPrometheusExporterReconciler) indexAndWatchForProvidedConfigMaps(mgr ctrl.Manager, ctrlBuilder *builder.Builder) (*builder.Builder, error) {
providedConfigMapField := ".spec.customKubeOptions.configMapOptions.providedConfigMap"
if err := mgr.GetFieldIndexer().IndexField(context.Background(), &solrv1beta1.SolrPrometheusExporter{}, providedConfigMapField, func(rawObj client.Object) []string {
// grab the SolrPrometheusExporter object, extract the used configMap...
exporter := rawObj.(*solrv1beta1.SolrPrometheusExporter)
if exporter.Spec.CustomKubeOptions.ConfigMapOptions == nil {
return nil
}
if exporter.Spec.CustomKubeOptions.ConfigMapOptions.ProvidedConfigMap == "" {
return nil
}
// ...and if so, return it
return []string{exporter.Spec.CustomKubeOptions.ConfigMapOptions.ProvidedConfigMap}
}); err != nil {
return ctrlBuilder, err
}
return ctrlBuilder.Watches(
&corev1.ConfigMap{},
handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, obj client.Object) []reconcile.Request {
foundExporters := &solrv1beta1.SolrPrometheusExporterList{}
listOps := &client.ListOptions{
FieldSelector: fields.OneTermEqualSelector(providedConfigMapField, obj.GetName()),
Namespace: obj.GetNamespace(),
}
err := r.List(ctx, foundExporters, listOps)
if err != nil {
// if no exporters found, just no-op this
return []reconcile.Request{}
}
requests := make([]reconcile.Request, len(foundExporters.Items))
for i, item := range foundExporters.Items {
requests[i] = reconcile.Request{
NamespacedName: types.NamespacedName{
Name: item.GetName(),
Namespace: item.GetNamespace(),
},
}
}
return requests
}),
builder.WithPredicates(predicate.ResourceVersionChangedPredicate{})), nil
}