in pkg/controllers/nodeclass/status/kubernetesversion.go [72:109]
func (r *KubernetesVersionReconciler) Reconcile(ctx context.Context, nodeClass *v1alpha2.AKSNodeClass) (reconcile.Result, error) {
ctx = log.IntoContext(ctx, log.FromContext(ctx).WithName(kubernetesVersionReconcilerName))
logger := log.FromContext(ctx)
logger.V(1).Info("starting reconcile")
goalK8sVersion, err := r.kubernetesVersionProvider.KubeServerVersion(ctx)
if err != nil {
return reconcile.Result{}, fmt.Errorf("getting kubernetes version, %w", err)
}
// Handles case 1: init, update kubernetes status to API server version found
if !nodeClass.StatusConditions().Get(v1alpha2.ConditionTypeKubernetesVersionReady).IsTrue() || nodeClass.Status.KubernetesVersion == "" {
logger.Info(fmt.Sprintf("init kubernetes version: %s", goalK8sVersion))
} else {
// Check if there is an upgrade
newK8sVersion, err := semver.Parse(goalK8sVersion)
if err != nil {
return reconcile.Result{}, fmt.Errorf("parsing discovered kubernetes version, %w", err)
}
currentK8sVersion, err := semver.Parse(nodeClass.Status.KubernetesVersion)
if err != nil {
return reconcile.Result{}, fmt.Errorf("parsing current kubernetes version, %w", err)
}
// Handles case 2: Upgrade kubernetes version [Note: we set node image to not ready, since we upgrade node image when there is a kubernetes upgrade]
if newK8sVersion.GT(currentK8sVersion) {
logger.Info(fmt.Sprintf("kubernetes upgrade detected: from %s (current), to %s (discovered)", currentK8sVersion.String(), newK8sVersion.String()))
nodeClass.StatusConditions().SetFalse(v1alpha2.ConditionTypeImagesReady, "KubernetesUpgrade", "Performing kubernetes upgrade, need to get latest images")
} else if newK8sVersion.LT(currentK8sVersion) {
logger.Info(fmt.Sprintf("detected potential kubernetes downgrade: from %s (current), to %s (discovered)", currentK8sVersion.String(), newK8sVersion.String()))
// We do not currently support downgrading, so keep the kubernetes version the same
goalK8sVersion = nodeClass.Status.KubernetesVersion
}
}
nodeClass.Status.KubernetesVersion = goalK8sVersion
nodeClass.StatusConditions().SetTrue(v1alpha2.ConditionTypeKubernetesVersionReady)
logger.V(1).Info("successful reconcile")
return reconcile.Result{RequeueAfter: azurecache.KubernetesVersionTTL}, nil
}