@@ -99,7 +99,7 @@ func (r *GrafanaContactPointReconciler) Reconcile(ctx context.Context, req ctrl.
9999
100100 removeSuspended (& cr .Status .Conditions )
101101
102- instances , err := GetScopedMatchingInstances (ctx , r .Client , cr )
102+ instances , instDelta , err := GetScopedMatchingInstances (ctx , r .Client , cr )
103103 if err != nil {
104104 setNoMatchingInstancesCondition (& cr .Status .Conditions , cr .Generation , err )
105105 meta .RemoveStatusCondition (& cr .Status .Conditions , conditionContactPointSynchronized )
@@ -154,11 +154,50 @@ func (r *GrafanaContactPointReconciler) Reconcile(ctx context.Context, req ctrl.
154154 }
155155 }
156156
157- condition := buildSynchronizedCondition ("Contact point" , conditionContactPointSynchronized , cr .Generation , applyErrors , len (instances ))
157+ cleanupErrors := make (map [string ]string )
158+ dirtyInstances := make ([]grafanav1beta1.Grafana , 0 , len (instDelta ))
159+
160+ for _ , namespacedName := range instDelta {
161+ g := grafanav1beta1.Grafana {}
162+
163+ err := r .Get (ctx , namespacedName , & g )
164+ if err != nil {
165+ if kuberr .IsNotFound (err ) {
166+ continue
167+ }
168+
169+ dirtyInstances = append (dirtyInstances , g )
170+ cleanupErrors [namespacedName .String ()] = err .Error ()
171+ }
172+
173+ err = r .deleteFromInstance (ctx , & g , cr )
174+ if err != nil {
175+ dirtyInstances = append (dirtyInstances , g )
176+ cleanupErrors [namespacedName .String ()] = err .Error ()
177+
178+ continue
179+ }
180+ }
181+
182+ av := make ([]string , 0 , len (instances )+ len (dirtyInstances ))
183+ for _ , g := range append (instances , dirtyInstances ... ) {
184+ av = append (av , fmt .Sprintf ("%s/%s" , g .Namespace , g .Name ))
185+ }
186+
187+ slices .Sort (av )
188+ v := strings .Join (av , "," )
189+
190+ err = addAnnotation (ctx , r .Client , cr , annotationMatchedInstances , v )
191+ if err != nil {
192+ log .Error (err , "annotating contact point with matched instances" , "annotation" , annotationMatchedInstances )
193+ }
194+
195+ allErrors := mergeReconcileErrors (applyErrors , cleanupErrors )
196+ condition := buildSynchronizedCondition ("Contact point" , conditionContactPointSynchronized , cr .Generation , allErrors , len (instances ))
158197 meta .SetStatusCondition (& cr .Status .Conditions , condition )
159198
160- if len (applyErrors ) > 0 {
161- return ctrl.Result {}, fmt .Errorf ("failed to apply to all instances: %v" , applyErrors )
199+ if len (allErrors ) > 0 {
200+ return ctrl.Result {}, fmt .Errorf ("syncing all instances: %v" , allErrors )
162201 }
163202
164203 return ctrl.Result {RequeueAfter : r .Cfg .requeueAfter (cr .Spec .ResyncPeriod )}, nil
@@ -321,36 +360,45 @@ func (r *GrafanaContactPointReconciler) finalize(ctx context.Context, cr *grafan
321360 log := logf .FromContext (ctx )
322361 log .Info ("Finalizing GrafanaContactPoint" )
323362
324- instances , err := GetScopedMatchingInstances (ctx , r .Client , cr )
363+ instances , _ , err := GetScopedMatchingInstances (ctx , r .Client , cr )
325364 if err != nil {
326365 return fmt .Errorf ("fetching instances: %w" , err )
327366 }
328367
329368 for _ , instance := range instances {
330- cl , err := client2 .NewGeneratedGrafanaClient (ctx , r .Client , & instance )
331- if err != nil {
332- return fmt .Errorf ("building grafana client: %w" , err )
333- }
334-
335- remoteReceivers , err := r .getReceiversFromName (cl , cr )
369+ err := r .deleteFromInstance (ctx , & instance , cr )
336370 if err != nil {
337371 return err
338372 }
373+ }
339374
340- for _ , rec := range remoteReceivers {
341- _ , err = cl .Provisioning .DeleteContactpoints (rec .UID ) //nolint:errcheck
342- if err != nil {
343- return fmt .Errorf ("deleting contact point: %w" , err )
344- }
345- }
375+ return nil
376+ }
346377
347- // Update grafana instance Status
348- err = instance .RemoveNamespacedResource (ctx , r .Client , cr )
378+ func (r * GrafanaContactPointReconciler ) deleteFromInstance (ctx context.Context , g * grafanav1beta1.Grafana , cr * grafanav1beta1.GrafanaContactPoint ) error {
379+ cl , err := client2 .NewGeneratedGrafanaClient (ctx , r .Client , g )
380+ if err != nil {
381+ return fmt .Errorf ("building grafana client: %w" , err )
382+ }
383+
384+ remoteReceivers , err := r .getReceiversFromName (cl , cr )
385+ if err != nil {
386+ return err
387+ }
388+
389+ for _ , rec := range remoteReceivers {
390+ _ , err = cl .Provisioning .DeleteContactpoints (rec .UID ) //nolint:errcheck
349391 if err != nil {
350- return fmt .Errorf ("removing contact point from Grafana cr : %w" , err )
392+ return fmt .Errorf ("deleting contact point: %w" , err )
351393 }
352394 }
353395
396+ // Update grafana instance Status
397+ err = g .RemoveNamespacedResource (ctx , r .Client , cr )
398+ if err != nil {
399+ return fmt .Errorf ("removing contact point from Grafana cr: %w" , err )
400+ }
401+
354402 return nil
355403}
356404
0 commit comments