mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 20:53:33 +00:00
Merge pull request #84337 from hex108/cancel_context
Cancel context when RunPermitPlugins finishes
This commit is contained in:
commit
d22e04c181
@ -613,7 +613,9 @@ func (sched *Scheduler) scheduleOne(ctx context.Context) {
|
|||||||
// Synchronously attempt to find a fit for the pod.
|
// Synchronously attempt to find a fit for the pod.
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
state := framework.NewCycleState()
|
state := framework.NewCycleState()
|
||||||
scheduleResult, err := sched.Algorithm.Schedule(ctx, state, pod)
|
schedulingCycleCtx, cancel := context.WithCancel(ctx)
|
||||||
|
defer cancel()
|
||||||
|
scheduleResult, err := sched.Algorithm.Schedule(schedulingCycleCtx, state, pod)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sched.recordSchedulingFailure(podInfo.DeepCopy(), err, v1.PodReasonUnschedulable, err.Error())
|
sched.recordSchedulingFailure(podInfo.DeepCopy(), err, v1.PodReasonUnschedulable, err.Error())
|
||||||
// Schedule() may have failed because the pod would not fit on any host, so we try to
|
// Schedule() may have failed because the pod would not fit on any host, so we try to
|
||||||
@ -626,7 +628,7 @@ func (sched *Scheduler) scheduleOne(ctx context.Context) {
|
|||||||
" No preemption is performed.")
|
" No preemption is performed.")
|
||||||
} else {
|
} else {
|
||||||
preemptionStartTime := time.Now()
|
preemptionStartTime := time.Now()
|
||||||
sched.preempt(ctx, state, fwk, pod, fitError)
|
sched.preempt(schedulingCycleCtx, state, fwk, pod, fitError)
|
||||||
metrics.PreemptionAttempts.Inc()
|
metrics.PreemptionAttempts.Inc()
|
||||||
metrics.SchedulingAlgorithmPremptionEvaluationDuration.Observe(metrics.SinceInSeconds(preemptionStartTime))
|
metrics.SchedulingAlgorithmPremptionEvaluationDuration.Observe(metrics.SinceInSeconds(preemptionStartTime))
|
||||||
metrics.DeprecatedSchedulingAlgorithmPremptionEvaluationDuration.Observe(metrics.SinceInMicroseconds(preemptionStartTime))
|
metrics.DeprecatedSchedulingAlgorithmPremptionEvaluationDuration.Observe(metrics.SinceInMicroseconds(preemptionStartTime))
|
||||||
@ -666,7 +668,7 @@ func (sched *Scheduler) scheduleOne(ctx context.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Run "reserve" plugins.
|
// Run "reserve" plugins.
|
||||||
if sts := fwk.RunReservePlugins(ctx, state, assumedPod, scheduleResult.SuggestedHost); !sts.IsSuccess() {
|
if sts := fwk.RunReservePlugins(schedulingCycleCtx, state, assumedPod, scheduleResult.SuggestedHost); !sts.IsSuccess() {
|
||||||
sched.recordSchedulingFailure(assumedPodInfo, sts.AsError(), SchedulerError, sts.Message())
|
sched.recordSchedulingFailure(assumedPodInfo, sts.AsError(), SchedulerError, sts.Message())
|
||||||
metrics.PodScheduleErrors.Inc()
|
metrics.PodScheduleErrors.Inc()
|
||||||
return
|
return
|
||||||
@ -683,11 +685,13 @@ func (sched *Scheduler) scheduleOne(ctx context.Context) {
|
|||||||
sched.recordSchedulingFailure(assumedPodInfo, err, SchedulerError, fmt.Sprintf("AssumePod failed: %v", err))
|
sched.recordSchedulingFailure(assumedPodInfo, err, SchedulerError, fmt.Sprintf("AssumePod failed: %v", err))
|
||||||
metrics.PodScheduleErrors.Inc()
|
metrics.PodScheduleErrors.Inc()
|
||||||
// trigger un-reserve plugins to clean up state associated with the reserved Pod
|
// trigger un-reserve plugins to clean up state associated with the reserved Pod
|
||||||
fwk.RunUnreservePlugins(ctx, state, assumedPod, scheduleResult.SuggestedHost)
|
fwk.RunUnreservePlugins(schedulingCycleCtx, state, assumedPod, scheduleResult.SuggestedHost)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// bind the pod to its host asynchronously (we can do this b/c of the assumption step above).
|
// bind the pod to its host asynchronously (we can do this b/c of the assumption step above).
|
||||||
go func() {
|
go func() {
|
||||||
|
bindingCycleCtx, cancel := context.WithCancel(ctx)
|
||||||
|
defer cancel()
|
||||||
metrics.SchedulerGoroutines.WithLabelValues("binding").Inc()
|
metrics.SchedulerGoroutines.WithLabelValues("binding").Inc()
|
||||||
defer metrics.SchedulerGoroutines.WithLabelValues("binding").Dec()
|
defer metrics.SchedulerGoroutines.WithLabelValues("binding").Dec()
|
||||||
|
|
||||||
@ -698,13 +702,13 @@ func (sched *Scheduler) scheduleOne(ctx context.Context) {
|
|||||||
sched.recordSchedulingFailure(assumedPodInfo, err, "VolumeBindingFailed", err.Error())
|
sched.recordSchedulingFailure(assumedPodInfo, err, "VolumeBindingFailed", err.Error())
|
||||||
metrics.PodScheduleErrors.Inc()
|
metrics.PodScheduleErrors.Inc()
|
||||||
// trigger un-reserve plugins to clean up state associated with the reserved Pod
|
// trigger un-reserve plugins to clean up state associated with the reserved Pod
|
||||||
fwk.RunUnreservePlugins(ctx, state, assumedPod, scheduleResult.SuggestedHost)
|
fwk.RunUnreservePlugins(bindingCycleCtx, state, assumedPod, scheduleResult.SuggestedHost)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run "permit" plugins.
|
// Run "permit" plugins.
|
||||||
permitStatus := fwk.RunPermitPlugins(ctx, state, assumedPod, scheduleResult.SuggestedHost)
|
permitStatus := fwk.RunPermitPlugins(bindingCycleCtx, state, assumedPod, scheduleResult.SuggestedHost)
|
||||||
if !permitStatus.IsSuccess() {
|
if !permitStatus.IsSuccess() {
|
||||||
var reason string
|
var reason string
|
||||||
if permitStatus.IsUnschedulable() {
|
if permitStatus.IsUnschedulable() {
|
||||||
@ -718,13 +722,13 @@ func (sched *Scheduler) scheduleOne(ctx context.Context) {
|
|||||||
klog.Errorf("scheduler cache ForgetPod failed: %v", forgetErr)
|
klog.Errorf("scheduler cache ForgetPod failed: %v", forgetErr)
|
||||||
}
|
}
|
||||||
// trigger un-reserve plugins to clean up state associated with the reserved Pod
|
// trigger un-reserve plugins to clean up state associated with the reserved Pod
|
||||||
fwk.RunUnreservePlugins(ctx, state, assumedPod, scheduleResult.SuggestedHost)
|
fwk.RunUnreservePlugins(bindingCycleCtx, state, assumedPod, scheduleResult.SuggestedHost)
|
||||||
sched.recordSchedulingFailure(assumedPodInfo, permitStatus.AsError(), reason, permitStatus.Message())
|
sched.recordSchedulingFailure(assumedPodInfo, permitStatus.AsError(), reason, permitStatus.Message())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run "prebind" plugins.
|
// Run "prebind" plugins.
|
||||||
preBindStatus := fwk.RunPreBindPlugins(ctx, state, assumedPod, scheduleResult.SuggestedHost)
|
preBindStatus := fwk.RunPreBindPlugins(bindingCycleCtx, state, assumedPod, scheduleResult.SuggestedHost)
|
||||||
if !preBindStatus.IsSuccess() {
|
if !preBindStatus.IsSuccess() {
|
||||||
var reason string
|
var reason string
|
||||||
metrics.PodScheduleErrors.Inc()
|
metrics.PodScheduleErrors.Inc()
|
||||||
@ -733,18 +737,18 @@ func (sched *Scheduler) scheduleOne(ctx context.Context) {
|
|||||||
klog.Errorf("scheduler cache ForgetPod failed: %v", forgetErr)
|
klog.Errorf("scheduler cache ForgetPod failed: %v", forgetErr)
|
||||||
}
|
}
|
||||||
// trigger un-reserve plugins to clean up state associated with the reserved Pod
|
// trigger un-reserve plugins to clean up state associated with the reserved Pod
|
||||||
fwk.RunUnreservePlugins(ctx, state, assumedPod, scheduleResult.SuggestedHost)
|
fwk.RunUnreservePlugins(bindingCycleCtx, state, assumedPod, scheduleResult.SuggestedHost)
|
||||||
sched.recordSchedulingFailure(assumedPodInfo, preBindStatus.AsError(), reason, preBindStatus.Message())
|
sched.recordSchedulingFailure(assumedPodInfo, preBindStatus.AsError(), reason, preBindStatus.Message())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err := sched.bind(ctx, assumedPod, scheduleResult.SuggestedHost, state)
|
err := sched.bind(bindingCycleCtx, assumedPod, scheduleResult.SuggestedHost, state)
|
||||||
metrics.E2eSchedulingLatency.Observe(metrics.SinceInSeconds(start))
|
metrics.E2eSchedulingLatency.Observe(metrics.SinceInSeconds(start))
|
||||||
metrics.DeprecatedE2eSchedulingLatency.Observe(metrics.SinceInMicroseconds(start))
|
metrics.DeprecatedE2eSchedulingLatency.Observe(metrics.SinceInMicroseconds(start))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
metrics.PodScheduleErrors.Inc()
|
metrics.PodScheduleErrors.Inc()
|
||||||
// trigger un-reserve plugins to clean up state associated with the reserved Pod
|
// trigger un-reserve plugins to clean up state associated with the reserved Pod
|
||||||
fwk.RunUnreservePlugins(ctx, state, assumedPod, scheduleResult.SuggestedHost)
|
fwk.RunUnreservePlugins(bindingCycleCtx, state, assumedPod, scheduleResult.SuggestedHost)
|
||||||
sched.recordSchedulingFailure(assumedPodInfo, err, SchedulerError, fmt.Sprintf("Binding rejected: %v", err))
|
sched.recordSchedulingFailure(assumedPodInfo, err, SchedulerError, fmt.Sprintf("Binding rejected: %v", err))
|
||||||
} else {
|
} else {
|
||||||
// Calculating nodeResourceString can be heavy. Avoid it if klog verbosity is below 2.
|
// Calculating nodeResourceString can be heavy. Avoid it if klog verbosity is below 2.
|
||||||
@ -757,7 +761,7 @@ func (sched *Scheduler) scheduleOne(ctx context.Context) {
|
|||||||
metrics.PodSchedulingDuration.Observe(metrics.SinceInSeconds(podInfo.InitialAttemptTimestamp))
|
metrics.PodSchedulingDuration.Observe(metrics.SinceInSeconds(podInfo.InitialAttemptTimestamp))
|
||||||
|
|
||||||
// Run "postbind" plugins.
|
// Run "postbind" plugins.
|
||||||
fwk.RunPostBindPlugins(ctx, state, assumedPod, scheduleResult.SuggestedHost)
|
fwk.RunPostBindPlugins(bindingCycleCtx, state, assumedPod, scheduleResult.SuggestedHost)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
@ -101,6 +101,7 @@ type PermitPlugin struct {
|
|||||||
waitAndRejectPermit bool
|
waitAndRejectPermit bool
|
||||||
waitAndAllowPermit bool
|
waitAndAllowPermit bool
|
||||||
allowPermit bool
|
allowPermit bool
|
||||||
|
cancelled bool
|
||||||
fh framework.FrameworkHandle
|
fh framework.FrameworkHandle
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,8 +396,15 @@ func (pp *PermitPlugin) Permit(ctx context.Context, state *framework.CycleState,
|
|||||||
return framework.NewStatus(framework.Unschedulable, fmt.Sprintf("reject pod %v", pod.Name)), 0
|
return framework.NewStatus(framework.Unschedulable, fmt.Sprintf("reject pod %v", pod.Name)), 0
|
||||||
}
|
}
|
||||||
if pp.timeoutPermit {
|
if pp.timeoutPermit {
|
||||||
|
go func() {
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
pp.cancelled = true
|
||||||
|
}
|
||||||
|
}()
|
||||||
return framework.NewStatus(framework.Wait, ""), 3 * time.Second
|
return framework.NewStatus(framework.Wait, ""), 3 * time.Second
|
||||||
}
|
}
|
||||||
|
|
||||||
if pp.allowPermit && pod.Name != "waiting-pod" {
|
if pp.allowPermit && pod.Name != "waiting-pod" {
|
||||||
return nil, 0
|
return nil, 0
|
||||||
}
|
}
|
||||||
@ -429,6 +437,11 @@ func (pp *PermitPlugin) allowAllPods() {
|
|||||||
pp.fh.IterateOverWaitingPods(func(wp framework.WaitingPod) { wp.Allow(pp.name) })
|
pp.fh.IterateOverWaitingPods(func(wp framework.WaitingPod) { wp.Allow(pp.name) })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// rejectAllPods rejects all waiting pods.
|
||||||
|
func (pp *PermitPlugin) rejectAllPods() {
|
||||||
|
pp.fh.IterateOverWaitingPods(func(wp framework.WaitingPod) { wp.Reject("rejectAllPods") })
|
||||||
|
}
|
||||||
|
|
||||||
// reset used to reset permit plugin.
|
// reset used to reset permit plugin.
|
||||||
func (pp *PermitPlugin) reset() {
|
func (pp *PermitPlugin) reset() {
|
||||||
pp.numPermitCalled = 0
|
pp.numPermitCalled = 0
|
||||||
@ -438,6 +451,7 @@ func (pp *PermitPlugin) reset() {
|
|||||||
pp.waitAndRejectPermit = false
|
pp.waitAndRejectPermit = false
|
||||||
pp.waitAndAllowPermit = false
|
pp.waitAndAllowPermit = false
|
||||||
pp.allowPermit = false
|
pp.allowPermit = false
|
||||||
|
pp.cancelled = false
|
||||||
}
|
}
|
||||||
|
|
||||||
// newPermitPlugin returns a factory for permit plugin with specified PermitPlugin.
|
// newPermitPlugin returns a factory for permit plugin with specified PermitPlugin.
|
||||||
@ -1079,18 +1093,7 @@ func TestPostBindPlugin(t *testing.T) {
|
|||||||
func TestPermitPlugin(t *testing.T) {
|
func TestPermitPlugin(t *testing.T) {
|
||||||
// Create a plugin registry for testing. Register only a permit plugin.
|
// Create a plugin registry for testing. Register only a permit plugin.
|
||||||
perPlugin := &PermitPlugin{name: permitPluginName}
|
perPlugin := &PermitPlugin{name: permitPluginName}
|
||||||
registry := framework.Registry{permitPluginName: newPermitPlugin(perPlugin)}
|
registry, plugins := initRegistryAndConfig(perPlugin)
|
||||||
|
|
||||||
// Setup initial permit plugin for testing.
|
|
||||||
plugins := &schedulerconfig.Plugins{
|
|
||||||
Permit: &schedulerconfig.PluginSet{
|
|
||||||
Enabled: []schedulerconfig.Plugin{
|
|
||||||
{
|
|
||||||
Name: permitPluginName,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the master and the scheduler with the test plugin set.
|
// Create the master and the scheduler with the test plugin set.
|
||||||
context := initTestSchedulerForFrameworkTest(t, initTestMaster(t, "permit-plugin", nil), 2,
|
context := initTestSchedulerForFrameworkTest(t, initTestMaster(t, "permit-plugin", nil), 2,
|
||||||
@ -1178,24 +1181,7 @@ func TestMultiplePermitPlugins(t *testing.T) {
|
|||||||
// Create a plugin registry for testing.
|
// Create a plugin registry for testing.
|
||||||
perPlugin1 := &PermitPlugin{name: "permit-plugin-1"}
|
perPlugin1 := &PermitPlugin{name: "permit-plugin-1"}
|
||||||
perPlugin2 := &PermitPlugin{name: "permit-plugin-2"}
|
perPlugin2 := &PermitPlugin{name: "permit-plugin-2"}
|
||||||
registry := framework.Registry{
|
registry, plugins := initRegistryAndConfig(perPlugin1, perPlugin2)
|
||||||
perPlugin1.Name(): newPermitPlugin(perPlugin1),
|
|
||||||
perPlugin2.Name(): newPermitPlugin(perPlugin2),
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setup initial permit plugins for testing.
|
|
||||||
plugins := &schedulerconfig.Plugins{
|
|
||||||
Permit: &schedulerconfig.PluginSet{
|
|
||||||
Enabled: []schedulerconfig.Plugin{
|
|
||||||
{
|
|
||||||
Name: perPlugin1.Name(),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Name: perPlugin2.Name(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the master and the scheduler with the test plugin set.
|
// Create the master and the scheduler with the test plugin set.
|
||||||
context := initTestSchedulerForFrameworkTest(t, initTestMaster(t, "multi-permit-plugin", nil), 2,
|
context := initTestSchedulerForFrameworkTest(t, initTestMaster(t, "multi-permit-plugin", nil), 2,
|
||||||
@ -1245,22 +1231,53 @@ func TestMultiplePermitPlugins(t *testing.T) {
|
|||||||
cleanupPods(context.clientSet, t, []*v1.Pod{pod})
|
cleanupPods(context.clientSet, t, []*v1.Pod{pod})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestPermitPluginsCancelled tests whether all permit plugins are cancelled when pod is rejected.
|
||||||
|
func TestPermitPluginsCancelled(t *testing.T) {
|
||||||
|
// Create a plugin registry for testing.
|
||||||
|
perPlugin1 := &PermitPlugin{name: "permit-plugin-1"}
|
||||||
|
perPlugin2 := &PermitPlugin{name: "permit-plugin-2"}
|
||||||
|
registry, plugins := initRegistryAndConfig(perPlugin1, perPlugin2)
|
||||||
|
|
||||||
|
// Create the master and the scheduler with the test plugin set.
|
||||||
|
context := initTestSchedulerForFrameworkTest(t, initTestMaster(t, "permit-plugins", nil), 2,
|
||||||
|
scheduler.WithFrameworkPlugins(plugins),
|
||||||
|
scheduler.WithFrameworkDefaultRegistry(registry))
|
||||||
|
defer cleanupTest(t, context)
|
||||||
|
|
||||||
|
// Both permit plugins will return Wait for permitting
|
||||||
|
perPlugin1.timeoutPermit = true
|
||||||
|
perPlugin2.timeoutPermit = true
|
||||||
|
|
||||||
|
// Create a test pod.
|
||||||
|
podName := "test-pod"
|
||||||
|
pod, err := createPausePod(context.clientSet,
|
||||||
|
initPausePod(context.clientSet, &pausePodConfig{Name: podName, Namespace: context.ns.Name}))
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error while creating a test pod: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var waitingPod framework.WaitingPod
|
||||||
|
// Wait until the test pod is actually waiting.
|
||||||
|
wait.Poll(10*time.Millisecond, 30*time.Second, func() (bool, error) {
|
||||||
|
waitingPod = perPlugin1.fh.GetWaitingPod(pod.UID)
|
||||||
|
return waitingPod != nil, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
perPlugin1.rejectAllPods()
|
||||||
|
// Wait some time for the permit plugins to be cancelled
|
||||||
|
err = wait.Poll(10*time.Millisecond, 30*time.Second, func() (bool, error) {
|
||||||
|
return perPlugin1.cancelled && perPlugin2.cancelled, nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Expected all permit plugins to be cancelled")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TestCoSchedulingWithPermitPlugin tests invocation of permit plugins.
|
// TestCoSchedulingWithPermitPlugin tests invocation of permit plugins.
|
||||||
func TestCoSchedulingWithPermitPlugin(t *testing.T) {
|
func TestCoSchedulingWithPermitPlugin(t *testing.T) {
|
||||||
// Create a plugin registry for testing. Register only a permit plugin.
|
// Create a plugin registry for testing. Register only a permit plugin.
|
||||||
permitPlugin := &PermitPlugin{name: permitPluginName}
|
permitPlugin := &PermitPlugin{name: permitPluginName}
|
||||||
registry := framework.Registry{permitPluginName: newPermitPlugin(permitPlugin)}
|
registry, plugins := initRegistryAndConfig(permitPlugin)
|
||||||
|
|
||||||
// Setup initial permit plugin for testing.
|
|
||||||
plugins := &schedulerconfig.Plugins{
|
|
||||||
Permit: &schedulerconfig.PluginSet{
|
|
||||||
Enabled: []schedulerconfig.Plugin{
|
|
||||||
{
|
|
||||||
Name: permitPluginName,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the master and the scheduler with the test plugin set.
|
// Create the master and the scheduler with the test plugin set.
|
||||||
context := initTestSchedulerForFrameworkTest(t, initTestMaster(t, "permit-plugin", nil), 2,
|
context := initTestSchedulerForFrameworkTest(t, initTestMaster(t, "permit-plugin", nil), 2,
|
||||||
@ -1432,18 +1449,7 @@ func TestPostFilterPlugin(t *testing.T) {
|
|||||||
func TestPreemptWithPermitPlugin(t *testing.T) {
|
func TestPreemptWithPermitPlugin(t *testing.T) {
|
||||||
// Create a plugin registry for testing. Register only a permit plugin.
|
// Create a plugin registry for testing. Register only a permit plugin.
|
||||||
permitPlugin := &PermitPlugin{}
|
permitPlugin := &PermitPlugin{}
|
||||||
registry := framework.Registry{permitPluginName: newPermitPlugin(permitPlugin)}
|
registry, plugins := initRegistryAndConfig(permitPlugin)
|
||||||
|
|
||||||
// Setup initial permit plugin for testing.
|
|
||||||
plugins := &schedulerconfig.Plugins{
|
|
||||||
Permit: &schedulerconfig.PluginSet{
|
|
||||||
Enabled: []schedulerconfig.Plugin{
|
|
||||||
{
|
|
||||||
Name: permitPluginName,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the master and the scheduler with the test plugin set.
|
// Create the master and the scheduler with the test plugin set.
|
||||||
context := initTestSchedulerForFrameworkTest(t, initTestMaster(t, "preempt-with-permit-plugin", nil), 0,
|
context := initTestSchedulerForFrameworkTest(t, initTestMaster(t, "preempt-with-permit-plugin", nil), 0,
|
||||||
@ -1522,3 +1528,22 @@ func initTestSchedulerForFrameworkTest(t *testing.T, context *testContext, nodeC
|
|||||||
}
|
}
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// initRegistryAndConfig returns registry and plugins config based on give plugins.
|
||||||
|
// TODO: refactor it to a more generic functions that accepts all kinds of Plugins as arguments
|
||||||
|
func initRegistryAndConfig(pp ...*PermitPlugin) (registry framework.Registry, plugins *schedulerconfig.Plugins) {
|
||||||
|
if len(pp) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
registry = framework.Registry{}
|
||||||
|
plugins = &schedulerconfig.Plugins{
|
||||||
|
Permit: &schedulerconfig.PluginSet{},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, p := range pp {
|
||||||
|
registry.Register(p.Name(), newPermitPlugin(p))
|
||||||
|
plugins.Permit.Enabled = append(plugins.Permit.Enabled, schedulerconfig.Plugin{Name: p.Name()})
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user