in internal/controllers/composition/controller.go [107:148]
func (c *compositionController) reconcileDeletedComposition(ctx context.Context, comp *apiv1.Composition) (ctrl.Result, error) {
logger := logr.FromContextOrDiscard(ctx)
syn := comp.Status.CurrentSynthesis
if syn != nil {
// Deletion increments the composition's generation, but the reconstitution cache is only invalidated
// when the synthesized generation (from the status) changes, which will never happen because synthesis
// is righly disabled for deleted compositions. We break out of this deadlock condition by updating
// the status without actually synthesizing.
if syn.ObservedCompositionGeneration != comp.Generation {
comp.Status.CurrentSynthesis.ObservedCompositionGeneration = comp.Generation
comp.Status.CurrentSynthesis.UUID = uuid.NewString()
comp.Status.CurrentSynthesis.Synthesized = ptr.To(metav1.Now())
comp.Status.CurrentSynthesis.Reconciled = nil
comp.Status.CurrentSynthesis.Ready = nil
err := c.client.Status().Update(ctx, comp)
if err != nil {
logger.Error(err, "failed to update current composition generation")
return ctrl.Result{}, err
}
logger.V(0).Info("updated composition status to reflect deletion", "synthesisUUID", comp.Status.CurrentSynthesis.UUID)
return ctrl.Result{}, nil
}
if syn.Reconciled == nil {
logger.V(1).Info("refusing to remove composition finalizer because it is still being reconciled")
return ctrl.Result{}, nil
}
}
if controllerutil.RemoveFinalizer(comp, "eno.azure.io/cleanup") {
err := c.client.Update(ctx, comp)
if err != nil {
logger.Error(err, "failed to remove finalizer")
return ctrl.Result{}, err
}
logger.V(0).Info("removed finalizer from composition")
}
return ctrl.Result{}, nil
}