func()

in pkg/controllers/persistentvolumeclaim/controller.go [63:94]


func (c *Controller) Reconcile(ctx context.Context, req reconcile.Request) (reconcile.Result, error) {
	ctx = logging.WithLogger(ctx, logging.FromContext(ctx).Named(controllerName).With("resource", req.String()))
	ctx = injection.WithNamespacedName(ctx, req.NamespacedName)
	ctx = injection.WithControllerName(ctx, controllerName)

	pvc := &v1.PersistentVolumeClaim{}
	if err := c.kubeClient.Get(ctx, req.NamespacedName, pvc); err != nil {
		if errors.IsNotFound(err) {
			return reconcile.Result{}, nil
		}
		return reconcile.Result{}, err
	}
	pod, err := c.podForPvc(ctx, pvc)
	if err != nil {
		return reconcile.Result{}, err
	}
	if pod == nil {
		return reconcile.Result{}, nil
	}
	if nodeName, ok := pvc.Annotations[SelectedNodeAnnotation]; ok && nodeName == pod.Spec.NodeName {
		return reconcile.Result{}, nil
	}
	if !c.isBindable(pod) {
		return reconcile.Result{}, nil
	}
	pvc.Annotations = functional.UnionStringMaps(pvc.Annotations, map[string]string{SelectedNodeAnnotation: pod.Spec.NodeName})
	if err := c.kubeClient.Update(ctx, pvc); err != nil {
		return reconcile.Result{}, fmt.Errorf("binding persistent volume claim for pod %s/%s to node %q, %w", pod.Namespace, pod.Name, pod.Spec.NodeName, err)
	}
	logging.FromContext(ctx).Infof("Bound persistent volume claim to node %s", pod.Spec.NodeName)
	return reconcile.Result{}, nil
}