Navigation Menu

Skip to content

Commit

Permalink
Merge pull request #75857 from danielqsj/sc1
Browse files Browse the repository at this point in the history
support both JSON and YAML for scheduler configuration
  • Loading branch information
k8s-ci-robot committed Mar 31, 2019
2 parents d0c0883 + 412adb8 commit 2792f1a
Show file tree
Hide file tree
Showing 4 changed files with 162 additions and 2 deletions.
1 change: 1 addition & 0 deletions pkg/scheduler/api/latest/BUILD
Expand Up @@ -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",
],
)

Expand Down
6 changes: 4 additions & 2 deletions pkg/scheduler/api/latest/latest.go
Expand Up @@ -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"
Expand All @@ -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,
)
Expand Down
93 changes: 93 additions & 0 deletions pkg/scheduler/scheduler_test.go
Expand Up @@ -19,6 +19,9 @@ package scheduler
import (
"errors"
"fmt"
"io/ioutil"
"os"
"path"
"reflect"
"testing"
"time"
Expand All @@ -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"
Expand Down Expand Up @@ -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)
}
}
}
64 changes: 64 additions & 0 deletions test/integration/scheduler/scheduler_test.go
Expand Up @@ -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)
Expand Down

0 comments on commit 2792f1a

Please sign in to comment.