Move Scheduler plugin args validation to apis/config/validation
This commit is contained in:
@@ -7,6 +7,7 @@ go_library(
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//pkg/scheduler/apis/config:go_default_library",
|
||||
"//pkg/scheduler/apis/config/validation:go_default_library",
|
||||
"//pkg/scheduler/framework/v1alpha1:go_default_library",
|
||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||
|
@@ -24,6 +24,7 @@ import (
|
||||
"k8s.io/apimachinery/pkg/labels"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/kubernetes/pkg/scheduler/apis/config"
|
||||
"k8s.io/kubernetes/pkg/scheduler/apis/config/validation"
|
||||
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
|
||||
)
|
||||
|
||||
@@ -35,32 +36,17 @@ const (
|
||||
ErrReasonPresenceViolated = "node(s) didn't have the requested labels"
|
||||
)
|
||||
|
||||
// validateArgs validates that presentLabels and absentLabels do not conflict.
|
||||
func validateNoConflict(presentLabels []string, absentLabels []string) error {
|
||||
m := make(map[string]struct{}, len(presentLabels))
|
||||
for _, l := range presentLabels {
|
||||
m[l] = struct{}{}
|
||||
}
|
||||
for _, l := range absentLabels {
|
||||
if _, ok := m[l]; ok {
|
||||
return fmt.Errorf("detecting at least one label (e.g., %q) that exist in both the present(%+v) and absent(%+v) label list", l, presentLabels, absentLabels)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// New initializes a new plugin and returns it.
|
||||
func New(plArgs runtime.Object, handle framework.FrameworkHandle) (framework.Plugin, error) {
|
||||
args, err := getArgs(plArgs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := validateNoConflict(args.PresentLabels, args.AbsentLabels); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := validateNoConflict(args.PresentLabelsPreference, args.AbsentLabelsPreference); err != nil {
|
||||
|
||||
if err := validation.ValidateNodeLabelArgs(args); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &NodeLabel{
|
||||
handle: handle,
|
||||
args: args,
|
||||
|
@@ -27,67 +27,6 @@ import (
|
||||
"k8s.io/kubernetes/pkg/scheduler/internal/cache"
|
||||
)
|
||||
|
||||
func TestValidateNodeLabelArgs(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
args config.NodeLabelArgs
|
||||
err bool
|
||||
}{
|
||||
{
|
||||
name: "happy case",
|
||||
args: config.NodeLabelArgs{
|
||||
PresentLabels: []string{"foo", "bar"},
|
||||
AbsentLabels: []string{"baz"},
|
||||
PresentLabelsPreference: []string{"foo", "bar"},
|
||||
AbsentLabelsPreference: []string{"baz"},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "label presence conflict",
|
||||
// "bar" exists in both present and absent labels therefore validation should fail.
|
||||
args: config.NodeLabelArgs{
|
||||
PresentLabels: []string{"foo", "bar"},
|
||||
AbsentLabels: []string{"bar", "baz"},
|
||||
PresentLabelsPreference: []string{"foo", "bar"},
|
||||
AbsentLabelsPreference: []string{"baz"},
|
||||
},
|
||||
err: true,
|
||||
},
|
||||
{
|
||||
name: "label preference conflict",
|
||||
// "bar" exists in both present and absent labels preferences therefore validation should fail.
|
||||
args: config.NodeLabelArgs{
|
||||
PresentLabels: []string{"foo", "bar"},
|
||||
AbsentLabels: []string{"baz"},
|
||||
PresentLabelsPreference: []string{"foo", "bar"},
|
||||
AbsentLabelsPreference: []string{"bar", "baz"},
|
||||
},
|
||||
err: true,
|
||||
},
|
||||
{
|
||||
name: "both label presence and preference conflict",
|
||||
args: config.NodeLabelArgs{
|
||||
PresentLabels: []string{"foo", "bar"},
|
||||
AbsentLabels: []string{"bar", "baz"},
|
||||
PresentLabelsPreference: []string{"foo", "bar"},
|
||||
AbsentLabelsPreference: []string{"bar", "baz"},
|
||||
},
|
||||
err: true,
|
||||
},
|
||||
}
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
_, err := New(&test.args, nil)
|
||||
if test.err && err == nil {
|
||||
t.Fatal("Plugin initialization should fail.")
|
||||
}
|
||||
if !test.err && err != nil {
|
||||
t.Fatalf("Plugin initialization shouldn't fail: %v", err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestNodeLabelFilter(t *testing.T) {
|
||||
label := map[string]string{"foo": "any value", "bar": "any value"}
|
||||
var pod *v1.Pod
|
||||
@@ -341,5 +280,4 @@ func TestNodeLabelScoreWithoutNode(t *testing.T) {
|
||||
t.Errorf("Status mismatch. got: %v, want: %v", status.Code(), framework.Error)
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user