func()

in internal/controllers/symphony/controller.go [37:104]


func (c *symphonyController) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
	logger := logr.FromContextOrDiscard(ctx)

	symph := &apiv1.Symphony{}
	err := c.client.Get(ctx, req.NamespacedName, symph)
	if err != nil {
		logger.Error(err, "failed to get symphony")
		return ctrl.Result{}, client.IgnoreNotFound(err)
	}
	logger = logger.WithValues("symphonyName", symph.Name, "symphonyNamespace", symph.Namespace, "symphonyGeneration", symph.Generation)
	ctx = logr.NewContext(ctx, logger)

	if controllerutil.AddFinalizer(symph, "eno.azure.io/cleanup") {
		err := c.client.Update(ctx, symph)
		if err != nil {
			logger.Error(err, "failed to add finalizer")
			return ctrl.Result{}, err
		}
		return ctrl.Result{}, nil
	}

	existing := &apiv1.CompositionList{}
	err = c.client.List(ctx, existing, client.InNamespace(symph.Namespace), client.MatchingFields{
		manager.IdxCompositionsBySymphony: symph.Name,
	})
	if err != nil {
		logger.Error(err, "failed to list existing compositions")
		return ctrl.Result{}, err
	}

	modified, err := c.reconcileReverse(ctx, symph, existing)
	if err != nil {
		logger.Error(err, "failed to reconcile reverse")
		return ctrl.Result{}, err
	}
	if modified {
		return ctrl.Result{}, nil
	}

	// Remove finalizer when no compositions remain
	if symph.DeletionTimestamp != nil {
		if len(existing.Items) > 0 || !controllerutil.RemoveFinalizer(symph, "eno.azure.io/cleanup") {
			return ctrl.Result{}, nil
		}
		err = c.client.Update(ctx, symph)
		if err != nil {
			logger.Error(err, "failed to remove finalizer")
			return ctrl.Result{}, err
		}
		return ctrl.Result{}, nil
	}

	modified, err = c.reconcileForward(ctx, symph, existing)
	if err != nil {
		logger.Error(err, "failed to reconcile forward")
		return ctrl.Result{}, err
	}
	if modified {
		return ctrl.Result{}, nil
	}

	err = c.syncStatus(ctx, symph, existing)
	if err != nil {
		logger.Error(err, "failed to sync status")
		return ctrl.Result{}, err
	}
	return ctrl.Result{}, nil
}