func()

in pkg/controllers/selection/controller.go [84:113]


func (c *Controller) selectProvisioner(ctx context.Context, pod *v1.Pod) (errs error) {
	// Relax preferences if pod has previously failed to schedule.
	c.preferences.Relax(ctx, pod)
	// Inject volume topological requirements
	if err := c.volumeTopology.Inject(ctx, pod); err != nil {
		return fmt.Errorf("getting volume topology requirements, %w", err)
	}
	// Pick provisioner
	var provisioner *provisioning.Provisioner
	provisioners := c.provisioners.List(ctx)
	if len(provisioners) == 0 {
		return nil
	}
	for _, candidate := range c.provisioners.List(ctx) {
		if err := candidate.Spec.DeepCopy().ValidatePod(pod); err != nil {
			errs = multierr.Append(errs, fmt.Errorf("tried provisioner/%s: %w", candidate.Name, err))
		} else {
			provisioner = candidate
			break
		}
	}
	if provisioner == nil {
		return fmt.Errorf("matched 0/%d provisioners, %w", len(multierr.Errors(errs)), errs)
	}
	select {
	case <-provisioner.Add(pod):
	case <-ctx.Done():
	}
	return nil
}