func()

in internal/controller/generic_controller.go [50:107]


func (r *genericReconciler[O]) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
	logger := r.Logger.WithValues("acrpullbinding", req.NamespacedName)

	acrBinding := r.NewBinding()
	if err := r.Client.Get(ctx, req.NamespacedName, acrBinding); err != nil {
		if !apierrors.IsNotFound(err) {
			msg := "unable to fetch acrPullBinding."
			logger.Error(err, msg)
			return ctrl.Result{}, fmt.Errorf("%s: %w", msg, err)
		}
		return ctrl.Result{}, nil
	}

	serviceAccount := &corev1.ServiceAccount{}
	if err := r.Client.Get(ctx, k8stypes.NamespacedName{
		Namespace: req.Namespace,
		Name:      r.GetServiceAccountName(acrBinding),
	}, serviceAccount); err != nil {
		if !apierrors.IsNotFound(err) {
			msg := "failed to get service account"
			logger.Error(err, msg)
			return ctrl.Result{}, fmt.Errorf("%s: %w", msg, err)
		} else {
			serviceAccount = nil
		}
	}

	var pullSecrets corev1.SecretList
	if err := r.Client.List(ctx, &pullSecrets, crclient.InNamespace(acrBinding.GetNamespace()), crclient.MatchingFields{pullBindingField: acrBinding.GetName()}); err != nil {
		msg := "failed to fetch pull secrets referencing pull binding"
		logger.Error(err, msg)
		return ctrl.Result{}, fmt.Errorf("%s: %w", msg, err)
	}

	var pullSecretNames []string
	if len(pullSecrets.Items) == 0 {
		pullSecretNames = append(pullSecretNames, r.GetPullSecretName(acrBinding))
	} else {
		for _, pullSecret := range pullSecrets.Items {
			pullSecretNames = append(pullSecretNames, pullSecret.ObjectMeta.Name)
		}
	}

	var referencingServiceAccounts []corev1.ServiceAccount
	for _, pullSecret := range pullSecretNames {
		var serviceAccountList corev1.ServiceAccountList
		if err := r.Client.List(ctx, &serviceAccountList, crclient.InNamespace(acrBinding.GetNamespace()), crclient.MatchingFields{imagePullSecretsField: pullSecret}); err != nil {
			msg := "failed to fetch service accounts referencing pull secret"
			logger.Error(err, msg)
			return ctrl.Result{}, fmt.Errorf("%s: %w", msg, err)
		}
		referencingServiceAccounts = append(referencingServiceAccounts, serviceAccountList.Items...)
	}

	action := r.reconcile(ctx, logger, acrBinding, serviceAccount, pullSecrets.Items, referencingServiceAccounts)

	return action.execute(ctx, logger, r.Client, r.RequeueAfter(r.now))
}