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))
}