in pkg/controllers/nodeclass/status/images.go [90:140]
func (r *NodeImageReconciler) Reconcile(ctx context.Context, nodeClass *v1alpha2.AKSNodeClass) (reconcile.Result, error) {
ctx = log.IntoContext(ctx, log.FromContext(ctx).WithName(nodeImageReconcilerName))
logger := log.FromContext(ctx)
logger.V(1).Info("starting reconcile")
nodeImages, err := r.nodeImageProvider.List(ctx, nodeClass)
if err != nil {
return reconcile.Result{}, fmt.Errorf("getting nodeimages, %w", err)
}
goalImages := lo.Map(nodeImages, func(nodeImage imagefamily.NodeImage, _ int) v1alpha2.NodeImage {
reqs := lo.Map(nodeImage.Requirements.NodeSelectorRequirements(), func(item v1.NodeSelectorRequirementWithMinValues, _ int) corev1.NodeSelectorRequirement {
return item.NodeSelectorRequirement
})
// sorted for consistency
sort.Slice(reqs, func(i, j int) bool {
if len(reqs[i].Key) != len(reqs[j].Key) {
return len(reqs[i].Key) < len(reqs[j].Key)
}
return reqs[i].Key < reqs[j].Key
})
return v1alpha2.NodeImage{
ID: nodeImage.ID,
Requirements: reqs,
}
})
// Scenario A: Check if we should do a full update to latest before processing any partial update
//
// Note: We want to handle cases 1-3 regardless of maintenance window state, since they are either
// for initialization, based off an underlying customer operation, or a different update we're
// dependant upon which would have already been preformed within its required maintenance Window.
shouldUpdate := imageVersionsUnready(nodeClass) || isMaintenanceWindowOpen()
if !shouldUpdate {
// Scenario B: Calculate any partial update based on image selectors, or newly supports SKUs
goalImages = overrideAnyGoalStateVersionsWithExisting(nodeClass, goalImages)
}
if len(goalImages) == 0 {
nodeClass.Status.Images = nil
nodeClass.StatusConditions().SetFalse(v1alpha2.ConditionTypeImagesReady, "ImagesNotFound", "ImageSelectors did not match any Images")
logger.Info("no node images")
return reconcile.Result{RequeueAfter: 5 * time.Minute}, nil
}
nodeClass.Status.Images = goalImages
nodeClass.StatusConditions().SetTrue(v1alpha2.ConditionTypeImagesReady)
logger.V(1).Info("success")
return reconcile.Result{RequeueAfter: 5 * time.Minute}, nil
}