func()

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
}