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
}