mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 05:27:21 +00:00
Scheduler: move GetAvoidPodsFromNodeAnnotations to component-helpers
This commit is contained in:
parent
90ca7e89e9
commit
73d8eba1a4
@ -13,7 +13,6 @@ go_test(
|
|||||||
deps = [
|
deps = [
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -17,7 +17,6 @@ limitations under the License.
|
|||||||
package helper
|
package helper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@ -389,19 +388,6 @@ func GetMatchingTolerations(taints []v1.Taint, tolerations []v1.Toleration) (boo
|
|||||||
return true, result
|
return true, result
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetAvoidPodsFromNodeAnnotations scans the list of annotations and
|
|
||||||
// returns the pods that needs to be avoided for this node from scheduling
|
|
||||||
func GetAvoidPodsFromNodeAnnotations(annotations map[string]string) (v1.AvoidPods, error) {
|
|
||||||
var avoidPods v1.AvoidPods
|
|
||||||
if len(annotations) > 0 && annotations[v1.PreferAvoidPodsAnnotationKey] != "" {
|
|
||||||
err := json.Unmarshal([]byte(annotations[v1.PreferAvoidPodsAnnotationKey]), &avoidPods)
|
|
||||||
if err != nil {
|
|
||||||
return avoidPods, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return avoidPods, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetPersistentVolumeClass returns StorageClassName.
|
// GetPersistentVolumeClass returns StorageClassName.
|
||||||
func GetPersistentVolumeClass(volume *v1.PersistentVolume) string {
|
func GetPersistentVolumeClass(volume *v1.PersistentVolume) string {
|
||||||
// Use beta annotation first
|
// Use beta annotation first
|
||||||
|
@ -23,7 +23,6 @@ import (
|
|||||||
|
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
||||||
"k8s.io/apimachinery/pkg/labels"
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -430,102 +429,6 @@ func TestTolerationsTolerateTaintsWithFilter(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetAvoidPodsFromNode(t *testing.T) {
|
|
||||||
controllerFlag := true
|
|
||||||
testCases := []struct {
|
|
||||||
node *v1.Node
|
|
||||||
expectValue v1.AvoidPods
|
|
||||||
expectErr bool
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
node: &v1.Node{},
|
|
||||||
expectValue: v1.AvoidPods{},
|
|
||||||
expectErr: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
node: &v1.Node{
|
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Annotations: map[string]string{
|
|
||||||
v1.PreferAvoidPodsAnnotationKey: `
|
|
||||||
{
|
|
||||||
"preferAvoidPods": [
|
|
||||||
{
|
|
||||||
"podSignature": {
|
|
||||||
"podController": {
|
|
||||||
"apiVersion": "v1",
|
|
||||||
"kind": "ReplicationController",
|
|
||||||
"name": "foo",
|
|
||||||
"uid": "abcdef123456",
|
|
||||||
"controller": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"reason": "some reason",
|
|
||||||
"message": "some message"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}`,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expectValue: v1.AvoidPods{
|
|
||||||
PreferAvoidPods: []v1.PreferAvoidPodsEntry{
|
|
||||||
{
|
|
||||||
PodSignature: v1.PodSignature{
|
|
||||||
PodController: &metav1.OwnerReference{
|
|
||||||
APIVersion: "v1",
|
|
||||||
Kind: "ReplicationController",
|
|
||||||
Name: "foo",
|
|
||||||
UID: "abcdef123456",
|
|
||||||
Controller: &controllerFlag,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Reason: "some reason",
|
|
||||||
Message: "some message",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expectErr: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
node: &v1.Node{
|
|
||||||
// Missing end symbol of "podController" and "podSignature"
|
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Annotations: map[string]string{
|
|
||||||
v1.PreferAvoidPodsAnnotationKey: `
|
|
||||||
{
|
|
||||||
"preferAvoidPods": [
|
|
||||||
{
|
|
||||||
"podSignature": {
|
|
||||||
"podController": {
|
|
||||||
"kind": "ReplicationController",
|
|
||||||
"apiVersion": "v1"
|
|
||||||
"reason": "some reason",
|
|
||||||
"message": "some message"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}`,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expectValue: v1.AvoidPods{},
|
|
||||||
expectErr: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for i, tc := range testCases {
|
|
||||||
v, err := GetAvoidPodsFromNodeAnnotations(tc.node.Annotations)
|
|
||||||
if err == nil && tc.expectErr {
|
|
||||||
t.Errorf("[%v]expected error but got none.", i)
|
|
||||||
}
|
|
||||||
if err != nil && !tc.expectErr {
|
|
||||||
t.Errorf("[%v]did not expect error but got: %v", i, err)
|
|
||||||
}
|
|
||||||
if !reflect.DeepEqual(tc.expectValue, v) {
|
|
||||||
t.Errorf("[%v]expect value %v but got %v with %v", i, tc.expectValue, v, v.PreferAvoidPods[0].PodSignature.PodController.Controller)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestMatchTopologySelectorTerms(t *testing.T) {
|
func TestMatchTopologySelectorTerms(t *testing.T) {
|
||||||
type args struct {
|
type args struct {
|
||||||
topologySelectorTerms []v1.TopologySelectorTerm
|
topologySelectorTerms []v1.TopologySelectorTerm
|
||||||
|
@ -41,6 +41,7 @@ go_library(
|
|||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
|
"//staging/src/k8s.io/component-helpers/scheduling/corev1:go_default_library",
|
||||||
"//vendor/k8s.io/klog/v2:go_default_library",
|
"//vendor/k8s.io/klog/v2:go_default_library",
|
||||||
"//vendor/k8s.io/utils/net:go_default_library",
|
"//vendor/k8s.io/utils/net:go_default_library",
|
||||||
],
|
],
|
||||||
|
@ -45,6 +45,7 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/validation"
|
"k8s.io/apimachinery/pkg/util/validation"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
|
schedulinghelper "k8s.io/component-helpers/scheduling/corev1"
|
||||||
apiservice "k8s.io/kubernetes/pkg/api/service"
|
apiservice "k8s.io/kubernetes/pkg/api/service"
|
||||||
"k8s.io/kubernetes/pkg/apis/core"
|
"k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/core/helper"
|
"k8s.io/kubernetes/pkg/apis/core/helper"
|
||||||
@ -3501,7 +3502,7 @@ func ValidateTopologySelectorTerm(term core.TopologySelectorTerm, fldPath *field
|
|||||||
func ValidateAvoidPodsInNodeAnnotations(annotations map[string]string, fldPath *field.Path) field.ErrorList {
|
func ValidateAvoidPodsInNodeAnnotations(annotations map[string]string, fldPath *field.Path) field.ErrorList {
|
||||||
allErrs := field.ErrorList{}
|
allErrs := field.ErrorList{}
|
||||||
|
|
||||||
v1Avoids, err := v1helper.GetAvoidPodsFromNodeAnnotations(annotations)
|
v1Avoids, err := schedulinghelper.GetAvoidPodsFromNodeAnnotations(annotations)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
allErrs = append(allErrs, field.Invalid(fldPath.Child("AvoidPods"), core.PreferAvoidPodsAnnotationKey, err.Error()))
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("AvoidPods"), core.PreferAvoidPodsAnnotationKey, err.Error()))
|
||||||
return allErrs
|
return allErrs
|
||||||
|
@ -6,11 +6,11 @@ go_library(
|
|||||||
importpath = "k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodepreferavoidpods",
|
importpath = "k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodepreferavoidpods",
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core/v1/helper:go_default_library",
|
|
||||||
"//pkg/scheduler/framework:go_default_library",
|
"//pkg/scheduler/framework:go_default_library",
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
"//staging/src/k8s.io/component-helpers/scheduling/corev1:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ import (
|
|||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper"
|
v1helper "k8s.io/component-helpers/scheduling/corev1"
|
||||||
"k8s.io/kubernetes/pkg/scheduler/framework"
|
"k8s.io/kubernetes/pkg/scheduler/framework"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -17,6 +17,8 @@ limitations under the License.
|
|||||||
package corev1
|
package corev1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/component-helpers/scheduling/corev1/nodeaffinity"
|
"k8s.io/component-helpers/scheduling/corev1/nodeaffinity"
|
||||||
)
|
)
|
||||||
@ -43,3 +45,16 @@ func MatchNodeSelectorTerms(
|
|||||||
}
|
}
|
||||||
return nodeaffinity.NewLazyErrorNodeSelector(nodeSelector).Match(node)
|
return nodeaffinity.NewLazyErrorNodeSelector(nodeSelector).Match(node)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetAvoidPodsFromNodeAnnotations scans the list of annotations and
|
||||||
|
// returns the pods that needs to be avoided for this node from scheduling
|
||||||
|
func GetAvoidPodsFromNodeAnnotations(annotations map[string]string) (v1.AvoidPods, error) {
|
||||||
|
var avoidPods v1.AvoidPods
|
||||||
|
if len(annotations) > 0 && annotations[v1.PreferAvoidPodsAnnotationKey] != "" {
|
||||||
|
err := json.Unmarshal([]byte(annotations[v1.PreferAvoidPodsAnnotationKey]), &avoidPods)
|
||||||
|
if err != nil {
|
||||||
|
return avoidPods, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return avoidPods, nil
|
||||||
|
}
|
||||||
|
@ -17,6 +17,7 @@ limitations under the License.
|
|||||||
package corev1
|
package corev1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
@ -545,3 +546,99 @@ func TestMatchNodeSelectorTermsStateless(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetAvoidPodsFromNode(t *testing.T) {
|
||||||
|
controllerFlag := true
|
||||||
|
testCases := []struct {
|
||||||
|
node *v1.Node
|
||||||
|
expectValue v1.AvoidPods
|
||||||
|
expectErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
node: &v1.Node{},
|
||||||
|
expectValue: v1.AvoidPods{},
|
||||||
|
expectErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
node: &v1.Node{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Annotations: map[string]string{
|
||||||
|
v1.PreferAvoidPodsAnnotationKey: `
|
||||||
|
{
|
||||||
|
"preferAvoidPods": [
|
||||||
|
{
|
||||||
|
"podSignature": {
|
||||||
|
"podController": {
|
||||||
|
"apiVersion": "v1",
|
||||||
|
"kind": "ReplicationController",
|
||||||
|
"name": "foo",
|
||||||
|
"uid": "abcdef123456",
|
||||||
|
"controller": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"reason": "some reason",
|
||||||
|
"message": "some message"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectValue: v1.AvoidPods{
|
||||||
|
PreferAvoidPods: []v1.PreferAvoidPodsEntry{
|
||||||
|
{
|
||||||
|
PodSignature: v1.PodSignature{
|
||||||
|
PodController: &metav1.OwnerReference{
|
||||||
|
APIVersion: "v1",
|
||||||
|
Kind: "ReplicationController",
|
||||||
|
Name: "foo",
|
||||||
|
UID: "abcdef123456",
|
||||||
|
Controller: &controllerFlag,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Reason: "some reason",
|
||||||
|
Message: "some message",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
node: &v1.Node{
|
||||||
|
// Missing end symbol of "podController" and "podSignature"
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Annotations: map[string]string{
|
||||||
|
v1.PreferAvoidPodsAnnotationKey: `
|
||||||
|
{
|
||||||
|
"preferAvoidPods": [
|
||||||
|
{
|
||||||
|
"podSignature": {
|
||||||
|
"podController": {
|
||||||
|
"kind": "ReplicationController",
|
||||||
|
"apiVersion": "v1"
|
||||||
|
"reason": "some reason",
|
||||||
|
"message": "some message"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectValue: v1.AvoidPods{},
|
||||||
|
expectErr: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, tc := range testCases {
|
||||||
|
v, err := GetAvoidPodsFromNodeAnnotations(tc.node.Annotations)
|
||||||
|
if err == nil && tc.expectErr {
|
||||||
|
t.Errorf("[%v]expected error but got none.", i)
|
||||||
|
}
|
||||||
|
if err != nil && !tc.expectErr {
|
||||||
|
t.Errorf("[%v]did not expect error but got: %v", i, err)
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(tc.expectValue, v) {
|
||||||
|
t.Errorf("[%v]expect value %v but got %v with %v", i, tc.expectValue, v, v.PreferAvoidPods[0].PodSignature.PodController.Controller)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user