Skip to content

Commit 2792f1a

Browse files
authored
Merge pull request kubernetes#75857 from danielqsj/sc1
support both JSON and YAML for scheduler configuration
2 parents d0c0883 + 412adb8 commit 2792f1a

File tree

4 files changed

+162
-2
lines changed

4 files changed

+162
-2
lines changed

pkg/scheduler/api/latest/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ go_library(
1616
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
1717
"//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library",
1818
"//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning:go_default_library",
19+
"//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/yaml:go_default_library",
1920
],
2021
)
2122

pkg/scheduler/api/latest/latest.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"k8s.io/apimachinery/pkg/runtime/schema"
2222
"k8s.io/apimachinery/pkg/runtime/serializer/json"
2323
"k8s.io/apimachinery/pkg/runtime/serializer/versioning"
24+
"k8s.io/apimachinery/pkg/runtime/serializer/yaml"
2425
schedulerapi "k8s.io/kubernetes/pkg/scheduler/api"
2526
// Init the api v1 package
2627
_ "k8s.io/kubernetes/pkg/scheduler/api/v1"
@@ -44,10 +45,11 @@ var Codec runtime.Codec
4445

4546
func init() {
4647
jsonSerializer := json.NewSerializer(json.DefaultMetaFactory, schedulerapi.Scheme, schedulerapi.Scheme, true)
48+
serializer := yaml.NewDecodingSerializer(jsonSerializer)
4749
Codec = versioning.NewDefaultingCodecForScheme(
4850
schedulerapi.Scheme,
49-
jsonSerializer,
50-
jsonSerializer,
51+
serializer,
52+
serializer,
5153
schema.GroupVersion{Version: Version},
5254
runtime.InternalGroupVersioner,
5355
)

pkg/scheduler/scheduler_test.go

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ package scheduler
1919
import (
2020
"errors"
2121
"fmt"
22+
"io/ioutil"
23+
"os"
24+
"path"
2225
"reflect"
2326
"testing"
2427
"time"
@@ -43,6 +46,7 @@ import (
4346
"k8s.io/kubernetes/pkg/scheduler/algorithm/predicates"
4447
"k8s.io/kubernetes/pkg/scheduler/algorithm/priorities"
4548
"k8s.io/kubernetes/pkg/scheduler/api"
49+
schedulerapi "k8s.io/kubernetes/pkg/scheduler/api"
4650
kubeschedulerconfig "k8s.io/kubernetes/pkg/scheduler/apis/config"
4751
"k8s.io/kubernetes/pkg/scheduler/core"
4852
"k8s.io/kubernetes/pkg/scheduler/factory"
@@ -935,3 +939,92 @@ func TestSchedulerWithVolumeBinding(t *testing.T) {
935939
})
936940
}
937941
}
942+
943+
func TestInitPolicyFromFile(t *testing.T) {
944+
dir, err := ioutil.TempDir(os.TempDir(), "policy")
945+
if err != nil {
946+
t.Errorf("unexpected error: %v", err)
947+
}
948+
defer os.RemoveAll(dir)
949+
950+
for i, test := range []struct {
951+
policy string
952+
expectedPredicates sets.String
953+
expectedPrioritizers sets.String
954+
}{
955+
// Test json format policy file
956+
{
957+
policy: `{
958+
"kind" : "Policy",
959+
"apiVersion" : "v1",
960+
"predicates" : [
961+
{"name" : "PredicateOne"},
962+
{"name" : "PredicateTwo"}
963+
],
964+
"priorities" : [
965+
{"name" : "PriorityOne", "weight" : 1},
966+
{"name" : "PriorityTwo", "weight" : 5}
967+
]
968+
}`,
969+
expectedPredicates: sets.NewString(
970+
"PredicateOne",
971+
"PredicateTwo",
972+
),
973+
expectedPrioritizers: sets.NewString(
974+
"PriorityOne",
975+
"PriorityTwo",
976+
),
977+
},
978+
// Test yaml format policy file
979+
{
980+
policy: `apiVersion: v1
981+
kind: Policy
982+
predicates:
983+
- name: PredicateOne
984+
- name: PredicateTwo
985+
priorities:
986+
- name: PriorityOne
987+
weight: 1
988+
- name: PriorityTwo
989+
weight: 5
990+
`,
991+
expectedPredicates: sets.NewString(
992+
"PredicateOne",
993+
"PredicateTwo",
994+
),
995+
expectedPrioritizers: sets.NewString(
996+
"PriorityOne",
997+
"PriorityTwo",
998+
),
999+
},
1000+
} {
1001+
file := fmt.Sprintf("scheduler-policy-config-file-%d", i)
1002+
fullPath := path.Join(dir, file)
1003+
1004+
if err := ioutil.WriteFile(fullPath, []byte(test.policy), 0644); err != nil {
1005+
t.Fatalf("Failed writing a policy config file: %v", err)
1006+
}
1007+
1008+
policy := &schedulerapi.Policy{}
1009+
1010+
if err := initPolicyFromFile(fullPath, policy); err != nil {
1011+
t.Fatalf("Failed writing a policy config file: %v", err)
1012+
}
1013+
1014+
// Verify that the policy is initialized correctly.
1015+
schedPredicates := sets.NewString()
1016+
for _, p := range policy.Predicates {
1017+
schedPredicates.Insert(p.Name)
1018+
}
1019+
schedPrioritizers := sets.NewString()
1020+
for _, p := range policy.Priorities {
1021+
schedPrioritizers.Insert(p.Name)
1022+
}
1023+
if !schedPredicates.Equal(test.expectedPredicates) {
1024+
t.Errorf("Expected predicates %v, got %v", test.expectedPredicates, schedPredicates)
1025+
}
1026+
if !schedPrioritizers.Equal(test.expectedPrioritizers) {
1027+
t.Errorf("Expected priority functions %v, got %v", test.expectedPrioritizers, schedPrioritizers)
1028+
}
1029+
}
1030+
}

