func()

in controllers/cloudstackcluster_controller.go [66:112]


func (r *CloudStackClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (retRes ctrl.Result, retErr error) {
	log := r.Log.WithValues("cluster", req.Name, "namespace", req.Namespace)
	log.V(1).Info("Reconcile CloudStackCluster")

	// Get CloudStack cluster.
	csCluster := &infrav1.CloudStackCluster{}
	if retErr = r.Client.Get(ctx, req.NamespacedName, csCluster); retErr != nil {
		if client.IgnoreNotFound(retErr) == nil {
			log.Info("Cluster not found.")
		}
		return ctrl.Result{}, client.IgnoreNotFound(retErr)
	}

	// Get CAPI cluster.
	cluster, retErr := util.GetOwnerCluster(ctx, r.Client, csCluster.ObjectMeta)
	if retErr != nil {
		return reconcile.Result{}, retErr
	} else if cluster == nil {
		log.Info("Waiting for CAPI Cluster controller to set owner reference on CloudStack cluster.")
		return reconcile.Result{}, nil
	}

	// Check the cluster is not paused.
	if annotations.IsPaused(cluster, csCluster) {
		log.Info("Cluster is paused. Refusing to reconcile.")
		return reconcile.Result{}, nil
	}

	// Setup patcher. This ensures modifications to the csCluster copy fetched above are patched into the origin.
	if patchHelper, retErr := patch.NewHelper(csCluster, r.Client); retErr != nil {
		return ctrl.Result{}, retErr
	} else {
		defer func() {
			if err := patchHelper.Patch(ctx, csCluster); retErr == nil && err != nil {
				retErr = err
			}
		}()
	}

	// Delete Cluster Resources if deletion timestamp present.
	if !csCluster.DeletionTimestamp.IsZero() {
		return r.reconcileDelete(log, csCluster)
	}

	// Reconcile remaining clusters.
	return r.reconcile(log, csCluster)
}