in internal/controllers/resourceslice/slice.go [33:102]
func (s *sliceController) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
logger := logr.FromContextOrDiscard(ctx)
comp := &apiv1.Composition{}
err := s.client.Get(ctx, req.NamespacedName, comp)
if err != nil {
logger.Error(err, "failed to get composition")
return ctrl.Result{}, client.IgnoreNotFound(err)
}
logger = logger.WithValues("compositionGeneration", comp.Generation, "compositionName", comp.Name, "compositionNamespace", comp.Namespace, "synthesisUUID", comp.Status.GetCurrentSynthesisUUID())
ctx = logr.NewContext(ctx, logger)
if comp.Status.CurrentSynthesis == nil {
return ctrl.Result{}, nil
}
snapshot := statusSnapshot{Reconciled: true, Ready: true}
for _, ref := range comp.Status.CurrentSynthesis.ResourceSlices {
slice := &apiv1.ResourceSlice{}
slice.Name = ref.Name
slice.Namespace = comp.Namespace
err := s.client.Get(ctx, client.ObjectKeyFromObject(slice), slice)
if errors.IsNotFound(err) {
if comp.DeletionTimestamp != nil {
logger.V(1).Info("resource slice is missing, ignoring because composition is being deleted", "resourceSliceName", ref.Name)
continue
}
return s.handleMissingSlice(ctx, comp, ref.Name)
}
if err != nil {
logger.Error(err, "failed to get resource slice")
return ctrl.Result{}, err
}
// Handle a case where the reconciliation controller hasn't updated the slice's status yet
if len(slice.Status.Resources) == 0 && len(slice.Spec.Resources) > 0 {
snapshot.Ready = false
snapshot.Reconciled = false
break // no need to check the other slices
}
// Collect the state of every resource
for _, state := range slice.Status.Resources {
state := state
if resourceNotReconciled(comp, &state) {
snapshot.Reconciled = false
}
if state.Ready == nil {
snapshot.Ready = false
}
if state.Ready != nil && (snapshot.ReadyTime == nil || state.Ready.After(snapshot.ReadyTime.Time)) {
snapshot.ReadyTime = state.Ready
}
}
}
// Aggregate the status of all slices into the composition
if !processCompositionTransition(ctx, comp, snapshot) {
return ctrl.Result{}, nil
}
err = s.client.Status().Update(ctx, comp)
if err != nil {
logger.Error(err, "failed to update composition status")
return ctrl.Result{}, err
}
logger.V(1).Info("aggregated resource status into composition", "reconciled", snapshot.Reconciled, "ready", snapshot.Ready)
return ctrl.Result{}, nil
}