[migration phase 1] Implement CheckVolumeBinding as a filter plugin
This commit is contained in:
		| @@ -570,7 +570,6 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { | |||||||
| 				"MaxAzureDiskVolumeCount", | 				"MaxAzureDiskVolumeCount", | ||||||
| 				"MatchInterPodAffinity", | 				"MatchInterPodAffinity", | ||||||
| 				"GeneralPredicates", | 				"GeneralPredicates", | ||||||
| 				"CheckVolumeBinding", |  | ||||||
| 				"TestServiceAffinity", | 				"TestServiceAffinity", | ||||||
| 				"TestLabelsPresence", | 				"TestLabelsPresence", | ||||||
| 			), | 			), | ||||||
| @@ -589,6 +588,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { | |||||||
| 				"FilterPlugin": { | 				"FilterPlugin": { | ||||||
| 					{Name: "NodeName"}, | 					{Name: "NodeName"}, | ||||||
| 					{Name: "TaintToleration"}, | 					{Name: "TaintToleration"}, | ||||||
|  | 					{Name: "VolumeBinding"}, | ||||||
| 				}, | 				}, | ||||||
| 				"ScorePlugin": {{Name: "TaintToleration", Weight: 2}}, | 				"ScorePlugin": {{Name: "TaintToleration", Weight: 2}}, | ||||||
| 			}, | 			}, | ||||||
| @@ -671,7 +671,6 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { | |||||||
| 				"MaxAzureDiskVolumeCount", | 				"MaxAzureDiskVolumeCount", | ||||||
| 				"MatchInterPodAffinity", | 				"MatchInterPodAffinity", | ||||||
| 				"GeneralPredicates", | 				"GeneralPredicates", | ||||||
| 				"CheckVolumeBinding", |  | ||||||
| 				"TestServiceAffinity", | 				"TestServiceAffinity", | ||||||
| 				"TestLabelsPresence", | 				"TestLabelsPresence", | ||||||
| 			), | 			), | ||||||
| @@ -690,6 +689,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { | |||||||
| 				"FilterPlugin": { | 				"FilterPlugin": { | ||||||
| 					{Name: "NodeName"}, | 					{Name: "NodeName"}, | ||||||
| 					{Name: "TaintToleration"}, | 					{Name: "TaintToleration"}, | ||||||
|  | 					{Name: "VolumeBinding"}, | ||||||
| 				}, | 				}, | ||||||
| 				"ScorePlugin": {{Name: "TaintToleration", Weight: 2}}, | 				"ScorePlugin": {{Name: "TaintToleration", Weight: 2}}, | ||||||
| 			}, | 			}, | ||||||
| @@ -784,7 +784,6 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { | |||||||
| 				"MaxAzureDiskVolumeCount", | 				"MaxAzureDiskVolumeCount", | ||||||
| 				"MatchInterPodAffinity", | 				"MatchInterPodAffinity", | ||||||
| 				"GeneralPredicates", | 				"GeneralPredicates", | ||||||
| 				"CheckVolumeBinding", |  | ||||||
| 				"TestServiceAffinity", | 				"TestServiceAffinity", | ||||||
| 				"TestLabelsPresence", | 				"TestLabelsPresence", | ||||||
| 			), | 			), | ||||||
| @@ -804,6 +803,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { | |||||||
| 				"FilterPlugin": { | 				"FilterPlugin": { | ||||||
| 					{Name: "NodeName"}, | 					{Name: "NodeName"}, | ||||||
| 					{Name: "TaintToleration"}, | 					{Name: "TaintToleration"}, | ||||||
|  | 					{Name: "VolumeBinding"}, | ||||||
| 				}, | 				}, | ||||||
| 				"ScorePlugin": {{Name: "TaintToleration", Weight: 2}}, | 				"ScorePlugin": {{Name: "TaintToleration", Weight: 2}}, | ||||||
| 			}, | 			}, | ||||||
| @@ -900,7 +900,6 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { | |||||||
| 				"MaxCSIVolumeCountPred", | 				"MaxCSIVolumeCountPred", | ||||||
| 				"MatchInterPodAffinity", | 				"MatchInterPodAffinity", | ||||||
| 				"GeneralPredicates", | 				"GeneralPredicates", | ||||||
| 				"CheckVolumeBinding", |  | ||||||
| 				"TestServiceAffinity", | 				"TestServiceAffinity", | ||||||
| 				"TestLabelsPresence", | 				"TestLabelsPresence", | ||||||
| 			), | 			), | ||||||
| @@ -920,6 +919,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { | |||||||
| 				"FilterPlugin": { | 				"FilterPlugin": { | ||||||
| 					{Name: "NodeName"}, | 					{Name: "NodeName"}, | ||||||
| 					{Name: "TaintToleration"}, | 					{Name: "TaintToleration"}, | ||||||
|  | 					{Name: "VolumeBinding"}, | ||||||
| 				}, | 				}, | ||||||
| 				"ScorePlugin": {{Name: "TaintToleration", Weight: 2}}, | 				"ScorePlugin": {{Name: "TaintToleration", Weight: 2}}, | ||||||
| 			}, | 			}, | ||||||
| @@ -1016,7 +1016,6 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { | |||||||
| 				"MaxCinderVolumeCount", | 				"MaxCinderVolumeCount", | ||||||
| 				"MatchInterPodAffinity", | 				"MatchInterPodAffinity", | ||||||
| 				"GeneralPredicates", | 				"GeneralPredicates", | ||||||
| 				"CheckVolumeBinding", |  | ||||||
| 				"TestServiceAffinity", | 				"TestServiceAffinity", | ||||||
| 				"TestLabelsPresence", | 				"TestLabelsPresence", | ||||||
| 			), | 			), | ||||||
| @@ -1036,6 +1035,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { | |||||||
| 				"FilterPlugin": { | 				"FilterPlugin": { | ||||||
| 					{Name: "NodeName"}, | 					{Name: "NodeName"}, | ||||||
| 					{Name: "TaintToleration"}, | 					{Name: "TaintToleration"}, | ||||||
|  | 					{Name: "VolumeBinding"}, | ||||||
| 				}, | 				}, | ||||||
| 				"ScorePlugin": {{Name: "TaintToleration", Weight: 2}}, | 				"ScorePlugin": {{Name: "TaintToleration", Weight: 2}}, | ||||||
| 			}, | 			}, | ||||||
| @@ -1136,7 +1136,6 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { | |||||||
| 				"MaxCinderVolumeCount", | 				"MaxCinderVolumeCount", | ||||||
| 				"MatchInterPodAffinity", | 				"MatchInterPodAffinity", | ||||||
| 				"GeneralPredicates", | 				"GeneralPredicates", | ||||||
| 				"CheckVolumeBinding", |  | ||||||
| 				"TestServiceAffinity", | 				"TestServiceAffinity", | ||||||
| 				"TestLabelsPresence", | 				"TestLabelsPresence", | ||||||
| 			), | 			), | ||||||
| @@ -1156,6 +1155,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { | |||||||
| 				"FilterPlugin": { | 				"FilterPlugin": { | ||||||
| 					{Name: "NodeName"}, | 					{Name: "NodeName"}, | ||||||
| 					{Name: "TaintToleration"}, | 					{Name: "TaintToleration"}, | ||||||
|  | 					{Name: "VolumeBinding"}, | ||||||
| 				}, | 				}, | ||||||
| 				"ScorePlugin": {{Name: "TaintToleration", Weight: 2}}, | 				"ScorePlugin": {{Name: "TaintToleration", Weight: 2}}, | ||||||
| 			}, | 			}, | ||||||
| @@ -1182,6 +1182,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { | |||||||
| 	filterToPredicateMap := map[string]string{ | 	filterToPredicateMap := map[string]string{ | ||||||
| 		"TaintToleration": "PodToleratesNodeTaints", | 		"TaintToleration": "PodToleratesNodeTaints", | ||||||
| 		"NodeName":        "HostName", | 		"NodeName":        "HostName", | ||||||
|  | 		"VolumeBinding":   "CheckVolumeBinding", | ||||||
| 	} | 	} | ||||||
| 	scoreToPriorityMap := map[string]string{ | 	scoreToPriorityMap := map[string]string{ | ||||||
| 		"TaintToleration": "TaintTolerationPriority", | 		"TaintToleration": "TaintTolerationPriority", | ||||||
|   | |||||||
| @@ -12,9 +12,11 @@ go_library( | |||||||
|         "//pkg/scheduler/apis/config:go_default_library", |         "//pkg/scheduler/apis/config:go_default_library", | ||||||
|         "//pkg/scheduler/framework/plugins/nodename:go_default_library", |         "//pkg/scheduler/framework/plugins/nodename:go_default_library", | ||||||
|         "//pkg/scheduler/framework/plugins/tainttoleration:go_default_library", |         "//pkg/scheduler/framework/plugins/tainttoleration:go_default_library", | ||||||
|  |         "//pkg/scheduler/framework/plugins/volumebinding:go_default_library", | ||||||
|         "//pkg/scheduler/framework/v1alpha1:go_default_library", |         "//pkg/scheduler/framework/v1alpha1:go_default_library", | ||||||
|         "//pkg/scheduler/internal/cache:go_default_library", |         "//pkg/scheduler/internal/cache:go_default_library", | ||||||
|         "//pkg/scheduler/volumebinder:go_default_library", |         "//pkg/scheduler/volumebinder:go_default_library", | ||||||
|  |         "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", | ||||||
|         "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", |         "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", | ||||||
|         "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", |         "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", | ||||||
|     ], |     ], | ||||||
| @@ -35,6 +37,7 @@ filegroup( | |||||||
|         "//pkg/scheduler/framework/plugins/migration:all-srcs", |         "//pkg/scheduler/framework/plugins/migration:all-srcs", | ||||||
|         "//pkg/scheduler/framework/plugins/nodename:all-srcs", |         "//pkg/scheduler/framework/plugins/nodename:all-srcs", | ||||||
|         "//pkg/scheduler/framework/plugins/tainttoleration:all-srcs", |         "//pkg/scheduler/framework/plugins/tainttoleration:all-srcs", | ||||||
|  |         "//pkg/scheduler/framework/plugins/volumebinding:all-srcs", | ||||||
|     ], |     ], | ||||||
|     tags = ["automanaged"], |     tags = ["automanaged"], | ||||||
|     visibility = ["//visibility:public"], |     visibility = ["//visibility:public"], | ||||||
|   | |||||||
| @@ -19,6 +19,7 @@ package plugins | |||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  |  | ||||||
|  | 	"k8s.io/apimachinery/pkg/runtime" | ||||||
| 	corelisters "k8s.io/client-go/listers/core/v1" | 	corelisters "k8s.io/client-go/listers/core/v1" | ||||||
| 	storagelistersv1 "k8s.io/client-go/listers/storage/v1" | 	storagelistersv1 "k8s.io/client-go/listers/storage/v1" | ||||||
| 	"k8s.io/kubernetes/pkg/scheduler/algorithm" | 	"k8s.io/kubernetes/pkg/scheduler/algorithm" | ||||||
| @@ -27,6 +28,7 @@ import ( | |||||||
| 	"k8s.io/kubernetes/pkg/scheduler/apis/config" | 	"k8s.io/kubernetes/pkg/scheduler/apis/config" | ||||||
| 	"k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodename" | 	"k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodename" | ||||||
| 	"k8s.io/kubernetes/pkg/scheduler/framework/plugins/tainttoleration" | 	"k8s.io/kubernetes/pkg/scheduler/framework/plugins/tainttoleration" | ||||||
|  | 	"k8s.io/kubernetes/pkg/scheduler/framework/plugins/volumebinding" | ||||||
| 	framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1" | 	framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1" | ||||||
| 	internalcache "k8s.io/kubernetes/pkg/scheduler/internal/cache" | 	internalcache "k8s.io/kubernetes/pkg/scheduler/internal/cache" | ||||||
| 	"k8s.io/kubernetes/pkg/scheduler/volumebinder" | 	"k8s.io/kubernetes/pkg/scheduler/volumebinder" | ||||||
| @@ -53,6 +55,9 @@ func NewDefaultRegistry(args *RegistryArgs) framework.Registry { | |||||||
| 	return framework.Registry{ | 	return framework.Registry{ | ||||||
| 		tainttoleration.Name: tainttoleration.New, | 		tainttoleration.Name: tainttoleration.New, | ||||||
| 		nodename.Name:        nodename.New, | 		nodename.Name:        nodename.New, | ||||||
|  | 		volumebinding.Name: func(_ *runtime.Unknown, _ framework.FrameworkHandle) (framework.Plugin, error) { | ||||||
|  | 			return volumebinding.NewFromVolumeBinder(args.VolumeBinder), nil | ||||||
|  | 		}, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -90,6 +95,11 @@ func NewDefaultConfigProducerRegistry() *ConfigProducerRegistry { | |||||||
| 			plugins.Filter = appendToPluginSet(plugins.Filter, nodename.Name, nil) | 			plugins.Filter = appendToPluginSet(plugins.Filter, nodename.Name, nil) | ||||||
| 			return | 			return | ||||||
| 		}) | 		}) | ||||||
|  | 	registry.RegisterPredicate(predicates.CheckVolumeBindingPred, | ||||||
|  | 		func(args ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) { | ||||||
|  | 			plugins.Filter = appendToPluginSet(plugins.Filter, volumebinding.Name, nil) | ||||||
|  | 			return | ||||||
|  | 		}) | ||||||
|  |  | ||||||
| 	registry.RegisterPriority(priorities.TaintTolerationPriority, | 	registry.RegisterPriority(priorities.TaintTolerationPriority, | ||||||
| 		func(args ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) { | 		func(args ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) { | ||||||
|   | |||||||
							
								
								
									
										30
									
								
								pkg/scheduler/framework/plugins/volumebinding/BUILD
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								pkg/scheduler/framework/plugins/volumebinding/BUILD
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | load("@io_bazel_rules_go//go:def.bzl", "go_library") | ||||||
|  |  | ||||||
|  | go_library( | ||||||
|  |     name = "go_default_library", | ||||||
|  |     srcs = ["volume_binding.go"], | ||||||
|  |     importpath = "k8s.io/kubernetes/pkg/scheduler/framework/plugins/volumebinding", | ||||||
|  |     visibility = ["//visibility:public"], | ||||||
|  |     deps = [ | ||||||
|  |         "//pkg/scheduler/algorithm/predicates:go_default_library", | ||||||
|  |         "//pkg/scheduler/framework/plugins/migration:go_default_library", | ||||||
|  |         "//pkg/scheduler/framework/v1alpha1:go_default_library", | ||||||
|  |         "//pkg/scheduler/nodeinfo:go_default_library", | ||||||
|  |         "//pkg/scheduler/volumebinder:go_default_library", | ||||||
|  |         "//staging/src/k8s.io/api/core/v1:go_default_library", | ||||||
|  |     ], | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | filegroup( | ||||||
|  |     name = "package-srcs", | ||||||
|  |     srcs = glob(["**"]), | ||||||
|  |     tags = ["automanaged"], | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | filegroup( | ||||||
|  |     name = "all-srcs", | ||||||
|  |     srcs = [":package-srcs"], | ||||||
|  |     tags = ["automanaged"], | ||||||
|  |     visibility = ["//visibility:public"], | ||||||
|  | ) | ||||||
| @@ -0,0 +1,54 @@ | |||||||
|  | /* | ||||||
|  | Copyright 2019 The Kubernetes Authors. | ||||||
|  |  | ||||||
|  | Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | you may not use this file except in compliance with the License. | ||||||
|  | You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  | Unless required by applicable law or agreed to in writing, software | ||||||
|  | distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | See the License for the specific language governing permissions and | ||||||
|  | limitations under the License. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | package volumebinding | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	v1 "k8s.io/api/core/v1" | ||||||
|  | 	"k8s.io/kubernetes/pkg/scheduler/algorithm/predicates" | ||||||
|  | 	"k8s.io/kubernetes/pkg/scheduler/framework/plugins/migration" | ||||||
|  | 	framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1" | ||||||
|  | 	schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo" | ||||||
|  | 	"k8s.io/kubernetes/pkg/scheduler/volumebinder" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // VolumeBinding is a plugin that binds pod volumes in scheduling. | ||||||
|  | type VolumeBinding struct { | ||||||
|  | 	predicate predicates.FitPredicate | ||||||
|  | } | ||||||
|  |  | ||||||
|  | var _ framework.FilterPlugin = &VolumeBinding{} | ||||||
|  |  | ||||||
|  | // Name is the name of the plugin used in Registry and configurations. | ||||||
|  | const Name = "VolumeBinding" | ||||||
|  |  | ||||||
|  | // Name returns name of the plugin. It is used in logs, etc. | ||||||
|  | func (pl *VolumeBinding) Name() string { | ||||||
|  | 	return Name | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Filter invoked at the filter extension point. | ||||||
|  | func (pl *VolumeBinding) Filter(cs *framework.CycleState, pod *v1.Pod, nodeInfo *schedulernodeinfo.NodeInfo) *framework.Status { | ||||||
|  | 	_, reasons, err := pl.predicate(pod, nil, nodeInfo) | ||||||
|  | 	return migration.PredicateResultToFrameworkStatus(reasons, err) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // NewFromVolumeBinder initializes a new plugin with volume binder and returns it. | ||||||
|  | func NewFromVolumeBinder(volumeBinder *volumebinder.VolumeBinder) framework.Plugin { | ||||||
|  | 	return &VolumeBinding{ | ||||||
|  | 		predicate: predicates.NewVolumeBindingPredicate(volumeBinder), | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @@ -130,7 +130,6 @@ func TestSchedulerCreationFromConfigMap(t *testing.T) { | |||||||
| 				"CheckNodeDiskPressure", | 				"CheckNodeDiskPressure", | ||||||
| 				"CheckNodeMemoryPressure", | 				"CheckNodeMemoryPressure", | ||||||
| 				"CheckNodePIDPressure", | 				"CheckNodePIDPressure", | ||||||
| 				"CheckVolumeBinding", |  | ||||||
| 				"GeneralPredicates", | 				"GeneralPredicates", | ||||||
| 				"MatchInterPodAffinity", | 				"MatchInterPodAffinity", | ||||||
| 				"MaxAzureDiskVolumeCount", | 				"MaxAzureDiskVolumeCount", | ||||||
| @@ -150,7 +149,7 @@ func TestSchedulerCreationFromConfigMap(t *testing.T) { | |||||||
| 				"ImageLocalityPriority", | 				"ImageLocalityPriority", | ||||||
| 			), | 			), | ||||||
| 			expectedPlugins: map[string][]kubeschedulerconfig.Plugin{ | 			expectedPlugins: map[string][]kubeschedulerconfig.Plugin{ | ||||||
| 				"FilterPlugin": {{Name: "TaintToleration"}}, | 				"FilterPlugin": {{Name: "TaintToleration"}, {Name: "VolumeBinding"}}, | ||||||
| 				"ScorePlugin":  {{Name: "TaintToleration", Weight: 1}}, | 				"ScorePlugin":  {{Name: "TaintToleration", Weight: 1}}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| @@ -197,7 +196,6 @@ kind: Policy | |||||||
| 				"CheckNodeDiskPressure", | 				"CheckNodeDiskPressure", | ||||||
| 				"CheckNodeMemoryPressure", | 				"CheckNodeMemoryPressure", | ||||||
| 				"CheckNodePIDPressure", | 				"CheckNodePIDPressure", | ||||||
| 				"CheckVolumeBinding", |  | ||||||
| 				"GeneralPredicates", | 				"GeneralPredicates", | ||||||
| 				"MatchInterPodAffinity", | 				"MatchInterPodAffinity", | ||||||
| 				"MaxAzureDiskVolumeCount", | 				"MaxAzureDiskVolumeCount", | ||||||
| @@ -217,7 +215,7 @@ kind: Policy | |||||||
| 				"ImageLocalityPriority", | 				"ImageLocalityPriority", | ||||||
| 			), | 			), | ||||||
| 			expectedPlugins: map[string][]kubeschedulerconfig.Plugin{ | 			expectedPlugins: map[string][]kubeschedulerconfig.Plugin{ | ||||||
| 				"FilterPlugin": {{Name: "TaintToleration"}}, | 				"FilterPlugin": {{Name: "TaintToleration"}, {Name: "VolumeBinding"}}, | ||||||
| 				"ScorePlugin":  {{Name: "TaintToleration", Weight: 1}}, | 				"ScorePlugin":  {{Name: "TaintToleration", Weight: 1}}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Yecheng Fu
					Yecheng Fu