Merge pull request #98266 from gavinfish/sched-runtime-error
Scheduler: wrap errors for framework/runtime
This commit is contained in:
		@@ -540,7 +540,7 @@ func (f *frameworkImpl) RunFilterPlugins(
 | 
				
			|||||||
			if !pluginStatus.IsUnschedulable() {
 | 
								if !pluginStatus.IsUnschedulable() {
 | 
				
			||||||
				// Filter plugins are not supposed to return any status other than
 | 
									// Filter plugins are not supposed to return any status other than
 | 
				
			||||||
				// Success or Unschedulable.
 | 
									// Success or Unschedulable.
 | 
				
			||||||
				errStatus := framework.NewStatus(framework.Error, fmt.Sprintf("running %q filter plugin for pod %q: %v", pl.Name(), pod.Name, pluginStatus.Message()))
 | 
									errStatus := framework.AsStatus(fmt.Errorf("running %q filter plugin: %w", pl.Name(), pluginStatus.AsError()))
 | 
				
			||||||
				return map[string]*framework.Status{pl.Name(): errStatus}
 | 
									return map[string]*framework.Status{pl.Name(): errStatus}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			statuses[pl.Name()] = pluginStatus
 | 
								statuses[pl.Name()] = pluginStatus
 | 
				
			||||||
@@ -579,7 +579,7 @@ func (f *frameworkImpl) RunPostFilterPlugins(ctx context.Context, state *framewo
 | 
				
			|||||||
			return r, s
 | 
								return r, s
 | 
				
			||||||
		} else if !s.IsUnschedulable() {
 | 
							} else if !s.IsUnschedulable() {
 | 
				
			||||||
			// Any status other than Success or Unschedulable is Error.
 | 
								// Any status other than Success or Unschedulable is Error.
 | 
				
			||||||
			return nil, framework.NewStatus(framework.Error, s.Message())
 | 
								return nil, framework.AsStatus(s.AsError())
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		statuses[pl.Name()] = s
 | 
							statuses[pl.Name()] = s
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -637,7 +637,7 @@ func (f *frameworkImpl) RunFilterPluginsWithNominatedPods(ctx context.Context, s
 | 
				
			|||||||
			var err error
 | 
								var err error
 | 
				
			||||||
			podsAdded, stateToUse, nodeInfoToUse, err = addNominatedPods(ctx, ph, pod, state, info)
 | 
								podsAdded, stateToUse, nodeInfoToUse, err = addNominatedPods(ctx, ph, pod, state, info)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return framework.NewStatus(framework.Error, err.Error())
 | 
									return framework.AsStatus(err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else if !podsAdded || !status.IsSuccess() {
 | 
							} else if !podsAdded || !status.IsSuccess() {
 | 
				
			||||||
			break
 | 
								break
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -363,7 +363,10 @@ var nodes = []*v1.Node{
 | 
				
			|||||||
	{ObjectMeta: metav1.ObjectMeta{Name: "node2"}},
 | 
						{ObjectMeta: metav1.ObjectMeta{Name: "node2"}},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var errInjectedStatus = errors.New("injected status")
 | 
					var (
 | 
				
			||||||
 | 
						errInjectedStatus       = errors.New("injected status")
 | 
				
			||||||
 | 
						errInjectedFilterStatus = errors.New("injected filter status")
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func newFrameworkWithQueueSortAndBind(r Registry, pl *config.Plugins, plc []config.PluginConfig, opts ...Option) (framework.Framework, error) {
 | 
					func newFrameworkWithQueueSortAndBind(r Registry, pl *config.Plugins, plc []config.PluginConfig, opts ...Option) (framework.Framework, error) {
 | 
				
			||||||
	if _, ok := r[queueSortPlugin]; !ok {
 | 
						if _, ok := r[queueSortPlugin]; !ok {
 | 
				
			||||||
@@ -891,8 +894,8 @@ func TestFilterPlugins(t *testing.T) {
 | 
				
			|||||||
					inj:  injectedResult{FilterStatus: int(framework.Error)},
 | 
										inj:  injectedResult{FilterStatus: int(framework.Error)},
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			wantStatus:    framework.NewStatus(framework.Error, `running "TestPlugin" filter plugin for pod "": injected filter status`),
 | 
								wantStatus:    framework.AsStatus(fmt.Errorf(`running "TestPlugin" filter plugin: %w`, errInjectedFilterStatus)),
 | 
				
			||||||
			wantStatusMap: framework.PluginToStatus{"TestPlugin": framework.NewStatus(framework.Error, `running "TestPlugin" filter plugin for pod "": injected filter status`)},
 | 
								wantStatusMap: framework.PluginToStatus{"TestPlugin": framework.AsStatus(fmt.Errorf(`running "TestPlugin" filter plugin: %w`, errInjectedFilterStatus))},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			name: "UnschedulableFilter",
 | 
								name: "UnschedulableFilter",
 | 
				
			||||||
@@ -931,8 +934,8 @@ func TestFilterPlugins(t *testing.T) {
 | 
				
			|||||||
					inj:  injectedResult{FilterStatus: int(framework.Error)},
 | 
										inj:  injectedResult{FilterStatus: int(framework.Error)},
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			wantStatus:    framework.NewStatus(framework.Error, `running "TestPlugin1" filter plugin for pod "": injected filter status`),
 | 
								wantStatus:    framework.AsStatus(fmt.Errorf(`running "TestPlugin1" filter plugin: %w`, errInjectedFilterStatus)),
 | 
				
			||||||
			wantStatusMap: framework.PluginToStatus{"TestPlugin1": framework.NewStatus(framework.Error, `running "TestPlugin1" filter plugin for pod "": injected filter status`)},
 | 
								wantStatusMap: framework.PluginToStatus{"TestPlugin1": framework.AsStatus(fmt.Errorf(`running "TestPlugin1" filter plugin: %w`, errInjectedFilterStatus))},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			name: "SuccessAndSuccessFilters",
 | 
								name: "SuccessAndSuccessFilters",
 | 
				
			||||||
@@ -962,8 +965,8 @@ func TestFilterPlugins(t *testing.T) {
 | 
				
			|||||||
					inj:  injectedResult{FilterStatus: int(framework.Success)},
 | 
										inj:  injectedResult{FilterStatus: int(framework.Success)},
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			wantStatus:    framework.NewStatus(framework.Error, `running "TestPlugin1" filter plugin for pod "": injected filter status`),
 | 
								wantStatus:    framework.AsStatus(fmt.Errorf(`running "TestPlugin1" filter plugin: %w`, errInjectedFilterStatus)),
 | 
				
			||||||
			wantStatusMap: framework.PluginToStatus{"TestPlugin1": framework.NewStatus(framework.Error, `running "TestPlugin1" filter plugin for pod "": injected filter status`)},
 | 
								wantStatusMap: framework.PluginToStatus{"TestPlugin1": framework.AsStatus(fmt.Errorf(`running "TestPlugin1" filter plugin: %w`, errInjectedFilterStatus))},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			name: "SuccessAndErrorFilters",
 | 
								name: "SuccessAndErrorFilters",
 | 
				
			||||||
@@ -978,8 +981,8 @@ func TestFilterPlugins(t *testing.T) {
 | 
				
			|||||||
					inj:  injectedResult{FilterStatus: int(framework.Error)},
 | 
										inj:  injectedResult{FilterStatus: int(framework.Error)},
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			wantStatus:    framework.NewStatus(framework.Error, `running "TestPlugin2" filter plugin for pod "": injected filter status`),
 | 
								wantStatus:    framework.AsStatus(fmt.Errorf(`running "TestPlugin2" filter plugin: %w`, errInjectedFilterStatus)),
 | 
				
			||||||
			wantStatusMap: framework.PluginToStatus{"TestPlugin2": framework.NewStatus(framework.Error, `running "TestPlugin2" filter plugin for pod "": injected filter status`)},
 | 
								wantStatusMap: framework.PluginToStatus{"TestPlugin2": framework.AsStatus(fmt.Errorf(`running "TestPlugin2" filter plugin: %w`, errInjectedFilterStatus))},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			name: "SuccessAndUnschedulableFilters",
 | 
								name: "SuccessAndUnschedulableFilters",
 | 
				
			||||||
@@ -1023,8 +1026,8 @@ func TestFilterPlugins(t *testing.T) {
 | 
				
			|||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			runAllFilters: true,
 | 
								runAllFilters: true,
 | 
				
			||||||
			wantStatus:    framework.NewStatus(framework.Error, `running "TestPlugin1" filter plugin for pod "": injected filter status`),
 | 
								wantStatus:    framework.AsStatus(fmt.Errorf(`running "TestPlugin1" filter plugin: %w`, errInjectedFilterStatus)),
 | 
				
			||||||
			wantStatusMap: framework.PluginToStatus{"TestPlugin1": framework.NewStatus(framework.Error, `running "TestPlugin1" filter plugin for pod "": injected filter status`)},
 | 
								wantStatusMap: framework.PluginToStatus{"TestPlugin1": framework.AsStatus(fmt.Errorf(`running "TestPlugin1" filter plugin: %w`, errInjectedFilterStatus))},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			name: "ErrorAndErrorFilters",
 | 
								name: "ErrorAndErrorFilters",
 | 
				
			||||||
@@ -1215,7 +1218,7 @@ func TestFilterPluginsWithNominatedPods(t *testing.T) {
 | 
				
			|||||||
			nominatedPod: highPriorityPod,
 | 
								nominatedPod: highPriorityPod,
 | 
				
			||||||
			node:         node,
 | 
								node:         node,
 | 
				
			||||||
			nodeInfo:     framework.NewNodeInfo(pod),
 | 
								nodeInfo:     framework.NewNodeInfo(pod),
 | 
				
			||||||
			wantStatus:   framework.NewStatus(framework.Error, `running AddPod on PreFilter plugin "TestPlugin1": injected status`),
 | 
								wantStatus:   framework.AsStatus(fmt.Errorf(`running AddPod on PreFilter plugin "TestPlugin1": %w`, errInjectedStatus)),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			name: "node has a high-priority nominated pod and filters fail",
 | 
								name: "node has a high-priority nominated pod and filters fail",
 | 
				
			||||||
@@ -1235,7 +1238,7 @@ func TestFilterPluginsWithNominatedPods(t *testing.T) {
 | 
				
			|||||||
			nominatedPod: highPriorityPod,
 | 
								nominatedPod: highPriorityPod,
 | 
				
			||||||
			node:         node,
 | 
								node:         node,
 | 
				
			||||||
			nodeInfo:     framework.NewNodeInfo(pod),
 | 
								nodeInfo:     framework.NewNodeInfo(pod),
 | 
				
			||||||
			wantStatus:   framework.NewStatus(framework.Error, `running "TestPlugin2" filter plugin for pod "": injected filter status`),
 | 
								wantStatus:   framework.AsStatus(fmt.Errorf(`running "TestPlugin2" filter plugin: %w`, errInjectedFilterStatus)),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			name: "node has a low-priority nominated pod and pre filters return unschedulable",
 | 
								name: "node has a low-priority nominated pod and pre filters return unschedulable",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -954,7 +954,7 @@ func TestSchedulerWithVolumeBinding(t *testing.T) {
 | 
				
			|||||||
				FindErr: findErr,
 | 
									FindErr: findErr,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			eventReason: "FailedScheduling",
 | 
								eventReason: "FailedScheduling",
 | 
				
			||||||
			expectError: fmt.Errorf("running %q filter plugin for pod %q: %v", volumebinding.Name, "foo", findErr),
 | 
								expectError: fmt.Errorf("running %q filter plugin: %v", volumebinding.Name, findErr),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			name: "assume error",
 | 
								name: "assume error",
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user