Merge pull request #98481 from gavinfish/sched-isstatusequal

Scheduler: add StatusEqual func for Status comparer
This commit is contained in:
Kubernetes Prow Robot 2021-02-03 13:32:28 -08:00 committed by GitHub
commit 0083786ca9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 101 additions and 0 deletions

View File

@ -27,6 +27,8 @@ go_library(
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
"//staging/src/k8s.io/client-go/tools/events:go_default_library",
"//staging/src/k8s.io/kube-scheduler/extender/v1:go_default_library",
"//vendor/github.com/google/go-cmp/cmp:go_default_library",
"//vendor/github.com/google/go-cmp/cmp/cmpopts:go_default_library",
"//vendor/k8s.io/klog/v2:go_default_library",
],
)
@ -63,5 +65,6 @@ go_test(
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
"//vendor/github.com/google/go-cmp/cmp:go_default_library",
],
)

View File

@ -25,6 +25,8 @@ import (
"strings"
"time"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/informers"
@ -180,6 +182,21 @@ func (s *Status) AsError() error {
return errors.New(s.Message())
}
// Equal checks equality of two statuses. This is useful for testing with
// cmp.Equal.
func (s *Status) Equal(x *Status) bool {
if s == nil || x == nil {
return s.IsSuccess() && x.IsSuccess()
}
if s.code != x.code {
return false
}
if s.code == Error {
return cmp.Equal(s.err, x.err, cmpopts.EquateErrors())
}
return cmp.Equal(s.reasons, x.reasons)
}
// NewStatus makes a Status out of the given arguments and returns its pointer.
func NewStatus(code Code, reasons ...string) *Status {
s := &Status{

View File

@ -18,9 +18,14 @@ package framework
import (
"errors"
"fmt"
"testing"
"github.com/google/go-cmp/cmp"
)
var errorStatus = NewStatus(Error, "internal error")
func TestStatus(t *testing.T) {
tests := []struct {
name string
@ -133,3 +138,79 @@ func TestPluginToStatusMerge(t *testing.T) {
})
}
}
func TestIsStatusEqual(t *testing.T) {
tests := []struct {
name string
x, y *Status
want bool
}{
{
name: "two nil should be equal",
x: nil,
y: nil,
want: true,
},
{
name: "nil should be equal to success status",
x: nil,
y: NewStatus(Success),
want: true,
},
{
name: "nil should not be equal with status except success",
x: nil,
y: NewStatus(Error, "internal error"),
want: false,
},
{
name: "one status should be equal to itself",
x: errorStatus,
y: errorStatus,
want: true,
},
{
name: "same type statuses without reasons should be equal",
x: NewStatus(Success),
y: NewStatus(Success),
want: true,
},
{
name: "statuses with same message should be equal",
x: NewStatus(Unschedulable, "unschedulable"),
y: NewStatus(Unschedulable, "unschedulable"),
want: true,
},
{
name: "error statuses with same message should not be equal",
x: NewStatus(Error, "error"),
y: NewStatus(Error, "error"),
want: false,
},
{
name: "statuses with different reasons should not be equal",
x: NewStatus(Unschedulable, "unschedulable"),
y: NewStatus(Unschedulable, "unschedulable", "injected filter status"),
want: false,
},
{
name: "statuses with different codes should not be equal",
x: NewStatus(Error, "internal error"),
y: NewStatus(Unschedulable, "internal error"),
want: false,
},
{
name: "wrap error status should be equal with original one",
x: errorStatus,
y: AsStatus(fmt.Errorf("error: %w", errorStatus.AsError())),
want: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := cmp.Equal(tt.x, tt.y); got != tt.want {
t.Errorf("cmp.Equal() = %v, want %v", got, tt.want)
}
})
}
}