mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-22 11:21:47 +00:00
Merge pull request #75857 from danielqsj/sc1
support both JSON and YAML for scheduler configuration
This commit is contained in:
commit
2792f1a24e
@ -16,6 +16,7 @@ go_library(
|
|||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_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/json:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning: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",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apimachinery/pkg/runtime/serializer/json"
|
"k8s.io/apimachinery/pkg/runtime/serializer/json"
|
||||||
"k8s.io/apimachinery/pkg/runtime/serializer/versioning"
|
"k8s.io/apimachinery/pkg/runtime/serializer/versioning"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/serializer/yaml"
|
||||||
schedulerapi "k8s.io/kubernetes/pkg/scheduler/api"
|
schedulerapi "k8s.io/kubernetes/pkg/scheduler/api"
|
||||||
// Init the api v1 package
|
// Init the api v1 package
|
||||||
_ "k8s.io/kubernetes/pkg/scheduler/api/v1"
|
_ "k8s.io/kubernetes/pkg/scheduler/api/v1"
|
||||||
@ -44,10 +45,11 @@ var Codec runtime.Codec
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
jsonSerializer := json.NewSerializer(json.DefaultMetaFactory, schedulerapi.Scheme, schedulerapi.Scheme, true)
|
jsonSerializer := json.NewSerializer(json.DefaultMetaFactory, schedulerapi.Scheme, schedulerapi.Scheme, true)
|
||||||
|
serializer := yaml.NewDecodingSerializer(jsonSerializer)
|
||||||
Codec = versioning.NewDefaultingCodecForScheme(
|
Codec = versioning.NewDefaultingCodecForScheme(
|
||||||
schedulerapi.Scheme,
|
schedulerapi.Scheme,
|
||||||
jsonSerializer,
|
serializer,
|
||||||
jsonSerializer,
|
serializer,
|
||||||
schema.GroupVersion{Version: Version},
|
schema.GroupVersion{Version: Version},
|
||||||
runtime.InternalGroupVersioner,
|
runtime.InternalGroupVersioner,
|
||||||
)
|
)
|
||||||
|
@ -19,6 +19,9 @@ package scheduler
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
@ -43,6 +46,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/scheduler/algorithm/predicates"
|
"k8s.io/kubernetes/pkg/scheduler/algorithm/predicates"
|
||||||
"k8s.io/kubernetes/pkg/scheduler/algorithm/priorities"
|
"k8s.io/kubernetes/pkg/scheduler/algorithm/priorities"
|
||||||
"k8s.io/kubernetes/pkg/scheduler/api"
|
"k8s.io/kubernetes/pkg/scheduler/api"
|
||||||
|
schedulerapi "k8s.io/kubernetes/pkg/scheduler/api"
|
||||||
kubeschedulerconfig "k8s.io/kubernetes/pkg/scheduler/apis/config"
|
kubeschedulerconfig "k8s.io/kubernetes/pkg/scheduler/apis/config"
|
||||||
"k8s.io/kubernetes/pkg/scheduler/core"
|
"k8s.io/kubernetes/pkg/scheduler/core"
|
||||||
"k8s.io/kubernetes/pkg/scheduler/factory"
|
"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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -162,6 +162,70 @@ func TestSchedulerCreationFromConfigMap(t *testing.T) {
|
|||||||
),
|
),
|
||||||
expectedPrioritizers: sets.NewString(),
|
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.
|
// Add a ConfigMap object.
|
||||||
configPolicyName := fmt.Sprintf("scheduler-custom-policy-config-%d", i)
|
configPolicyName := fmt.Sprintf("scheduler-custom-policy-config-%d", i)
|
||||||
|
Loading…
Reference in New Issue
Block a user