diff --git a/pkg/scheduler/framework/interface.go b/pkg/scheduler/framework/interface.go index 16b84c7716e..feadee9af8d 100644 --- a/pkg/scheduler/framework/interface.go +++ b/pkg/scheduler/framework/interface.go @@ -198,6 +198,11 @@ func (s *Status) IsWait() bool { return s.Code() == Wait } +// IsSkip returns true if and only if "Status" is non-nil and its Code is "Skip". +func (s *Status) IsSkip() bool { + return s.Code() == Skip +} + // IsUnschedulable returns true if "Status" is Unschedulable (Unschedulable or UnschedulableAndUnresolvable). func (s *Status) IsUnschedulable() bool { code := s.Code() @@ -207,7 +212,7 @@ func (s *Status) IsUnschedulable() bool { // AsError returns nil if the status is a success or a wait; otherwise returns an "error" object // with a concatenated message on reasons of the Status. func (s *Status) AsError() error { - if s.IsSuccess() || s.IsWait() { + if s.IsSuccess() || s.IsWait() || s.IsSkip() { return nil } if s.err != nil { diff --git a/pkg/scheduler/framework/interface_test.go b/pkg/scheduler/framework/interface_test.go index 8a521506aed..dc4e1aa4d05 100644 --- a/pkg/scheduler/framework/interface_test.go +++ b/pkg/scheduler/framework/interface_test.go @@ -35,6 +35,7 @@ func TestStatus(t *testing.T) { expectedMessage string expectedIsSuccess bool expectedIsWait bool + expectedIsSkip bool expectedAsError error }{ { @@ -44,6 +45,7 @@ func TestStatus(t *testing.T) { expectedMessage: "", expectedIsSuccess: true, expectedIsWait: false, + expectedIsSkip: false, expectedAsError: nil, }, { @@ -53,6 +55,7 @@ func TestStatus(t *testing.T) { expectedMessage: "", expectedIsSuccess: false, expectedIsWait: true, + expectedIsSkip: false, expectedAsError: nil, }, { @@ -62,14 +65,26 @@ func TestStatus(t *testing.T) { expectedMessage: "unknown error", expectedIsSuccess: false, expectedIsWait: false, + expectedIsSkip: false, expectedAsError: errors.New("unknown error"), }, + { + name: "skip status", + status: NewStatus(Skip, ""), + expectedCode: Skip, + expectedMessage: "", + expectedIsSuccess: false, + expectedIsWait: false, + expectedIsSkip: true, + expectedAsError: nil, + }, { name: "nil status", status: nil, expectedCode: Success, expectedMessage: "", expectedIsSuccess: true, + expectedIsSkip: false, expectedAsError: nil, }, } @@ -92,6 +107,10 @@ func TestStatus(t *testing.T) { t.Errorf("status.IsWait() returns %v, but want %v", test.status.IsWait(), test.expectedIsWait) } + if test.status.IsSkip() != test.expectedIsSkip { + t.Errorf("status.IsSkip() returns %v, but want %v", test.status.IsSkip(), test.expectedIsSkip) + } + if test.status.AsError() == test.expectedAsError { return } diff --git a/pkg/scheduler/framework/runtime/framework.go b/pkg/scheduler/framework/runtime/framework.go index f9c3d29ff84..3fa96c2530b 100644 --- a/pkg/scheduler/framework/runtime/framework.go +++ b/pkg/scheduler/framework/runtime/framework.go @@ -1038,7 +1038,7 @@ func (f *frameworkImpl) RunBindPlugins(ctx context.Context, state *framework.Cyc } for _, bp := range f.bindPlugins { status = f.runBindPlugin(ctx, bp, state, pod, nodeName) - if status != nil && status.Code() == framework.Skip { + if status.IsSkip() { continue } if !status.IsSuccess() {