diff --git a/pkg/scheduler/api/latest/BUILD b/pkg/scheduler/api/latest/BUILD index 97cf4626bcf..65b4db771a0 100644 --- a/pkg/scheduler/api/latest/BUILD +++ b/pkg/scheduler/api/latest/BUILD @@ -16,6 +16,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/yaml:go_default_library", ], ) diff --git a/pkg/scheduler/api/latest/latest.go b/pkg/scheduler/api/latest/latest.go index 97696d57be1..f4a4ff7adcf 100644 --- a/pkg/scheduler/api/latest/latest.go +++ b/pkg/scheduler/api/latest/latest.go @@ -21,6 +21,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer/json" "k8s.io/apimachinery/pkg/runtime/serializer/versioning" + "k8s.io/apimachinery/pkg/runtime/serializer/yaml" schedulerapi "k8s.io/kubernetes/pkg/scheduler/api" // Init the api v1 package _ "k8s.io/kubernetes/pkg/scheduler/api/v1" @@ -44,10 +45,11 @@ var Codec runtime.Codec func init() { jsonSerializer := json.NewSerializer(json.DefaultMetaFactory, schedulerapi.Scheme, schedulerapi.Scheme, true) + serializer := yaml.NewDecodingSerializer(jsonSerializer) Codec = versioning.NewDefaultingCodecForScheme( schedulerapi.Scheme, - jsonSerializer, - jsonSerializer, + serializer, + serializer, schema.GroupVersion{Version: Version}, runtime.InternalGroupVersioner, ) diff --git a/pkg/scheduler/scheduler_test.go b/pkg/scheduler/scheduler_test.go index 79573265c6b..86e187ba46d 100644 --- a/pkg/scheduler/scheduler_test.go +++ b/pkg/scheduler/scheduler_test.go @@ -19,6 +19,9 @@ package scheduler import ( "errors" "fmt" + "io/ioutil" + "os" + "path" "reflect" "testing" "time" @@ -43,6 +46,7 @@ import ( "k8s.io/kubernetes/pkg/scheduler/algorithm/predicates" "k8s.io/kubernetes/pkg/scheduler/algorithm/priorities" "k8s.io/kubernetes/pkg/scheduler/api" + schedulerapi "k8s.io/kubernetes/pkg/scheduler/api" kubeschedulerconfig "k8s.io/kubernetes/pkg/scheduler/apis/config" "k8s.io/kubernetes/pkg/scheduler/core" "k8s.io/kubernetes/pkg/scheduler/factory" @@ -935,3 +939,92 @@ func TestSchedulerWithVolumeBinding(t *testing.T) { }) } } + +func TestInitPolicyFromFile(t *testing.T) { + dir, err := ioutil.TempDir(os.TempDir(), "policy") + if err != nil { + t.Errorf("unexpected error: %v", err) + } + defer os.RemoveAll(dir) + + for i, test := range []struct { + policy string + expectedPredicates sets.String + expectedPrioritizers sets.String + }{ + // Test json format policy file + { + policy: `{ + "kind" : "Policy", + "apiVersion" : "v1", + "predicates" : [ + {"name" : "PredicateOne"}, + {"name" : "PredicateTwo"} + ], + "priorities" : [ + {"name" : "PriorityOne", "weight" : 1}, + {"name" : "PriorityTwo", "weight" : 5} + ] + }`, + expectedPredicates: sets.NewString( + "PredicateOne", + "PredicateTwo", + ), + expectedPrioritizers: sets.NewString( + "PriorityOne", + "PriorityTwo", + ), + }, + // Test yaml format policy file + { + policy: `apiVersion: v1 +kind: Policy +predicates: +- name: PredicateOne +- name: PredicateTwo +priorities: +- name: PriorityOne + weight: 1 +- name: PriorityTwo + weight: 5 +`, + expectedPredicates: sets.NewString( + "PredicateOne", + "PredicateTwo", + ), + expectedPrioritizers: sets.NewString( + "PriorityOne", + "PriorityTwo", + ), + }, + } { + file := fmt.Sprintf("scheduler-policy-config-file-%d", i) + fullPath := path.Join(dir, file) + + if err := ioutil.WriteFile(fullPath, []byte(test.policy), 0644); err != nil { + t.Fatalf("Failed writing a policy config file: %v", err) + } + + policy := &schedulerapi.Policy{} + + if err := initPolicyFromFile(fullPath, policy); err != nil { + t.Fatalf("Failed writing a policy config file: %v", err) + } + + // Verify that the policy is initialized correctly. + schedPredicates := sets.NewString() + for _, p := range policy.Predicates { + schedPredicates.Insert(p.Name) + } + schedPrioritizers := sets.NewString() + for _, p := range policy.Priorities { + schedPrioritizers.Insert(p.Name) + } + if !schedPredicates.Equal(test.expectedPredicates) { + t.Errorf("Expected predicates %v, got %v", test.expectedPredicates, schedPredicates) + } + if !schedPrioritizers.Equal(test.expectedPrioritizers) { + t.Errorf("Expected priority functions %v, got %v", test.expectedPrioritizers, schedPrioritizers) + } + } +} diff --git a/test/integration/scheduler/scheduler_test.go b/test/integration/scheduler/scheduler_test.go index 4970294264e..6de176b1d46 100644 --- a/test/integration/scheduler/scheduler_test.go +++ b/test/integration/scheduler/scheduler_test.go @@ -162,6 +162,70 @@ func TestSchedulerCreationFromConfigMap(t *testing.T) { ), expectedPrioritizers: sets.NewString(), }, + { + policy: `apiVersion: v1 +kind: Policy +predicates: +- name: PredicateOne +- name: PredicateTwo +priorities: +- name: PriorityOne + weight: 1 +- name: PriorityTwo + weight: 5 +`, + expectedPredicates: sets.NewString( + "CheckNodeCondition", // mandatory predicate + "PredicateOne", + "PredicateTwo", + ), + expectedPrioritizers: sets.NewString( + "PriorityOne", + "PriorityTwo", + ), + }, + { + policy: `apiVersion: v1 +kind: Policy +`, + expectedPredicates: sets.NewString( + "CheckNodeCondition", // mandatory predicate + "CheckNodeDiskPressure", + "CheckNodeMemoryPressure", + "CheckNodePIDPressure", + "CheckVolumeBinding", + "GeneralPredicates", + "MatchInterPodAffinity", + "MaxAzureDiskVolumeCount", + "MaxCSIVolumeCountPred", + "MaxEBSVolumeCount", + "MaxGCEPDVolumeCount", + "NoDiskConflict", + "NoVolumeZoneConflict", + "PodToleratesNodeTaints", + ), + expectedPrioritizers: sets.NewString( + "BalancedResourceAllocation", + "InterPodAffinityPriority", + "LeastRequestedPriority", + "NodeAffinityPriority", + "NodePreferAvoidPodsPriority", + "SelectorSpreadPriority", + "TaintTolerationPriority", + "ImageLocalityPriority", + ), + }, + { + policy: `apiVersion: v1 +kind: Policy +predicates: [] +priorities: [] +`, + expectedPredicates: sets.NewString( + "CheckNodeCondition", // mandatory predicate + ), + expectedPrioritizers: sets.NewString(), + }, } { // Add a ConfigMap object. configPolicyName := fmt.Sprintf("scheduler-custom-policy-config-%d", i)