Skip to content

Commit 08ab271

Browse files
authored
Merge pull request kubernetes#83389 from ahmad-diaa/move-PodPreemptor-to-sched
Move PodPreemptor to Scheduler
2 parents 0599ca2 + 6bbc607 commit 08ab271

File tree

3 files changed

+50
-51
lines changed

3 files changed

+50
-51
lines changed

pkg/scheduler/factory/factory.go

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,6 @@ type Config struct {
7979

8080
Algorithm core.ScheduleAlgorithm
8181
GetBinder func(pod *v1.Pod) Binder
82-
// PodPreemptor is used to evict pods and update 'NominatedNode' field of
83-
// the preemptor pod.
84-
PodPreemptor PodPreemptor
8582
// Framework runs scheduler plugins at configured extension points.
8683
Framework framework.Framework
8784

@@ -119,15 +116,6 @@ type Config struct {
119116
PluginConfig []config.PluginConfig
120117
}
121118

122-
// PodPreemptor has methods needed to delete a pod and to update 'NominatedPod'
123-
// field of the preemptor pod.
124-
type PodPreemptor interface {
125-
GetUpdatedPod(pod *v1.Pod) (*v1.Pod, error)
126-
DeletePod(pod *v1.Pod) error
127-
SetNominatedNodeName(pod *v1.Pod, nominatedNode string) error
128-
RemoveNominatedNodeName(pod *v1.Pod) error
129-
}
130-
131119
// Configurator defines I/O, caching, and other functionality needed to
132120
// construct a new scheduler.
133121
type Configurator struct {
@@ -471,7 +459,6 @@ func (c *Configurator) CreateFromKeys(predicateKeys, priorityKeys sets.String, e
471459
SchedulerCache: c.schedulerCache,
472460
Algorithm: algo,
473461
GetBinder: getBinderFunc(c.client, extenders),
474-
PodPreemptor: &podPreemptor{c.client},
475462
Framework: framework,
476463
WaitForCacheSync: func() bool {
477464
return cache.WaitForCacheSync(c.StopEverything, c.scheduledPodsHasSynced)
@@ -719,29 +706,3 @@ func (b *binder) Bind(binding *v1.Binding) error {
719706
klog.V(3).Infof("Attempting to bind %v to %v", binding.Name, binding.Target.Name)
720707
return b.Client.CoreV1().Pods(binding.Namespace).Bind(binding)
721708
}
722-
723-
type podPreemptor struct {
724-
Client clientset.Interface
725-
}
726-
727-
func (p *podPreemptor) GetUpdatedPod(pod *v1.Pod) (*v1.Pod, error) {
728-
return p.Client.CoreV1().Pods(pod.Namespace).Get(pod.Name, metav1.GetOptions{})
729-
}
730-
731-
func (p *podPreemptor) DeletePod(pod *v1.Pod) error {
732-
return p.Client.CoreV1().Pods(pod.Namespace).Delete(pod.Name, &metav1.DeleteOptions{})
733-
}
734-
735-
func (p *podPreemptor) SetNominatedNodeName(pod *v1.Pod, nominatedNodeName string) error {
736-
podCopy := pod.DeepCopy()
737-
podCopy.Status.NominatedNodeName = nominatedNodeName
738-
_, err := p.Client.CoreV1().Pods(pod.Namespace).UpdateStatus(podCopy)
739-
return err
740-
}
741-
742-
func (p *podPreemptor) RemoveNominatedNodeName(pod *v1.Pod) error {
743-
if len(pod.Status.NominatedNodeName) == 0 {
744-
return nil
745-
}
746-
return p.SetNominatedNodeName(pod, "")
747-
}

pkg/scheduler/scheduler.go

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,21 @@ const (
5555

5656
// podConditionUpdater updates the condition of a pod based on the passed
5757
// PodCondition
58+
// TODO (ahmad-diaa): Remove type and replace it with scheduler methods
5859
type podConditionUpdater interface {
5960
update(pod *v1.Pod, podCondition *v1.PodCondition) error
6061
}
6162

63+
// PodPreemptor has methods needed to delete a pod and to update 'NominatedPod'
64+
// field of the preemptor pod.
65+
// TODO (ahmad-diaa): Remove type and replace it with scheduler methods
66+
type podPreemptor interface {
67+
getUpdatedPod(pod *v1.Pod) (*v1.Pod, error)
68+
deletePod(pod *v1.Pod) error
69+
setNominatedNodeName(pod *v1.Pod, nominatedNode string) error
70+
removeNominatedNodeName(pod *v1.Pod) error
71+
}
72+
6273
// Scheduler watches for new unscheduled pods. It attempts to find
6374
// nodes that they fit on and writes bindings back to the api server.
6475
type Scheduler struct {
@@ -74,7 +85,7 @@ type Scheduler struct {
7485
podConditionUpdater podConditionUpdater
7586
// PodPreemptor is used to evict pods and update 'NominatedNode' field of
7687
// the preemptor pod.
77-
PodPreemptor factory.PodPreemptor
88+
podPreemptor podPreemptor
7889
// Framework runs scheduler plugins at configured extension points.
7990
Framework framework.Framework
8091

@@ -344,6 +355,8 @@ func New(client clientset.Interface,
344355
// Create the scheduler.
345356
sched := NewFromConfig(config)
346357
sched.podConditionUpdater = &podConditionUpdaterImpl{client}
358+
sched.podPreemptor = &podPreemptorImpl{client}
359+
347360
AddAllEventHandlers(sched, options.schedulerName, informerFactory, podInformer)
348361
return sched, nil
349362
}
@@ -391,7 +404,6 @@ func NewFromConfig(config *factory.Config) *Scheduler {
391404
SchedulerCache: config.SchedulerCache,
392405
Algorithm: config.Algorithm,
393406
GetBinder: config.GetBinder,
394-
PodPreemptor: config.PodPreemptor,
395407
Framework: config.Framework,
396408
NextPod: config.NextPod,
397409
WaitForCacheSync: config.WaitForCacheSync,
@@ -434,7 +446,7 @@ func (sched *Scheduler) recordSchedulingFailure(podInfo *framework.PodInfo, err
434446
// If it succeeds, it adds the name of the node where preemption has happened to the pod spec.
435447
// It returns the node name and an error if any.
436448
func (sched *Scheduler) preempt(state *framework.CycleState, fwk framework.Framework, preemptor *v1.Pod, scheduleErr error) (string, error) {
437-
preemptor, err := sched.PodPreemptor.GetUpdatedPod(preemptor)
449+
preemptor, err := sched.podPreemptor.getUpdatedPod(preemptor)
438450
if err != nil {
439451
klog.Errorf("Error getting the updated preemptor pod object: %v", err)
440452
return "", err
@@ -454,15 +466,15 @@ func (sched *Scheduler) preempt(state *framework.CycleState, fwk framework.Frame
454466
sched.SchedulingQueue.UpdateNominatedPodForNode(preemptor, nodeName)
455467

456468
// Make a call to update nominated node name of the pod on the API server.
457-
err = sched.PodPreemptor.SetNominatedNodeName(preemptor, nodeName)
469+
err = sched.podPreemptor.setNominatedNodeName(preemptor, nodeName)
458470
if err != nil {
459471
klog.Errorf("Error in preemption process. Cannot set 'NominatedPod' on pod %v/%v: %v", preemptor.Namespace, preemptor.Name, err)
460472
sched.SchedulingQueue.DeleteNominatedPodIfExists(preemptor)
461473
return "", err
462474
}
463475

464476
for _, victim := range victims {
465-
if err := sched.PodPreemptor.DeletePod(victim); err != nil {
477+
if err := sched.podPreemptor.deletePod(victim); err != nil {
466478
klog.Errorf("Error preempting pod %v/%v: %v", victim.Namespace, victim.Name, err)
467479
return "", err
468480
}
@@ -481,7 +493,7 @@ func (sched *Scheduler) preempt(state *framework.CycleState, fwk framework.Frame
481493
// function of generic_scheduler.go returns the pod itself for removal of
482494
// the 'NominatedPod' field.
483495
for _, p := range nominatedPodsToClear {
484-
rErr := sched.PodPreemptor.RemoveNominatedNodeName(p)
496+
rErr := sched.podPreemptor.removeNominatedNodeName(p)
485497
if rErr != nil {
486498
klog.Errorf("Cannot remove 'NominatedPod' field of pod: %v", rErr)
487499
// We do not return as this error is not critical.
@@ -756,6 +768,32 @@ func (p *podConditionUpdaterImpl) update(pod *v1.Pod, condition *v1.PodCondition
756768
return nil
757769
}
758770

771+
type podPreemptorImpl struct {
772+
Client clientset.Interface
773+
}
774+
775+
func (p *podPreemptorImpl) getUpdatedPod(pod *v1.Pod) (*v1.Pod, error) {
776+
return p.Client.CoreV1().Pods(pod.Namespace).Get(pod.Name, metav1.GetOptions{})
777+
}
778+
779+
func (p *podPreemptorImpl) deletePod(pod *v1.Pod) error {
780+
return p.Client.CoreV1().Pods(pod.Namespace).Delete(pod.Name, &metav1.DeleteOptions{})
781+
}
782+
783+
func (p *podPreemptorImpl) setNominatedNodeName(pod *v1.Pod, nominatedNodeName string) error {
784+
podCopy := pod.DeepCopy()
785+
podCopy.Status.NominatedNodeName = nominatedNodeName
786+
_, err := p.Client.CoreV1().Pods(pod.Namespace).UpdateStatus(podCopy)
787+
return err
788+
}
789+
790+
func (p *podPreemptorImpl) removeNominatedNodeName(pod *v1.Pod) error {
791+
if len(pod.Status.NominatedNodeName) == 0 {
792+
return nil
793+
}
794+
return p.setNominatedNodeName(pod, "")
795+
}
796+
759797
// nodeResourceString returns a string representation of node resources.
760798
func nodeResourceString(n *v1.Node) string {
761799
if n == nil {

pkg/scheduler/scheduler_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,19 +78,19 @@ func (fc fakePodConditionUpdater) update(pod *v1.Pod, podCondition *v1.PodCondit
7878

7979
type fakePodPreemptor struct{}
8080

81-
func (fp fakePodPreemptor) GetUpdatedPod(pod *v1.Pod) (*v1.Pod, error) {
81+
func (fp fakePodPreemptor) getUpdatedPod(pod *v1.Pod) (*v1.Pod, error) {
8282
return pod, nil
8383
}
8484

85-
func (fp fakePodPreemptor) DeletePod(pod *v1.Pod) error {
85+
func (fp fakePodPreemptor) deletePod(pod *v1.Pod) error {
8686
return nil
8787
}
8888

89-
func (fp fakePodPreemptor) SetNominatedNodeName(pod *v1.Pod, nomNodeName string) error {
89+
func (fp fakePodPreemptor) setNominatedNodeName(pod *v1.Pod, nomNodeName string) error {
9090
return nil
9191
}
9292

93-
func (fp fakePodPreemptor) RemoveNominatedNodeName(pod *v1.Pod) error {
93+
func (fp fakePodPreemptor) removeNominatedNodeName(pod *v1.Pod) error {
9494
return nil
9595
}
9696

@@ -674,7 +674,7 @@ func setupTestScheduler(queuedPodStore *clientcache.FIFO, scache internalcache.C
674674
},
675675
Recorder: &events.FakeRecorder{},
676676
podConditionUpdater: fakePodConditionUpdater{},
677-
PodPreemptor: fakePodPreemptor{},
677+
podPreemptor: fakePodPreemptor{},
678678
Framework: emptyFramework,
679679
VolumeBinder: volumebinder.NewFakeVolumeBinder(&volumescheduling.FakeVolumeBinderConfig{AllBound: true}),
680680
}
@@ -728,7 +728,7 @@ func setupTestSchedulerLongBindingWithRetry(queuedPodStore *clientcache.FIFO, sc
728728
},
729729
Recorder: &events.FakeRecorder{},
730730
podConditionUpdater: fakePodConditionUpdater{},
731-
PodPreemptor: fakePodPreemptor{},
731+
podPreemptor: fakePodPreemptor{},
732732
StopEverything: stop,
733733
Framework: fwk,
734734
VolumeBinder: volumebinder.NewFakeVolumeBinder(&volumescheduling.FakeVolumeBinderConfig{AllBound: true}),

0 commit comments

Comments
 (0)