test/integration/scheduler/scheduler_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,70 @@ func TestSchedulerCreationFromConfigMap(t *testing.T) {
162162
),
163163
expectedPrioritizers: sets.NewString(),
164164
},
165+
{
166+
policy: `apiVersion: v1
167+
kind: Policy
168+
predicates:
169+
- name: PredicateOne
170+
- name: PredicateTwo
171+
priorities:
172+
- name: PriorityOne
173+
weight: 1
174+
- name: PriorityTwo
175+
weight: 5
176+
`,
177+
expectedPredicates: sets.NewString(
178+
"CheckNodeCondition", // mandatory predicate
179+
"PredicateOne",
180+
"PredicateTwo",
181+
),
182+
expectedPrioritizers: sets.NewString(
183+
"PriorityOne",
184+
"PriorityTwo",
185+
),
186+
},
187+
{
188+
policy: `apiVersion: v1
189+
kind: Policy
190+
`,
191+
expectedPredicates: sets.NewString(
192+
"CheckNodeCondition", // mandatory predicate
193+
"CheckNodeDiskPressure",
194+
"CheckNodeMemoryPressure",
195+
"CheckNodePIDPressure",
196+
"CheckVolumeBinding",
197+
"GeneralPredicates",
198+
"MatchInterPodAffinity",
199+
"MaxAzureDiskVolumeCount",
200+
"MaxCSIVolumeCountPred",
201+
"MaxEBSVolumeCount",
202+
"MaxGCEPDVolumeCount",
203+
"NoDiskConflict",
204+
"NoVolumeZoneConflict",
205+
"PodToleratesNodeTaints",
206+
),
207+
expectedPrioritizers: sets.NewString(
208+
"BalancedResourceAllocation",
209+
"InterPodAffinityPriority",
210+
"LeastRequestedPriority",
211+
"NodeAffinityPriority",
212+
"NodePreferAvoidPodsPriority",
213+
"SelectorSpreadPriority",
214+
"TaintTolerationPriority",
215+
"ImageLocalityPriority",
216+
),
217+
},
218+
{
219+
policy: `apiVersion: v1
220+
kind: Policy
221+
predicates: []
222+
priorities: []
223+
`,
224+
expectedPredicates: sets.NewString(
225+
"CheckNodeCondition", // mandatory predicate
226+
),
227+
expectedPrioritizers: sets.NewString(),
228+
},
165229
} {
166230
// Add a ConfigMap object.
167231
configPolicyName := fmt.Sprintf("scheduler-custom-policy-config-%d", i)

0 commit comments

Comments
 (0)