func()

in controllers/package_controller.go [133:205]


func (r *PackageReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
	r.Log.V(6).Info("Reconcile:", "NamespacedName", req.NamespacedName)
	managerContext := packages.NewManagerContext(ctx, r.Log, r.PackageDriver)
	managerContext.ManagerClient = r.managerClient

	// Get the CRD object from the k8s API.
	var err error
	if err = r.Get(ctx, req.NamespacedName, &managerContext.Package); err != nil {
		if !apierrors.IsNotFound(err) {
			return ctrl.Result{}, err
		}

		managerContext.SetUninstalling(req.Namespace, req.Name)
	} else {
		pbc, err := r.managerClient.GetPackageBundleController(ctx, managerContext.Package.GetClusterName())
		if err != nil {
			r.Log.Error(err, "Getting package bundle controller")
			managerContext.Package.Status.Detail = err.Error()
			if err = r.Status().Update(ctx, &managerContext.Package); err != nil {
				return ctrl.Result{RequeueAfter: retryLong}, err
			}
			return ctrl.Result{RequeueAfter: retryLong}, nil
		}
		managerContext.PBC = *pbc

		bundle, err := r.managerClient.GetActiveBundle(ctx, managerContext.Package.GetClusterName())
		if err != nil {
			r.Log.Error(err, "Getting active bundle")
			managerContext.Package.Status.Detail = err.Error()
			if err = r.Status().Update(ctx, &managerContext.Package); err != nil {
				return ctrl.Result{RequeueAfter: retryLong}, err
			}
			return ctrl.Result{RequeueAfter: retryLong}, nil
		}
		managerContext.Bundle = bundle

		targetVersion := managerContext.Package.Spec.PackageVersion
		if targetVersion == "" {
			targetVersion = api.Latest
		}
		pkgName := managerContext.Package.Spec.PackageName
		pkg, err := bundle.FindPackage(pkgName)
		if err != nil {
			managerContext.Package.Status.Detail = fmt.Sprintf("Package %s is not in the active bundle (%s).", pkgName, bundle.Name)
			r.Log.Info(managerContext.Package.Status.Detail)
			if err = r.Status().Update(ctx, &managerContext.Package); err != nil {
				return ctrl.Result{RequeueAfter: managerContext.RequeueAfter}, err
			}
			return ctrl.Result{RequeueAfter: retryLong}, err
		}
		managerContext.Version, err = bundle.FindVersion(pkg, targetVersion)
		if err != nil {
			managerContext.Package.Status.Detail = fmt.Sprintf("Package %s@%s is not in the active bundle (%s).", pkgName, targetVersion, bundle.Name)
			r.Log.Info(managerContext.Package.Status.Detail)
			if err = r.Status().Update(ctx, &managerContext.Package); err != nil {
				return ctrl.Result{RequeueAfter: managerContext.RequeueAfter}, err
			}
			return ctrl.Result{RequeueAfter: retryLong}, err
		}
		managerContext.Source = bundle.GetOCISource(pkg, managerContext.Version)
		managerContext.Package.Status.TargetVersion = printableTargetVersion(managerContext.Source, targetVersion)
	}

	updateNeeded := r.Manager.Process(managerContext)
	if updateNeeded {
		r.Log.V(6).Info("Updating status", "namespace", managerContext.Package.Namespace, "name", managerContext.Package.Name, "state", managerContext.Package.Status.State)
		if err = r.Status().Update(ctx, &managerContext.Package); err != nil {
			return ctrl.Result{RequeueAfter: managerContext.RequeueAfter}, err
		}
	}

	return ctrl.Result{RequeueAfter: managerContext.RequeueAfter}, nil
}