mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	remove scheduler component config v1beta1
Signed-off-by: kerthcet <kerthcet@gmail.com>
This commit is contained in:
		@@ -27,7 +27,6 @@ import (
 | 
			
		||||
	"k8s.io/klog/v2"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config/scheme"
 | 
			
		||||
	configv1beta1 "k8s.io/kubernetes/pkg/scheduler/apis/config/v1beta1"
 | 
			
		||||
	configv1beta2 "k8s.io/kubernetes/pkg/scheduler/apis/config/v1beta2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -67,8 +66,6 @@ func encodeConfig(cfg *config.KubeSchedulerConfiguration) (*bytes.Buffer, error)
 | 
			
		||||
 | 
			
		||||
	var encoder runtime.Encoder
 | 
			
		||||
	switch cfg.TypeMeta.APIVersion {
 | 
			
		||||
	case configv1beta1.SchemeGroupVersion.String():
 | 
			
		||||
		encoder = scheme.Codecs.EncoderForVersion(info.Serializer, configv1beta1.SchemeGroupVersion)
 | 
			
		||||
	case configv1beta2.SchemeGroupVersion.String():
 | 
			
		||||
		encoder = scheme.Codecs.EncoderForVersion(info.Serializer, configv1beta2.SchemeGroupVersion)
 | 
			
		||||
	default:
 | 
			
		||||
 
 | 
			
		||||
@@ -35,11 +35,9 @@ import (
 | 
			
		||||
	apiserveroptions "k8s.io/apiserver/pkg/server/options"
 | 
			
		||||
	componentbaseconfig "k8s.io/component-base/config"
 | 
			
		||||
	"k8s.io/component-base/logs"
 | 
			
		||||
	"k8s.io/kube-scheduler/config/v1beta1"
 | 
			
		||||
	"k8s.io/kube-scheduler/config/v1beta2"
 | 
			
		||||
	kubeschedulerconfig "k8s.io/kubernetes/pkg/scheduler/apis/config"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config/latest"
 | 
			
		||||
	configtesting "k8s.io/kubernetes/pkg/scheduler/apis/config/testing"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config/testing/defaults"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/framework/plugins/names"
 | 
			
		||||
)
 | 
			
		||||
@@ -120,17 +118,6 @@ leaderElection:
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	v1beta1VersionConfig := filepath.Join(tmpDir, "scheduler_v1beta1_api_version.yaml")
 | 
			
		||||
	if err := ioutil.WriteFile(v1beta1VersionConfig, []byte(fmt.Sprintf(`
 | 
			
		||||
apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
kind: KubeSchedulerConfiguration
 | 
			
		||||
clientConnection:
 | 
			
		||||
  kubeconfig: "%s"
 | 
			
		||||
leaderElection:
 | 
			
		||||
  leaderElect: true`, configKubeconfig)), os.FileMode(0600)); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	unknownVersionConfig := filepath.Join(tmpDir, "scheduler_invalid_wrong_api_version.yaml")
 | 
			
		||||
	if err := ioutil.WriteFile(unknownVersionConfig, []byte(fmt.Sprintf(`
 | 
			
		||||
apiVersion: kubescheduler.config.k8s.io/unknown
 | 
			
		||||
@@ -231,38 +218,6 @@ profiles:
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// plugin config
 | 
			
		||||
	v1beta1PluginConfigFile := filepath.Join(tmpDir, "v1beta1_plugin.yaml")
 | 
			
		||||
	if err := ioutil.WriteFile(v1beta1PluginConfigFile, []byte(fmt.Sprintf(`
 | 
			
		||||
apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
kind: KubeSchedulerConfiguration
 | 
			
		||||
clientConnection:
 | 
			
		||||
  kubeconfig: "%s"
 | 
			
		||||
profiles:
 | 
			
		||||
- plugins:
 | 
			
		||||
    reserve:
 | 
			
		||||
      enabled:
 | 
			
		||||
      - name: foo
 | 
			
		||||
      - name: bar
 | 
			
		||||
      disabled:
 | 
			
		||||
      - name: VolumeBinding
 | 
			
		||||
    preBind:
 | 
			
		||||
      enabled:
 | 
			
		||||
      - name: foo
 | 
			
		||||
      disabled:
 | 
			
		||||
      - name: VolumeBinding
 | 
			
		||||
  pluginConfig:
 | 
			
		||||
  - name: ServiceAffinity
 | 
			
		||||
    args:
 | 
			
		||||
      affinityLabels: []
 | 
			
		||||
      antiAffinityLabelsPreference: []
 | 
			
		||||
  - name: foo
 | 
			
		||||
    args:
 | 
			
		||||
      bar: baz
 | 
			
		||||
`, configKubeconfig)), os.FileMode(0600)); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// multiple profiles config
 | 
			
		||||
	multiProfilesConfig := filepath.Join(tmpDir, "multi-profiles.yaml")
 | 
			
		||||
	if err := ioutil.WriteFile(multiProfilesConfig, []byte(fmt.Sprintf(`
 | 
			
		||||
@@ -290,33 +245,6 @@ profiles:
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// multiple profiles config
 | 
			
		||||
	v1beta1MultiProfilesConfig := filepath.Join(tmpDir, "v1beta1_multi-profiles.yaml")
 | 
			
		||||
	if err := ioutil.WriteFile(v1beta1MultiProfilesConfig, []byte(fmt.Sprintf(`
 | 
			
		||||
apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
kind: KubeSchedulerConfiguration
 | 
			
		||||
clientConnection:
 | 
			
		||||
  kubeconfig: "%s"
 | 
			
		||||
profiles:
 | 
			
		||||
- schedulerName: "foo-profile"
 | 
			
		||||
  plugins:
 | 
			
		||||
    reserve:
 | 
			
		||||
      enabled:
 | 
			
		||||
      - name: foo
 | 
			
		||||
      - name: VolumeBinding
 | 
			
		||||
      disabled:
 | 
			
		||||
      - name: VolumeBinding
 | 
			
		||||
- schedulerName: "bar-profile"
 | 
			
		||||
  plugins:
 | 
			
		||||
    preBind:
 | 
			
		||||
      disabled:
 | 
			
		||||
      - name: VolumeBinding
 | 
			
		||||
  pluginConfig:
 | 
			
		||||
  - name: foo
 | 
			
		||||
`, configKubeconfig)), os.FileMode(0600)); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Insulate this test from picking up in-cluster config when run inside a pod
 | 
			
		||||
	// We can't assume we have permissions to write to /var/run/secrets/... from a unit test to mock in-cluster config for testing
 | 
			
		||||
	originalHost := os.Getenv("KUBERNETES_SERVICE_HOST")
 | 
			
		||||
@@ -411,77 +339,6 @@ profiles:
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "v1beta1 config file",
 | 
			
		||||
			options: &Options{
 | 
			
		||||
				ConfigFile: v1beta1VersionConfig,
 | 
			
		||||
				ComponentConfig: func() kubeschedulerconfig.KubeSchedulerConfiguration {
 | 
			
		||||
					cfg := configtesting.V1beta1ToInternalWithDefaults(t, v1beta1.KubeSchedulerConfiguration{})
 | 
			
		||||
					return *cfg
 | 
			
		||||
				}(),
 | 
			
		||||
				SecureServing: (&apiserveroptions.SecureServingOptions{
 | 
			
		||||
					ServerCert: apiserveroptions.GeneratableKeyCert{
 | 
			
		||||
						CertDirectory: "/a/b/c",
 | 
			
		||||
						PairName:      "kube-scheduler",
 | 
			
		||||
					},
 | 
			
		||||
					HTTP2MaxStreamsPerConnection: 47,
 | 
			
		||||
				}).WithLoopback(),
 | 
			
		||||
				Authentication: &apiserveroptions.DelegatingAuthenticationOptions{
 | 
			
		||||
					CacheTTL:   10 * time.Second,
 | 
			
		||||
					ClientCert: apiserveroptions.ClientCertAuthenticationOptions{},
 | 
			
		||||
					RequestHeader: apiserveroptions.RequestHeaderAuthenticationOptions{
 | 
			
		||||
						UsernameHeaders:     []string{"x-remote-user"},
 | 
			
		||||
						GroupHeaders:        []string{"x-remote-group"},
 | 
			
		||||
						ExtraHeaderPrefixes: []string{"x-remote-extra-"},
 | 
			
		||||
					},
 | 
			
		||||
					RemoteKubeConfigFileOptional: true,
 | 
			
		||||
				},
 | 
			
		||||
				Authorization: &apiserveroptions.DelegatingAuthorizationOptions{
 | 
			
		||||
					AllowCacheTTL:                10 * time.Second,
 | 
			
		||||
					DenyCacheTTL:                 10 * time.Second,
 | 
			
		||||
					RemoteKubeConfigFileOptional: true,
 | 
			
		||||
					AlwaysAllowPaths:             []string{"/healthz", "/readyz", "/livez"}, // note: this does not match /healthz/ or /healthz/*
 | 
			
		||||
					AlwaysAllowGroups:            []string{"system:masters"},
 | 
			
		||||
				},
 | 
			
		||||
				Logs: logs.NewOptions(),
 | 
			
		||||
			},
 | 
			
		||||
			expectedUsername: "config",
 | 
			
		||||
			expectedConfig: kubeschedulerconfig.KubeSchedulerConfiguration{
 | 
			
		||||
				TypeMeta: metav1.TypeMeta{
 | 
			
		||||
					APIVersion: v1beta1.SchemeGroupVersion.String(),
 | 
			
		||||
				},
 | 
			
		||||
				Parallelism: 16,
 | 
			
		||||
				DebuggingConfiguration: componentbaseconfig.DebuggingConfiguration{
 | 
			
		||||
					EnableProfiling:           true,
 | 
			
		||||
					EnableContentionProfiling: true,
 | 
			
		||||
				},
 | 
			
		||||
				LeaderElection: componentbaseconfig.LeaderElectionConfiguration{
 | 
			
		||||
					LeaderElect:       true,
 | 
			
		||||
					LeaseDuration:     metav1.Duration{Duration: 15 * time.Second},
 | 
			
		||||
					RenewDeadline:     metav1.Duration{Duration: 10 * time.Second},
 | 
			
		||||
					RetryPeriod:       metav1.Duration{Duration: 2 * time.Second},
 | 
			
		||||
					ResourceLock:      "leases",
 | 
			
		||||
					ResourceNamespace: "kube-system",
 | 
			
		||||
					ResourceName:      "kube-scheduler",
 | 
			
		||||
				},
 | 
			
		||||
				ClientConnection: componentbaseconfig.ClientConnectionConfiguration{
 | 
			
		||||
					Kubeconfig:  configKubeconfig,
 | 
			
		||||
					QPS:         50,
 | 
			
		||||
					Burst:       100,
 | 
			
		||||
					ContentType: "application/vnd.kubernetes.protobuf",
 | 
			
		||||
				},
 | 
			
		||||
				PercentageOfNodesToScore: defaultPercentageOfNodesToScore,
 | 
			
		||||
				PodInitialBackoffSeconds: defaultPodInitialBackoffSeconds,
 | 
			
		||||
				PodMaxBackoffSeconds:     defaultPodMaxBackoffSeconds,
 | 
			
		||||
				Profiles: []kubeschedulerconfig.KubeSchedulerProfile{
 | 
			
		||||
					{
 | 
			
		||||
						SchedulerName: "default-scheduler",
 | 
			
		||||
						Plugins:       defaults.PluginsV1beta1,
 | 
			
		||||
						PluginConfig:  defaults.PluginConfigsV1beta1,
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "config file in componentconfig/v1alpha1",
 | 
			
		||||
			options: &Options{
 | 
			
		||||
@@ -769,133 +626,6 @@ profiles:
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "v1beta1 plugin config",
 | 
			
		||||
			options: &Options{
 | 
			
		||||
				ConfigFile: v1beta1PluginConfigFile,
 | 
			
		||||
				Logs:       logs.NewOptions(),
 | 
			
		||||
			},
 | 
			
		||||
			expectedUsername: "config",
 | 
			
		||||
			expectedConfig: kubeschedulerconfig.KubeSchedulerConfiguration{
 | 
			
		||||
				TypeMeta: metav1.TypeMeta{
 | 
			
		||||
					APIVersion: v1beta1.SchemeGroupVersion.String(),
 | 
			
		||||
				},
 | 
			
		||||
				Parallelism: 16,
 | 
			
		||||
				DebuggingConfiguration: componentbaseconfig.DebuggingConfiguration{
 | 
			
		||||
					EnableProfiling:           true,
 | 
			
		||||
					EnableContentionProfiling: true,
 | 
			
		||||
				},
 | 
			
		||||
				LeaderElection: componentbaseconfig.LeaderElectionConfiguration{
 | 
			
		||||
					LeaderElect:       true,
 | 
			
		||||
					LeaseDuration:     metav1.Duration{Duration: 15 * time.Second},
 | 
			
		||||
					RenewDeadline:     metav1.Duration{Duration: 10 * time.Second},
 | 
			
		||||
					RetryPeriod:       metav1.Duration{Duration: 2 * time.Second},
 | 
			
		||||
					ResourceLock:      "leases",
 | 
			
		||||
					ResourceNamespace: "kube-system",
 | 
			
		||||
					ResourceName:      "kube-scheduler",
 | 
			
		||||
				},
 | 
			
		||||
				ClientConnection: componentbaseconfig.ClientConnectionConfiguration{
 | 
			
		||||
					Kubeconfig:  configKubeconfig,
 | 
			
		||||
					QPS:         50,
 | 
			
		||||
					Burst:       100,
 | 
			
		||||
					ContentType: "application/vnd.kubernetes.protobuf",
 | 
			
		||||
				},
 | 
			
		||||
				PercentageOfNodesToScore: defaultPercentageOfNodesToScore,
 | 
			
		||||
				PodInitialBackoffSeconds: defaultPodInitialBackoffSeconds,
 | 
			
		||||
				PodMaxBackoffSeconds:     defaultPodMaxBackoffSeconds,
 | 
			
		||||
				Profiles: []kubeschedulerconfig.KubeSchedulerProfile{
 | 
			
		||||
					{
 | 
			
		||||
						SchedulerName: "default-scheduler",
 | 
			
		||||
						Plugins: &kubeschedulerconfig.Plugins{
 | 
			
		||||
							QueueSort:  defaults.PluginsV1beta1.QueueSort,
 | 
			
		||||
							PreFilter:  defaults.PluginsV1beta1.PreFilter,
 | 
			
		||||
							Filter:     defaults.PluginsV1beta1.Filter,
 | 
			
		||||
							PostFilter: defaults.PluginsV1beta1.PostFilter,
 | 
			
		||||
							PreScore:   defaults.PluginsV1beta1.PreScore,
 | 
			
		||||
							Score:      defaults.PluginsV1beta1.Score,
 | 
			
		||||
							Reserve: kubeschedulerconfig.PluginSet{
 | 
			
		||||
								Enabled: []kubeschedulerconfig.Plugin{
 | 
			
		||||
									{Name: "foo"},
 | 
			
		||||
									{Name: "bar"},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							PreBind: kubeschedulerconfig.PluginSet{
 | 
			
		||||
								Enabled: []kubeschedulerconfig.Plugin{
 | 
			
		||||
									{Name: "foo"},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							Bind: defaults.PluginsV1beta1.Bind,
 | 
			
		||||
						},
 | 
			
		||||
						PluginConfig: []kubeschedulerconfig.PluginConfig{
 | 
			
		||||
							{
 | 
			
		||||
								Name: "ServiceAffinity",
 | 
			
		||||
								Args: &kubeschedulerconfig.ServiceAffinityArgs{
 | 
			
		||||
									AffinityLabels:               []string{},
 | 
			
		||||
									AntiAffinityLabelsPreference: []string{},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "foo",
 | 
			
		||||
								Args: &runtime.Unknown{
 | 
			
		||||
									Raw:         []byte(`{"bar":"baz"}`),
 | 
			
		||||
									ContentType: "application/json",
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "DefaultPreemption",
 | 
			
		||||
								Args: &kubeschedulerconfig.DefaultPreemptionArgs{
 | 
			
		||||
									MinCandidateNodesPercentage: 10,
 | 
			
		||||
									MinCandidateNodesAbsolute:   100,
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "InterPodAffinity",
 | 
			
		||||
								Args: &kubeschedulerconfig.InterPodAffinityArgs{
 | 
			
		||||
									HardPodAffinityWeight: 1,
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "NodeAffinity",
 | 
			
		||||
								Args: &kubeschedulerconfig.NodeAffinityArgs{},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "NodeResourcesBalancedAllocation",
 | 
			
		||||
								Args: &kubeschedulerconfig.NodeResourcesBalancedAllocationArgs{
 | 
			
		||||
									Resources: []kubeschedulerconfig.ResourceSpec{{Name: "cpu", Weight: 1}, {Name: "memory", Weight: 1}},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "NodeResourcesFit",
 | 
			
		||||
								Args: &kubeschedulerconfig.NodeResourcesFitArgs{
 | 
			
		||||
									ScoringStrategy: &kubeschedulerconfig.ScoringStrategy{
 | 
			
		||||
										Type:      kubeschedulerconfig.LeastAllocated,
 | 
			
		||||
										Resources: []kubeschedulerconfig.ResourceSpec{{Name: "cpu", Weight: 1}, {Name: "memory", Weight: 1}},
 | 
			
		||||
									},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "NodeResourcesLeastAllocated",
 | 
			
		||||
								Args: &kubeschedulerconfig.NodeResourcesLeastAllocatedArgs{
 | 
			
		||||
									Resources: []kubeschedulerconfig.ResourceSpec{{Name: "cpu", Weight: 1}, {Name: "memory", Weight: 1}},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "PodTopologySpread",
 | 
			
		||||
								Args: &kubeschedulerconfig.PodTopologySpreadArgs{
 | 
			
		||||
									DefaultingType: kubeschedulerconfig.SystemDefaulting,
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "VolumeBinding",
 | 
			
		||||
								Args: &kubeschedulerconfig.VolumeBindingArgs{
 | 
			
		||||
									BindTimeoutSeconds: 600,
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "multiple profiles",
 | 
			
		||||
			options: &Options{
 | 
			
		||||
@@ -1016,132 +746,6 @@ profiles:
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "v1beta1 multiple profiles",
 | 
			
		||||
			options: &Options{
 | 
			
		||||
				ConfigFile: v1beta1MultiProfilesConfig,
 | 
			
		||||
				Logs:       logs.NewOptions(),
 | 
			
		||||
			},
 | 
			
		||||
			expectedUsername: "config",
 | 
			
		||||
			expectedConfig: kubeschedulerconfig.KubeSchedulerConfiguration{
 | 
			
		||||
				TypeMeta: metav1.TypeMeta{
 | 
			
		||||
					APIVersion: v1beta1.SchemeGroupVersion.String(),
 | 
			
		||||
				},
 | 
			
		||||
				Parallelism: 16,
 | 
			
		||||
				DebuggingConfiguration: componentbaseconfig.DebuggingConfiguration{
 | 
			
		||||
					EnableProfiling:           true,
 | 
			
		||||
					EnableContentionProfiling: true,
 | 
			
		||||
				},
 | 
			
		||||
				LeaderElection: componentbaseconfig.LeaderElectionConfiguration{
 | 
			
		||||
					LeaderElect:       true,
 | 
			
		||||
					LeaseDuration:     metav1.Duration{Duration: 15 * time.Second},
 | 
			
		||||
					RenewDeadline:     metav1.Duration{Duration: 10 * time.Second},
 | 
			
		||||
					RetryPeriod:       metav1.Duration{Duration: 2 * time.Second},
 | 
			
		||||
					ResourceLock:      "leases",
 | 
			
		||||
					ResourceNamespace: "kube-system",
 | 
			
		||||
					ResourceName:      "kube-scheduler",
 | 
			
		||||
				},
 | 
			
		||||
				ClientConnection: componentbaseconfig.ClientConnectionConfiguration{
 | 
			
		||||
					Kubeconfig:  configKubeconfig,
 | 
			
		||||
					QPS:         50,
 | 
			
		||||
					Burst:       100,
 | 
			
		||||
					ContentType: "application/vnd.kubernetes.protobuf",
 | 
			
		||||
				},
 | 
			
		||||
				PercentageOfNodesToScore: defaultPercentageOfNodesToScore,
 | 
			
		||||
				PodInitialBackoffSeconds: defaultPodInitialBackoffSeconds,
 | 
			
		||||
				PodMaxBackoffSeconds:     defaultPodMaxBackoffSeconds,
 | 
			
		||||
				Profiles: []kubeschedulerconfig.KubeSchedulerProfile{
 | 
			
		||||
					{
 | 
			
		||||
						SchedulerName: "foo-profile",
 | 
			
		||||
						Plugins: &kubeschedulerconfig.Plugins{
 | 
			
		||||
							QueueSort:  defaults.PluginsV1beta1.QueueSort,
 | 
			
		||||
							PreFilter:  defaults.PluginsV1beta1.PreFilter,
 | 
			
		||||
							Filter:     defaults.PluginsV1beta1.Filter,
 | 
			
		||||
							PostFilter: defaults.PluginsV1beta1.PostFilter,
 | 
			
		||||
							PreScore:   defaults.PluginsV1beta1.PreScore,
 | 
			
		||||
							Score:      defaults.PluginsV1beta1.Score,
 | 
			
		||||
							Bind:       defaults.PluginsV1beta1.Bind,
 | 
			
		||||
							PreBind:    defaults.PluginsV1beta1.PreBind,
 | 
			
		||||
							Reserve: kubeschedulerconfig.PluginSet{
 | 
			
		||||
								Enabled: []kubeschedulerconfig.Plugin{
 | 
			
		||||
									{Name: "foo"},
 | 
			
		||||
									{Name: names.VolumeBinding},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
						PluginConfig: defaults.PluginConfigsV1beta1,
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						SchedulerName: "bar-profile",
 | 
			
		||||
						Plugins: &kubeschedulerconfig.Plugins{
 | 
			
		||||
							QueueSort:  defaults.PluginsV1beta1.QueueSort,
 | 
			
		||||
							PreFilter:  defaults.PluginsV1beta1.PreFilter,
 | 
			
		||||
							Filter:     defaults.PluginsV1beta1.Filter,
 | 
			
		||||
							PostFilter: defaults.PluginsV1beta1.PostFilter,
 | 
			
		||||
							PreScore:   defaults.PluginsV1beta1.PreScore,
 | 
			
		||||
							Score:      defaults.PluginsV1beta1.Score,
 | 
			
		||||
							Bind:       defaults.PluginsV1beta1.Bind,
 | 
			
		||||
							Reserve:    defaults.PluginsV1beta1.Reserve,
 | 
			
		||||
						},
 | 
			
		||||
						PluginConfig: []kubeschedulerconfig.PluginConfig{
 | 
			
		||||
							{
 | 
			
		||||
								Name: "foo",
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "DefaultPreemption",
 | 
			
		||||
								Args: &kubeschedulerconfig.DefaultPreemptionArgs{
 | 
			
		||||
									MinCandidateNodesPercentage: 10,
 | 
			
		||||
									MinCandidateNodesAbsolute:   100,
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "InterPodAffinity",
 | 
			
		||||
								Args: &kubeschedulerconfig.InterPodAffinityArgs{
 | 
			
		||||
									HardPodAffinityWeight: 1,
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "NodeAffinity",
 | 
			
		||||
								Args: &kubeschedulerconfig.NodeAffinityArgs{},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "NodeResourcesBalancedAllocation",
 | 
			
		||||
								Args: &kubeschedulerconfig.NodeResourcesBalancedAllocationArgs{
 | 
			
		||||
									Resources: []kubeschedulerconfig.ResourceSpec{{Name: "cpu", Weight: 1}, {Name: "memory", Weight: 1}},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "NodeResourcesFit",
 | 
			
		||||
								Args: &kubeschedulerconfig.NodeResourcesFitArgs{
 | 
			
		||||
									ScoringStrategy: &kubeschedulerconfig.ScoringStrategy{
 | 
			
		||||
										Type:      kubeschedulerconfig.LeastAllocated,
 | 
			
		||||
										Resources: []kubeschedulerconfig.ResourceSpec{{Name: "cpu", Weight: 1}, {Name: "memory", Weight: 1}},
 | 
			
		||||
									},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "NodeResourcesLeastAllocated",
 | 
			
		||||
								Args: &kubeschedulerconfig.NodeResourcesLeastAllocatedArgs{
 | 
			
		||||
									Resources: []kubeschedulerconfig.ResourceSpec{{Name: "cpu", Weight: 1}, {Name: "memory", Weight: 1}},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "PodTopologySpread",
 | 
			
		||||
								Args: &kubeschedulerconfig.PodTopologySpreadArgs{
 | 
			
		||||
									DefaultingType: kubeschedulerconfig.SystemDefaulting,
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "VolumeBinding",
 | 
			
		||||
								Args: &kubeschedulerconfig.VolumeBindingArgs{
 | 
			
		||||
									BindTimeoutSeconds: 600,
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "Attempting to set Component Config Profiles and Policy config",
 | 
			
		||||
			options: &Options{
 | 
			
		||||
 
 | 
			
		||||
@@ -75,7 +75,7 @@ users:
 | 
			
		||||
	// plugin config
 | 
			
		||||
	pluginConfigFile := filepath.Join(tmpDir, "plugin.yaml")
 | 
			
		||||
	if err := ioutil.WriteFile(pluginConfigFile, []byte(fmt.Sprintf(`
 | 
			
		||||
apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
apiVersion: kubescheduler.config.k8s.io/v1beta2
 | 
			
		||||
kind: KubeSchedulerConfiguration
 | 
			
		||||
clientConnection:
 | 
			
		||||
  kubeconfig: "%s"
 | 
			
		||||
@@ -112,7 +112,7 @@ profiles:
 | 
			
		||||
	// multiple profiles config
 | 
			
		||||
	multiProfilesConfig := filepath.Join(tmpDir, "multi-profiles.yaml")
 | 
			
		||||
	if err := ioutil.WriteFile(multiProfilesConfig, []byte(fmt.Sprintf(`
 | 
			
		||||
apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
apiVersion: kubescheduler.config.k8s.io/v1beta2
 | 
			
		||||
kind: KubeSchedulerConfiguration
 | 
			
		||||
clientConnection:
 | 
			
		||||
  kubeconfig: "%s"
 | 
			
		||||
 
 | 
			
		||||
@@ -932,7 +932,7 @@ function start_kubescheduler {
 | 
			
		||||
    SCHEDULER_LOG=${LOG_DIR}/kube-scheduler.log
 | 
			
		||||
 | 
			
		||||
    cat <<EOF > /tmp/kube-scheduler.yaml
 | 
			
		||||
apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
apiVersion: kubescheduler.config.k8s.io/v1beta2
 | 
			
		||||
kind: KubeSchedulerConfiguration
 | 
			
		||||
clientConnection:
 | 
			
		||||
  kubeconfig: ${CERT_DIR}/scheduler.kubeconfig
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,6 @@ import (
 | 
			
		||||
	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
 | 
			
		||||
	config "k8s.io/kubernetes/pkg/scheduler/apis/config"
 | 
			
		||||
	configv1 "k8s.io/kubernetes/pkg/scheduler/apis/config/v1"
 | 
			
		||||
	configv1beta1 "k8s.io/kubernetes/pkg/scheduler/apis/config/v1beta1"
 | 
			
		||||
	configv1beta2 "k8s.io/kubernetes/pkg/scheduler/apis/config/v1beta2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -42,7 +41,6 @@ func init() {
 | 
			
		||||
func AddToScheme(scheme *runtime.Scheme) {
 | 
			
		||||
	utilruntime.Must(config.AddToScheme(scheme))
 | 
			
		||||
	utilruntime.Must(configv1.AddToScheme(scheme))
 | 
			
		||||
	utilruntime.Must(configv1beta1.AddToScheme(scheme))
 | 
			
		||||
	utilruntime.Must(configv1beta2.AddToScheme(scheme))
 | 
			
		||||
	utilruntime.Must(scheme.SetVersionPriority(configv1beta2.SchemeGroupVersion, configv1beta1.SchemeGroupVersion))
 | 
			
		||||
	utilruntime.Must(scheme.SetVersionPriority(configv1beta2.SchemeGroupVersion))
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,6 @@ import (
 | 
			
		||||
	corev1 "k8s.io/api/core/v1"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
			
		||||
	"k8s.io/kube-scheduler/config/v1beta1"
 | 
			
		||||
	"k8s.io/kube-scheduler/config/v1beta2"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config/testing/defaults"
 | 
			
		||||
@@ -41,375 +40,6 @@ func TestCodecsDecodePluginConfig(t *testing.T) {
 | 
			
		||||
		wantErr      string
 | 
			
		||||
		wantProfiles []config.KubeSchedulerProfile
 | 
			
		||||
	}{
 | 
			
		||||
		//v1beta1 tests
 | 
			
		||||
		{
 | 
			
		||||
			name: "v1beta1 all plugin args in default profile",
 | 
			
		||||
			data: []byte(`
 | 
			
		||||
apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
kind: KubeSchedulerConfiguration
 | 
			
		||||
profiles:
 | 
			
		||||
- pluginConfig:
 | 
			
		||||
  - name: DefaultPreemption
 | 
			
		||||
    args:
 | 
			
		||||
      minCandidateNodesPercentage: 50
 | 
			
		||||
      minCandidateNodesAbsolute: 500
 | 
			
		||||
  - name: InterPodAffinity
 | 
			
		||||
    args:
 | 
			
		||||
      hardPodAffinityWeight: 5
 | 
			
		||||
  - name: NodeLabel
 | 
			
		||||
    args:
 | 
			
		||||
      presentLabels: ["foo"]
 | 
			
		||||
  - name: NodeResourcesFit
 | 
			
		||||
    args:
 | 
			
		||||
      ignoredResources: ["foo"]
 | 
			
		||||
  - name: RequestedToCapacityRatio
 | 
			
		||||
    args:
 | 
			
		||||
      shape:
 | 
			
		||||
      - utilization: 1
 | 
			
		||||
  - name: PodTopologySpread
 | 
			
		||||
    args:
 | 
			
		||||
      defaultConstraints:
 | 
			
		||||
      - maxSkew: 1
 | 
			
		||||
        topologyKey: zone
 | 
			
		||||
        whenUnsatisfiable: ScheduleAnyway
 | 
			
		||||
  - name: ServiceAffinity
 | 
			
		||||
    args:
 | 
			
		||||
      affinityLabels: ["bar"]
 | 
			
		||||
  - name: NodeResourcesLeastAllocated
 | 
			
		||||
    args:
 | 
			
		||||
      resources:
 | 
			
		||||
      - name: cpu
 | 
			
		||||
        weight: 2
 | 
			
		||||
      - name: unknown
 | 
			
		||||
        weight: 1
 | 
			
		||||
  - name: NodeResourcesMostAllocated
 | 
			
		||||
    args:
 | 
			
		||||
      resources:
 | 
			
		||||
      - name: memory
 | 
			
		||||
        weight: 1
 | 
			
		||||
  - name: NodeResourcesBalancedAllocation
 | 
			
		||||
    args:
 | 
			
		||||
      resources:
 | 
			
		||||
        - name: cpu       # default weight(1) will be set.
 | 
			
		||||
        - name: memory    # weight 0 will be replaced by 1.
 | 
			
		||||
          weight: 0
 | 
			
		||||
        - name: scalar0
 | 
			
		||||
          weight: 1
 | 
			
		||||
        - name: scalar1   # default weight(1) will be set for scalar1
 | 
			
		||||
        - name: scalar2   # weight 0 will be replaced by 1.
 | 
			
		||||
          weight: 0
 | 
			
		||||
        - name: scalar3
 | 
			
		||||
          weight: 2
 | 
			
		||||
  - name: VolumeBinding
 | 
			
		||||
    args:
 | 
			
		||||
      bindTimeoutSeconds: 300
 | 
			
		||||
  - name: NodeAffinity
 | 
			
		||||
    args:
 | 
			
		||||
      addedAffinity:
 | 
			
		||||
        requiredDuringSchedulingIgnoredDuringExecution:
 | 
			
		||||
          nodeSelectorTerms:
 | 
			
		||||
          - matchExpressions:
 | 
			
		||||
            - key: foo
 | 
			
		||||
              operator: In
 | 
			
		||||
              values: ["bar"]
 | 
			
		||||
`),
 | 
			
		||||
			wantProfiles: []config.KubeSchedulerProfile{
 | 
			
		||||
				{
 | 
			
		||||
					SchedulerName: "default-scheduler",
 | 
			
		||||
					Plugins:       defaults.PluginsV1beta1,
 | 
			
		||||
					PluginConfig: []config.PluginConfig{
 | 
			
		||||
						{
 | 
			
		||||
							Name: "DefaultPreemption",
 | 
			
		||||
							Args: &config.DefaultPreemptionArgs{MinCandidateNodesPercentage: 50, MinCandidateNodesAbsolute: 500},
 | 
			
		||||
						},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "InterPodAffinity",
 | 
			
		||||
							Args: &config.InterPodAffinityArgs{HardPodAffinityWeight: 5},
 | 
			
		||||
						},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "NodeLabel",
 | 
			
		||||
							Args: &config.NodeLabelArgs{PresentLabels: []string{"foo"}},
 | 
			
		||||
						},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "NodeResourcesFit",
 | 
			
		||||
							Args: &config.NodeResourcesFitArgs{
 | 
			
		||||
								IgnoredResources: []string{"foo"},
 | 
			
		||||
								ScoringStrategy: &config.ScoringStrategy{
 | 
			
		||||
									Type: config.LeastAllocated,
 | 
			
		||||
									Resources: []config.ResourceSpec{
 | 
			
		||||
										{Name: "cpu", Weight: 1},
 | 
			
		||||
										{Name: "memory", Weight: 1},
 | 
			
		||||
									},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "RequestedToCapacityRatio",
 | 
			
		||||
							Args: &config.RequestedToCapacityRatioArgs{
 | 
			
		||||
								Shape:     []config.UtilizationShapePoint{{Utilization: 1}},
 | 
			
		||||
								Resources: []config.ResourceSpec{{Name: "cpu", Weight: 1}, {Name: "memory", Weight: 1}},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "PodTopologySpread",
 | 
			
		||||
							Args: &config.PodTopologySpreadArgs{
 | 
			
		||||
								DefaultConstraints: []corev1.TopologySpreadConstraint{
 | 
			
		||||
									{MaxSkew: 1, TopologyKey: "zone", WhenUnsatisfiable: corev1.ScheduleAnyway},
 | 
			
		||||
								},
 | 
			
		||||
								DefaultingType: config.ListDefaulting,
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "ServiceAffinity",
 | 
			
		||||
							Args: &config.ServiceAffinityArgs{
 | 
			
		||||
								AffinityLabels: []string{"bar"},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "NodeResourcesLeastAllocated",
 | 
			
		||||
							Args: &config.NodeResourcesLeastAllocatedArgs{
 | 
			
		||||
								Resources: []config.ResourceSpec{{Name: "cpu", Weight: 2}, {Name: "unknown", Weight: 1}},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "NodeResourcesMostAllocated",
 | 
			
		||||
							Args: &config.NodeResourcesMostAllocatedArgs{
 | 
			
		||||
								Resources: []config.ResourceSpec{{Name: "memory", Weight: 1}},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "NodeResourcesBalancedAllocation",
 | 
			
		||||
							Args: &config.NodeResourcesBalancedAllocationArgs{
 | 
			
		||||
								Resources: []config.ResourceSpec{
 | 
			
		||||
									{Name: "cpu", Weight: 1},
 | 
			
		||||
									{Name: "memory", Weight: 1},
 | 
			
		||||
									{Name: "scalar0", Weight: 1},
 | 
			
		||||
									{Name: "scalar1", Weight: 1},
 | 
			
		||||
									{Name: "scalar2", Weight: 1},
 | 
			
		||||
									{Name: "scalar3", Weight: 2}},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "VolumeBinding",
 | 
			
		||||
							Args: &config.VolumeBindingArgs{
 | 
			
		||||
								BindTimeoutSeconds: 300,
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "NodeAffinity",
 | 
			
		||||
							Args: &config.NodeAffinityArgs{
 | 
			
		||||
								AddedAffinity: &corev1.NodeAffinity{
 | 
			
		||||
									RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{
 | 
			
		||||
										NodeSelectorTerms: []corev1.NodeSelectorTerm{
 | 
			
		||||
											{
 | 
			
		||||
												MatchExpressions: []corev1.NodeSelectorRequirement{
 | 
			
		||||
													{
 | 
			
		||||
														Key:      "foo",
 | 
			
		||||
														Operator: corev1.NodeSelectorOpIn,
 | 
			
		||||
														Values:   []string{"bar"},
 | 
			
		||||
													},
 | 
			
		||||
												},
 | 
			
		||||
											},
 | 
			
		||||
										},
 | 
			
		||||
									},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "v1beta1 plugins can include version and kind",
 | 
			
		||||
			data: []byte(`
 | 
			
		||||
apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
kind: KubeSchedulerConfiguration
 | 
			
		||||
profiles:
 | 
			
		||||
- pluginConfig:
 | 
			
		||||
  - name: NodeLabel
 | 
			
		||||
    args:
 | 
			
		||||
      apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
      kind: NodeLabelArgs
 | 
			
		||||
      presentLabels: ["bars"]
 | 
			
		||||
`),
 | 
			
		||||
			wantProfiles: []config.KubeSchedulerProfile{
 | 
			
		||||
				{
 | 
			
		||||
					SchedulerName: "default-scheduler",
 | 
			
		||||
					Plugins:       defaults.PluginsV1beta1,
 | 
			
		||||
					PluginConfig: append([]config.PluginConfig{
 | 
			
		||||
						{
 | 
			
		||||
							Name: "NodeLabel",
 | 
			
		||||
							Args: &config.NodeLabelArgs{PresentLabels: []string{"bars"}},
 | 
			
		||||
						},
 | 
			
		||||
					}, defaults.PluginConfigsV1beta1...),
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "plugin group and kind should match the type",
 | 
			
		||||
			data: []byte(`
 | 
			
		||||
apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
kind: KubeSchedulerConfiguration
 | 
			
		||||
profiles:
 | 
			
		||||
- pluginConfig:
 | 
			
		||||
  - name: NodeLabel
 | 
			
		||||
    args:
 | 
			
		||||
      apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
      kind: InterPodAffinityArgs
 | 
			
		||||
`),
 | 
			
		||||
			wantErr: `decoding .profiles[0].pluginConfig[0]: args for plugin NodeLabel were not of type NodeLabelArgs.kubescheduler.config.k8s.io, got InterPodAffinityArgs.kubescheduler.config.k8s.io`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "v1beta1 RequestedToCapacityRatioArgs shape encoding is strict",
 | 
			
		||||
			data: []byte(`
 | 
			
		||||
apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
kind: KubeSchedulerConfiguration
 | 
			
		||||
profiles:
 | 
			
		||||
- pluginConfig:
 | 
			
		||||
  - name: RequestedToCapacityRatio
 | 
			
		||||
    args:
 | 
			
		||||
      shape:
 | 
			
		||||
      - Utilization: 1
 | 
			
		||||
        Score: 2
 | 
			
		||||
`),
 | 
			
		||||
			wantErr: `decoding .profiles[0].pluginConfig[0]: decoding args for plugin RequestedToCapacityRatio: strict decoder error for {"shape":[{"Score":2,"Utilization":1}]}: v1beta1.RequestedToCapacityRatioArgs.Shape: []v1beta1.UtilizationShapePoint: v1beta1.UtilizationShapePoint.ReadObject: found unknown field: Score, error found in #10 byte of ...|:[{"Score":2,"Utiliz|..., bigger context ...|{"shape":[{"Score":2,"Utilization":1}]}|...`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "v1beta1 RequestedToCapacityRatioArgs resources encoding is strict",
 | 
			
		||||
			data: []byte(`
 | 
			
		||||
apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
kind: KubeSchedulerConfiguration
 | 
			
		||||
profiles:
 | 
			
		||||
- pluginConfig:
 | 
			
		||||
  - name: RequestedToCapacityRatio
 | 
			
		||||
    args:
 | 
			
		||||
      shape:
 | 
			
		||||
      - utilization: 1
 | 
			
		||||
        score: 2
 | 
			
		||||
      resources:
 | 
			
		||||
      - Name: 1
 | 
			
		||||
        Weight: 2
 | 
			
		||||
`),
 | 
			
		||||
			wantErr: `decoding .profiles[0].pluginConfig[0]: decoding args for plugin RequestedToCapacityRatio: strict decoder error for {"resources":[{"Name":1,"Weight":2}],"shape":[{"score":2,"utilization":1}]}: v1beta1.RequestedToCapacityRatioArgs.Shape: []v1beta1.UtilizationShapePoint: Resources: []v1beta1.ResourceSpec: v1beta1.ResourceSpec.ReadObject: found unknown field: Name, error found in #10 byte of ...|":[{"Name":1,"Weight|..., bigger context ...|{"resources":[{"Name":1,"Weight":2}],"shape":[{"score":2,"utilization":|...`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "out-of-tree plugin args",
 | 
			
		||||
			data: []byte(`
 | 
			
		||||
apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
kind: KubeSchedulerConfiguration
 | 
			
		||||
profiles:
 | 
			
		||||
- pluginConfig:
 | 
			
		||||
  - name: OutOfTreePlugin
 | 
			
		||||
    args:
 | 
			
		||||
      foo: bar
 | 
			
		||||
`),
 | 
			
		||||
			wantProfiles: []config.KubeSchedulerProfile{
 | 
			
		||||
				{
 | 
			
		||||
					SchedulerName: "default-scheduler",
 | 
			
		||||
					Plugins:       defaults.PluginsV1beta1,
 | 
			
		||||
					PluginConfig: append([]config.PluginConfig{
 | 
			
		||||
						{
 | 
			
		||||
							Name: "OutOfTreePlugin",
 | 
			
		||||
							Args: &runtime.Unknown{
 | 
			
		||||
								ContentType: "application/json",
 | 
			
		||||
								Raw:         []byte(`{"foo":"bar"}`),
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
					}, defaults.PluginConfigsV1beta1...),
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "empty and no plugin args v1beta1",
 | 
			
		||||
			data: []byte(`
 | 
			
		||||
apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
kind: KubeSchedulerConfiguration
 | 
			
		||||
profiles:
 | 
			
		||||
- pluginConfig:
 | 
			
		||||
  - name: DefaultPreemption
 | 
			
		||||
    args:
 | 
			
		||||
  - name: InterPodAffinity
 | 
			
		||||
    args:
 | 
			
		||||
  - name: NodeResourcesFit
 | 
			
		||||
  - name: OutOfTreePlugin
 | 
			
		||||
    args:
 | 
			
		||||
  - name: NodeResourcesLeastAllocated
 | 
			
		||||
    args:
 | 
			
		||||
  - name: NodeResourcesMostAllocated
 | 
			
		||||
    args:
 | 
			
		||||
  - name: NodeResourcesBalancedAllocation
 | 
			
		||||
    args:
 | 
			
		||||
  - name: VolumeBinding
 | 
			
		||||
    args:
 | 
			
		||||
  - name: PodTopologySpread
 | 
			
		||||
  - name: NodeAffinity
 | 
			
		||||
`),
 | 
			
		||||
			wantProfiles: []config.KubeSchedulerProfile{
 | 
			
		||||
				{
 | 
			
		||||
					SchedulerName: "default-scheduler",
 | 
			
		||||
					Plugins:       defaults.PluginsV1beta1,
 | 
			
		||||
					PluginConfig: []config.PluginConfig{
 | 
			
		||||
						{
 | 
			
		||||
							Name: "DefaultPreemption",
 | 
			
		||||
							Args: &config.DefaultPreemptionArgs{MinCandidateNodesPercentage: 10, MinCandidateNodesAbsolute: 100},
 | 
			
		||||
						},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "InterPodAffinity",
 | 
			
		||||
							Args: &config.InterPodAffinityArgs{
 | 
			
		||||
								HardPodAffinityWeight: 1,
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "NodeResourcesFit",
 | 
			
		||||
							Args: &config.NodeResourcesFitArgs{
 | 
			
		||||
								ScoringStrategy: &config.ScoringStrategy{
 | 
			
		||||
									Type: config.LeastAllocated,
 | 
			
		||||
									Resources: []config.ResourceSpec{
 | 
			
		||||
										{Name: "cpu", Weight: 1},
 | 
			
		||||
										{Name: "memory", Weight: 1},
 | 
			
		||||
									},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
						{Name: "OutOfTreePlugin"},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "NodeResourcesLeastAllocated",
 | 
			
		||||
							Args: &config.NodeResourcesLeastAllocatedArgs{
 | 
			
		||||
								Resources: []config.ResourceSpec{{Name: "cpu", Weight: 1}, {Name: "memory", Weight: 1}},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "NodeResourcesMostAllocated",
 | 
			
		||||
							Args: &config.NodeResourcesMostAllocatedArgs{
 | 
			
		||||
								Resources: []config.ResourceSpec{{Name: "cpu", Weight: 1}, {Name: "memory", Weight: 1}},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "NodeResourcesBalancedAllocation",
 | 
			
		||||
							Args: &config.NodeResourcesBalancedAllocationArgs{
 | 
			
		||||
								Resources: []config.ResourceSpec{{Name: "cpu", Weight: 1}, {Name: "memory", Weight: 1}},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "VolumeBinding",
 | 
			
		||||
							Args: &config.VolumeBindingArgs{
 | 
			
		||||
								BindTimeoutSeconds: 600,
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "PodTopologySpread",
 | 
			
		||||
							Args: &config.PodTopologySpreadArgs{
 | 
			
		||||
								DefaultingType: config.SystemDefaulting,
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
						{
 | 
			
		||||
							Name: "NodeAffinity",
 | 
			
		||||
							Args: &config.NodeAffinityArgs{},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		// v1beta2 tests
 | 
			
		||||
		{
 | 
			
		||||
			name: "v1beta2 all plugin args in default profile",
 | 
			
		||||
@@ -783,265 +413,6 @@ func TestCodecsEncodePluginConfig(t *testing.T) {
 | 
			
		||||
		version schema.GroupVersion
 | 
			
		||||
		want    string
 | 
			
		||||
	}{
 | 
			
		||||
		//v1beta1 tests
 | 
			
		||||
		{
 | 
			
		||||
			name:    "v1beta1 in-tree and out-of-tree plugins",
 | 
			
		||||
			version: v1beta1.SchemeGroupVersion,
 | 
			
		||||
			obj: &v1beta1.KubeSchedulerConfiguration{
 | 
			
		||||
				Profiles: []v1beta1.KubeSchedulerProfile{
 | 
			
		||||
					{
 | 
			
		||||
						PluginConfig: []v1beta1.PluginConfig{
 | 
			
		||||
							{
 | 
			
		||||
								Name: "InterPodAffinity",
 | 
			
		||||
								Args: runtime.RawExtension{
 | 
			
		||||
									Object: &v1beta1.InterPodAffinityArgs{
 | 
			
		||||
										HardPodAffinityWeight: pointer.Int32Ptr(5),
 | 
			
		||||
									},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "VolumeBinding",
 | 
			
		||||
								Args: runtime.RawExtension{
 | 
			
		||||
									Object: &v1beta1.VolumeBindingArgs{
 | 
			
		||||
										BindTimeoutSeconds: pointer.Int64Ptr(300),
 | 
			
		||||
										Shape: []v1beta1.UtilizationShapePoint{
 | 
			
		||||
											{
 | 
			
		||||
												Utilization: 0,
 | 
			
		||||
												Score:       0,
 | 
			
		||||
											},
 | 
			
		||||
											{
 | 
			
		||||
												Utilization: 100,
 | 
			
		||||
												Score:       10,
 | 
			
		||||
											},
 | 
			
		||||
										},
 | 
			
		||||
									},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "RequestedToCapacityRatio",
 | 
			
		||||
								Args: runtime.RawExtension{
 | 
			
		||||
									Object: &v1beta1.RequestedToCapacityRatioArgs{
 | 
			
		||||
										Shape: []v1beta1.UtilizationShapePoint{
 | 
			
		||||
											{Utilization: 1, Score: 2},
 | 
			
		||||
										},
 | 
			
		||||
										Resources: []v1beta1.ResourceSpec{
 | 
			
		||||
											{Name: "cpu", Weight: 2},
 | 
			
		||||
										},
 | 
			
		||||
									},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "NodeResourcesLeastAllocated",
 | 
			
		||||
								Args: runtime.RawExtension{
 | 
			
		||||
									Object: &v1beta1.NodeResourcesLeastAllocatedArgs{
 | 
			
		||||
										Resources: []v1beta1.ResourceSpec{
 | 
			
		||||
											{Name: "mem", Weight: 2},
 | 
			
		||||
										},
 | 
			
		||||
									},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "NodeResourcesBalancedAllocation",
 | 
			
		||||
								Args: runtime.RawExtension{
 | 
			
		||||
									Object: &v1beta1.NodeResourcesBalancedAllocationArgs{
 | 
			
		||||
										Resources: []v1beta1.ResourceSpec{
 | 
			
		||||
											{Name: "mem", Weight: 1},
 | 
			
		||||
										},
 | 
			
		||||
									},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "PodTopologySpread",
 | 
			
		||||
								Args: runtime.RawExtension{
 | 
			
		||||
									Object: &v1beta1.PodTopologySpreadArgs{
 | 
			
		||||
										DefaultConstraints: []corev1.TopologySpreadConstraint{},
 | 
			
		||||
									},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "OutOfTreePlugin",
 | 
			
		||||
								Args: runtime.RawExtension{
 | 
			
		||||
									Raw: []byte(`{"foo":"bar"}`),
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: `apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
clientConnection:
 | 
			
		||||
  acceptContentTypes: ""
 | 
			
		||||
  burst: 0
 | 
			
		||||
  contentType: ""
 | 
			
		||||
  kubeconfig: ""
 | 
			
		||||
  qps: 0
 | 
			
		||||
kind: KubeSchedulerConfiguration
 | 
			
		||||
leaderElection:
 | 
			
		||||
  leaderElect: null
 | 
			
		||||
  leaseDuration: 0s
 | 
			
		||||
  renewDeadline: 0s
 | 
			
		||||
  resourceLock: ""
 | 
			
		||||
  resourceName: ""
 | 
			
		||||
  resourceNamespace: ""
 | 
			
		||||
  retryPeriod: 0s
 | 
			
		||||
profiles:
 | 
			
		||||
- pluginConfig:
 | 
			
		||||
  - args:
 | 
			
		||||
      apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
      hardPodAffinityWeight: 5
 | 
			
		||||
      kind: InterPodAffinityArgs
 | 
			
		||||
    name: InterPodAffinity
 | 
			
		||||
  - args:
 | 
			
		||||
      apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
      bindTimeoutSeconds: 300
 | 
			
		||||
      kind: VolumeBindingArgs
 | 
			
		||||
      shape:
 | 
			
		||||
      - score: 0
 | 
			
		||||
        utilization: 0
 | 
			
		||||
      - score: 10
 | 
			
		||||
        utilization: 100
 | 
			
		||||
    name: VolumeBinding
 | 
			
		||||
  - args:
 | 
			
		||||
      apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
      kind: RequestedToCapacityRatioArgs
 | 
			
		||||
      resources:
 | 
			
		||||
      - name: cpu
 | 
			
		||||
        weight: 2
 | 
			
		||||
      shape:
 | 
			
		||||
      - score: 2
 | 
			
		||||
        utilization: 1
 | 
			
		||||
    name: RequestedToCapacityRatio
 | 
			
		||||
  - args:
 | 
			
		||||
      apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
      kind: NodeResourcesLeastAllocatedArgs
 | 
			
		||||
      resources:
 | 
			
		||||
      - name: mem
 | 
			
		||||
        weight: 2
 | 
			
		||||
    name: NodeResourcesLeastAllocated
 | 
			
		||||
  - args:
 | 
			
		||||
      apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
      kind: NodeResourcesBalancedAllocationArgs
 | 
			
		||||
      resources:
 | 
			
		||||
      - name: mem
 | 
			
		||||
        weight: 1
 | 
			
		||||
    name: NodeResourcesBalancedAllocation
 | 
			
		||||
  - args:
 | 
			
		||||
      apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
      kind: PodTopologySpreadArgs
 | 
			
		||||
    name: PodTopologySpread
 | 
			
		||||
  - args:
 | 
			
		||||
      foo: bar
 | 
			
		||||
    name: OutOfTreePlugin
 | 
			
		||||
`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:    "v1beta1 in-tree and out-of-tree plugins from internal",
 | 
			
		||||
			version: v1beta1.SchemeGroupVersion,
 | 
			
		||||
			obj: &config.KubeSchedulerConfiguration{
 | 
			
		||||
				Parallelism: 8,
 | 
			
		||||
				Profiles: []config.KubeSchedulerProfile{
 | 
			
		||||
					{
 | 
			
		||||
						PluginConfig: []config.PluginConfig{
 | 
			
		||||
							{
 | 
			
		||||
								Name: "InterPodAffinity",
 | 
			
		||||
								Args: &config.InterPodAffinityArgs{
 | 
			
		||||
									HardPodAffinityWeight: 5,
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "NodeResourcesMostAllocated",
 | 
			
		||||
								Args: &config.NodeResourcesMostAllocatedArgs{
 | 
			
		||||
									Resources: []config.ResourceSpec{{Name: "cpu", Weight: 1}},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "VolumeBinding",
 | 
			
		||||
								Args: &config.VolumeBindingArgs{
 | 
			
		||||
									BindTimeoutSeconds: 300,
 | 
			
		||||
									Shape: []config.UtilizationShapePoint{
 | 
			
		||||
										{
 | 
			
		||||
											Utilization: 0,
 | 
			
		||||
											Score:       0,
 | 
			
		||||
										},
 | 
			
		||||
										{
 | 
			
		||||
											Utilization: 100,
 | 
			
		||||
											Score:       10,
 | 
			
		||||
										},
 | 
			
		||||
									},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "PodTopologySpread",
 | 
			
		||||
								Args: &config.PodTopologySpreadArgs{},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "OutOfTreePlugin",
 | 
			
		||||
								Args: &runtime.Unknown{
 | 
			
		||||
									Raw: []byte(`{"foo":"bar"}`),
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: `apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
clientConnection:
 | 
			
		||||
  acceptContentTypes: ""
 | 
			
		||||
  burst: 0
 | 
			
		||||
  contentType: ""
 | 
			
		||||
  kubeconfig: ""
 | 
			
		||||
  qps: 0
 | 
			
		||||
enableContentionProfiling: false
 | 
			
		||||
enableProfiling: false
 | 
			
		||||
healthzBindAddress: ""
 | 
			
		||||
kind: KubeSchedulerConfiguration
 | 
			
		||||
leaderElection:
 | 
			
		||||
  leaderElect: false
 | 
			
		||||
  leaseDuration: 0s
 | 
			
		||||
  renewDeadline: 0s
 | 
			
		||||
  resourceLock: ""
 | 
			
		||||
  resourceName: ""
 | 
			
		||||
  resourceNamespace: ""
 | 
			
		||||
  retryPeriod: 0s
 | 
			
		||||
metricsBindAddress: ""
 | 
			
		||||
parallelism: 8
 | 
			
		||||
percentageOfNodesToScore: 0
 | 
			
		||||
podInitialBackoffSeconds: 0
 | 
			
		||||
podMaxBackoffSeconds: 0
 | 
			
		||||
profiles:
 | 
			
		||||
- pluginConfig:
 | 
			
		||||
  - args:
 | 
			
		||||
      apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
      hardPodAffinityWeight: 5
 | 
			
		||||
      kind: InterPodAffinityArgs
 | 
			
		||||
    name: InterPodAffinity
 | 
			
		||||
  - args:
 | 
			
		||||
      apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
      kind: NodeResourcesMostAllocatedArgs
 | 
			
		||||
      resources:
 | 
			
		||||
      - name: cpu
 | 
			
		||||
        weight: 1
 | 
			
		||||
    name: NodeResourcesMostAllocated
 | 
			
		||||
  - args:
 | 
			
		||||
      apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
      bindTimeoutSeconds: 300
 | 
			
		||||
      kind: VolumeBindingArgs
 | 
			
		||||
      shape:
 | 
			
		||||
      - score: 0
 | 
			
		||||
        utilization: 0
 | 
			
		||||
      - score: 10
 | 
			
		||||
        utilization: 100
 | 
			
		||||
    name: VolumeBinding
 | 
			
		||||
  - args:
 | 
			
		||||
      apiVersion: kubescheduler.config.k8s.io/v1beta1
 | 
			
		||||
      kind: PodTopologySpreadArgs
 | 
			
		||||
    name: PodTopologySpread
 | 
			
		||||
  - args:
 | 
			
		||||
      foo: bar
 | 
			
		||||
    name: OutOfTreePlugin
 | 
			
		||||
  schedulerName: ""
 | 
			
		||||
`,
 | 
			
		||||
		},
 | 
			
		||||
		//v1beta2 tests
 | 
			
		||||
		{
 | 
			
		||||
			name:    "v1beta2 in-tree and out-of-tree plugins",
 | 
			
		||||
 
 | 
			
		||||
@@ -20,24 +20,11 @@ import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/component-base/config/v1alpha1"
 | 
			
		||||
	"k8s.io/kube-scheduler/config/v1beta1"
 | 
			
		||||
	"k8s.io/kube-scheduler/config/v1beta2"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config/scheme"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// V1beta1ToInternalWithDefaults creates a v1beta1 default configuration.
 | 
			
		||||
func V1beta1ToInternalWithDefaults(t *testing.T, versionedCfg v1beta1.KubeSchedulerConfiguration) *config.KubeSchedulerConfiguration {
 | 
			
		||||
	versionedCfg.DebuggingConfiguration = *v1alpha1.NewRecommendedDebuggingConfiguration()
 | 
			
		||||
 | 
			
		||||
	scheme.Scheme.Default(&versionedCfg)
 | 
			
		||||
	cfg := config.KubeSchedulerConfiguration{}
 | 
			
		||||
	if err := scheme.Scheme.Convert(&versionedCfg, &cfg, nil); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	return &cfg
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// V1beta2ToInternalWithDefaults creates a v1beta2 default configuration.
 | 
			
		||||
func V1beta2ToInternalWithDefaults(t *testing.T, versionedCfg v1beta2.KubeSchedulerConfiguration) *config.KubeSchedulerConfiguration {
 | 
			
		||||
	versionedCfg.DebuggingConfiguration = *v1alpha1.NewRecommendedDebuggingConfiguration()
 | 
			
		||||
 
 | 
			
		||||
@@ -1,199 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2020 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 v1beta1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"sync"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/apimachinery/pkg/conversion"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
 | 
			
		||||
	"k8s.io/kube-scheduler/config/v1beta1"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// pluginArgConversionScheme is a scheme with internal and v1beta1 registered,
 | 
			
		||||
	// used for defaulting/converting typed PluginConfig Args.
 | 
			
		||||
	// Access via getPluginArgConversionScheme()
 | 
			
		||||
	pluginArgConversionScheme     *runtime.Scheme
 | 
			
		||||
	initPluginArgConversionScheme sync.Once
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func getPluginArgConversionScheme() *runtime.Scheme {
 | 
			
		||||
	initPluginArgConversionScheme.Do(func() {
 | 
			
		||||
		// set up the scheme used for plugin arg conversion
 | 
			
		||||
		pluginArgConversionScheme = runtime.NewScheme()
 | 
			
		||||
		utilruntime.Must(AddToScheme(pluginArgConversionScheme))
 | 
			
		||||
		utilruntime.Must(config.AddToScheme(pluginArgConversionScheme))
 | 
			
		||||
	})
 | 
			
		||||
	return pluginArgConversionScheme
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Convert_v1beta1_Plugins_To_config_Plugins(in *v1beta1.Plugins, out *config.Plugins, s conversion.Scope) error {
 | 
			
		||||
	if err := Convert_v1beta1_PluginSet_To_config_PluginSet(in.QueueSort, &out.QueueSort, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := Convert_v1beta1_PluginSet_To_config_PluginSet(in.PreFilter, &out.PreFilter, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := Convert_v1beta1_PluginSet_To_config_PluginSet(in.Filter, &out.Filter, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := Convert_v1beta1_PluginSet_To_config_PluginSet(in.PostFilter, &out.PostFilter, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := Convert_v1beta1_PluginSet_To_config_PluginSet(in.PreScore, &out.PreScore, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := Convert_v1beta1_PluginSet_To_config_PluginSet(in.Score, &out.Score, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := Convert_v1beta1_PluginSet_To_config_PluginSet(in.Reserve, &out.Reserve, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := Convert_v1beta1_PluginSet_To_config_PluginSet(in.Permit, &out.Permit, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := Convert_v1beta1_PluginSet_To_config_PluginSet(in.PreBind, &out.PreBind, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := Convert_v1beta1_PluginSet_To_config_PluginSet(in.Bind, &out.Bind, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := Convert_v1beta1_PluginSet_To_config_PluginSet(in.PostBind, &out.PostBind, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Convert_v1beta1_PluginSet_To_config_PluginSet(in *v1beta1.PluginSet, out *config.PluginSet, s conversion.Scope) error {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return autoConvert_v1beta1_PluginSet_To_config_PluginSet(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Convert_config_Plugins_To_v1beta1_Plugins(in *config.Plugins, out *v1beta1.Plugins, s conversion.Scope) error {
 | 
			
		||||
	out.QueueSort = new(v1beta1.PluginSet)
 | 
			
		||||
	if err := Convert_config_PluginSet_To_v1beta1_PluginSet(&in.QueueSort, out.QueueSort, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	out.PreFilter = new(v1beta1.PluginSet)
 | 
			
		||||
	if err := Convert_config_PluginSet_To_v1beta1_PluginSet(&in.PreFilter, out.PreFilter, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	out.Filter = new(v1beta1.PluginSet)
 | 
			
		||||
	if err := Convert_config_PluginSet_To_v1beta1_PluginSet(&in.Filter, out.Filter, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	out.PostFilter = new(v1beta1.PluginSet)
 | 
			
		||||
	if err := Convert_config_PluginSet_To_v1beta1_PluginSet(&in.PostFilter, out.PostFilter, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	out.PreScore = new(v1beta1.PluginSet)
 | 
			
		||||
	if err := Convert_config_PluginSet_To_v1beta1_PluginSet(&in.PreScore, out.PreScore, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	out.Score = new(v1beta1.PluginSet)
 | 
			
		||||
	if err := Convert_config_PluginSet_To_v1beta1_PluginSet(&in.Score, out.Score, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	out.Reserve = new(v1beta1.PluginSet)
 | 
			
		||||
	if err := Convert_config_PluginSet_To_v1beta1_PluginSet(&in.Reserve, out.Reserve, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	out.Permit = new(v1beta1.PluginSet)
 | 
			
		||||
	if err := Convert_config_PluginSet_To_v1beta1_PluginSet(&in.Permit, out.Permit, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	out.PreBind = new(v1beta1.PluginSet)
 | 
			
		||||
	if err := Convert_config_PluginSet_To_v1beta1_PluginSet(&in.PreBind, out.PreBind, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	out.Bind = new(v1beta1.PluginSet)
 | 
			
		||||
	if err := Convert_config_PluginSet_To_v1beta1_PluginSet(&in.Bind, out.Bind, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	out.PostBind = new(v1beta1.PluginSet)
 | 
			
		||||
	if err := Convert_config_PluginSet_To_v1beta1_PluginSet(&in.PostBind, out.PostBind, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Convert_v1beta1_KubeSchedulerConfiguration_To_config_KubeSchedulerConfiguration(in *v1beta1.KubeSchedulerConfiguration, out *config.KubeSchedulerConfiguration, s conversion.Scope) error {
 | 
			
		||||
	if err := autoConvert_v1beta1_KubeSchedulerConfiguration_To_config_KubeSchedulerConfiguration(in, out, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return convertToInternalPluginConfigArgs(out)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// convertToInternalPluginConfigArgs converts PluginConfig#Args into internal
 | 
			
		||||
// types using a scheme, after applying defaults.
 | 
			
		||||
func convertToInternalPluginConfigArgs(out *config.KubeSchedulerConfiguration) error {
 | 
			
		||||
	scheme := getPluginArgConversionScheme()
 | 
			
		||||
	for i := range out.Profiles {
 | 
			
		||||
		prof := &out.Profiles[i]
 | 
			
		||||
		for j := range prof.PluginConfig {
 | 
			
		||||
			args := prof.PluginConfig[j].Args
 | 
			
		||||
			if args == nil {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			if _, isUnknown := args.(*runtime.Unknown); isUnknown {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			internalArgs, err := scheme.ConvertToVersion(args, config.SchemeGroupVersion)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return fmt.Errorf("converting .Profiles[%d].PluginConfig[%d].Args into internal type: %w", i, j, err)
 | 
			
		||||
			}
 | 
			
		||||
			prof.PluginConfig[j].Args = internalArgs
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Convert_config_KubeSchedulerConfiguration_To_v1beta1_KubeSchedulerConfiguration(in *config.KubeSchedulerConfiguration, out *v1beta1.KubeSchedulerConfiguration, s conversion.Scope) error {
 | 
			
		||||
	if err := autoConvert_config_KubeSchedulerConfiguration_To_v1beta1_KubeSchedulerConfiguration(in, out, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return convertToExternalPluginConfigArgs(out)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// convertToExternalPluginConfigArgs converts PluginConfig#Args into
 | 
			
		||||
// external (versioned) types using a scheme.
 | 
			
		||||
func convertToExternalPluginConfigArgs(out *v1beta1.KubeSchedulerConfiguration) error {
 | 
			
		||||
	scheme := getPluginArgConversionScheme()
 | 
			
		||||
	for i := range out.Profiles {
 | 
			
		||||
		for j := range out.Profiles[i].PluginConfig {
 | 
			
		||||
			args := out.Profiles[i].PluginConfig[j].Args
 | 
			
		||||
			if args.Object == nil {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			if _, isUnknown := args.Object.(*runtime.Unknown); isUnknown {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			externalArgs, err := scheme.ConvertToVersion(args.Object, SchemeGroupVersion)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			out.Profiles[i].PluginConfig[j].Args.Object = externalArgs
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
@@ -1,180 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2021 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 v1beta1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"k8s.io/apimachinery/pkg/util/sets"
 | 
			
		||||
	utilfeature "k8s.io/apiserver/pkg/util/feature"
 | 
			
		||||
	"k8s.io/klog/v2"
 | 
			
		||||
	"k8s.io/kube-scheduler/config/v1beta1"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/features"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/framework/plugins/names"
 | 
			
		||||
	"k8s.io/utils/pointer"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// getDefaultPlugins returns the default set of plugins.
 | 
			
		||||
func getDefaultPlugins() *v1beta1.Plugins {
 | 
			
		||||
	plugins := &v1beta1.Plugins{
 | 
			
		||||
		QueueSort: &v1beta1.PluginSet{
 | 
			
		||||
			Enabled: []v1beta1.Plugin{
 | 
			
		||||
				{Name: names.PrioritySort},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		PreFilter: &v1beta1.PluginSet{
 | 
			
		||||
			Enabled: []v1beta1.Plugin{
 | 
			
		||||
				{Name: names.NodeResourcesFit},
 | 
			
		||||
				{Name: names.NodePorts},
 | 
			
		||||
				{Name: names.VolumeRestrictions},
 | 
			
		||||
				{Name: names.PodTopologySpread},
 | 
			
		||||
				{Name: names.InterPodAffinity},
 | 
			
		||||
				{Name: names.VolumeBinding},
 | 
			
		||||
				{Name: names.NodeAffinity},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		Filter: &v1beta1.PluginSet{
 | 
			
		||||
			Enabled: []v1beta1.Plugin{
 | 
			
		||||
				{Name: names.NodeUnschedulable},
 | 
			
		||||
				{Name: names.NodeName},
 | 
			
		||||
				{Name: names.TaintToleration},
 | 
			
		||||
				{Name: names.NodeAffinity},
 | 
			
		||||
				{Name: names.NodePorts},
 | 
			
		||||
				{Name: names.NodeResourcesFit},
 | 
			
		||||
				{Name: names.VolumeRestrictions},
 | 
			
		||||
				{Name: names.EBSLimits},
 | 
			
		||||
				{Name: names.GCEPDLimits},
 | 
			
		||||
				{Name: names.NodeVolumeLimits},
 | 
			
		||||
				{Name: names.AzureDiskLimits},
 | 
			
		||||
				{Name: names.VolumeBinding},
 | 
			
		||||
				{Name: names.VolumeZone},
 | 
			
		||||
				{Name: names.PodTopologySpread},
 | 
			
		||||
				{Name: names.InterPodAffinity},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		PostFilter: &v1beta1.PluginSet{
 | 
			
		||||
			Enabled: []v1beta1.Plugin{
 | 
			
		||||
				{Name: names.DefaultPreemption},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		PreScore: &v1beta1.PluginSet{
 | 
			
		||||
			Enabled: []v1beta1.Plugin{
 | 
			
		||||
				{Name: names.InterPodAffinity},
 | 
			
		||||
				{Name: names.PodTopologySpread},
 | 
			
		||||
				{Name: names.TaintToleration},
 | 
			
		||||
				{Name: names.NodeAffinity},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		Score: &v1beta1.PluginSet{
 | 
			
		||||
			Enabled: []v1beta1.Plugin{
 | 
			
		||||
				{Name: names.NodeResourcesBalancedAllocation, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
				{Name: names.ImageLocality, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
				{Name: names.InterPodAffinity, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
				{Name: names.NodeResourcesLeastAllocated, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
				{Name: names.NodeAffinity, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
				{Name: names.NodePreferAvoidPods, Weight: pointer.Int32Ptr(10000)},
 | 
			
		||||
				// Weight is doubled because:
 | 
			
		||||
				// - This is a score coming from user preference.
 | 
			
		||||
				// - It makes its signal comparable to NodeResourcesLeastAllocated.
 | 
			
		||||
				{Name: names.PodTopologySpread, Weight: pointer.Int32Ptr(2)},
 | 
			
		||||
				{Name: names.TaintToleration, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		Reserve: &v1beta1.PluginSet{
 | 
			
		||||
			Enabled: []v1beta1.Plugin{
 | 
			
		||||
				{Name: names.VolumeBinding},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		PreBind: &v1beta1.PluginSet{
 | 
			
		||||
			Enabled: []v1beta1.Plugin{
 | 
			
		||||
				{Name: names.VolumeBinding},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		Bind: &v1beta1.PluginSet{
 | 
			
		||||
			Enabled: []v1beta1.Plugin{
 | 
			
		||||
				{Name: names.DefaultBinder},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	applyFeatureGates(plugins)
 | 
			
		||||
 | 
			
		||||
	return plugins
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func applyFeatureGates(config *v1beta1.Plugins) {
 | 
			
		||||
	if utilfeature.DefaultFeatureGate.Enabled(features.VolumeCapacityPriority) {
 | 
			
		||||
		config.Score.Enabled = append(config.Score.Enabled, v1beta1.Plugin{Name: names.VolumeBinding, Weight: pointer.Int32Ptr(1)})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !utilfeature.DefaultFeatureGate.Enabled(features.DefaultPodTopologySpread) {
 | 
			
		||||
		// When feature is enabled, the default spreading is done by
 | 
			
		||||
		// PodTopologySpread plugin, which is enabled by default.
 | 
			
		||||
		klog.InfoS("Registering SelectorSpread plugin")
 | 
			
		||||
		s := v1beta1.Plugin{Name: names.SelectorSpread}
 | 
			
		||||
		config.PreScore.Enabled = append(config.PreScore.Enabled, s)
 | 
			
		||||
		s.Weight = pointer.Int32Ptr(1)
 | 
			
		||||
		config.Score.Enabled = append(config.Score.Enabled, s)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// mergePlugins merges the custom set into the given default one, handling disabled sets.
 | 
			
		||||
func mergePlugins(defaultPlugins, customPlugins *v1beta1.Plugins) *v1beta1.Plugins {
 | 
			
		||||
	if customPlugins == nil {
 | 
			
		||||
		return defaultPlugins
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	defaultPlugins.QueueSort = mergePluginSet(defaultPlugins.QueueSort, customPlugins.QueueSort)
 | 
			
		||||
	defaultPlugins.PreFilter = mergePluginSet(defaultPlugins.PreFilter, customPlugins.PreFilter)
 | 
			
		||||
	defaultPlugins.Filter = mergePluginSet(defaultPlugins.Filter, customPlugins.Filter)
 | 
			
		||||
	defaultPlugins.PostFilter = mergePluginSet(defaultPlugins.PostFilter, customPlugins.PostFilter)
 | 
			
		||||
	defaultPlugins.PreScore = mergePluginSet(defaultPlugins.PreScore, customPlugins.PreScore)
 | 
			
		||||
	defaultPlugins.Score = mergePluginSet(defaultPlugins.Score, customPlugins.Score)
 | 
			
		||||
	defaultPlugins.Reserve = mergePluginSet(defaultPlugins.Reserve, customPlugins.Reserve)
 | 
			
		||||
	defaultPlugins.Permit = mergePluginSet(defaultPlugins.Permit, customPlugins.Permit)
 | 
			
		||||
	defaultPlugins.PreBind = mergePluginSet(defaultPlugins.PreBind, customPlugins.PreBind)
 | 
			
		||||
	defaultPlugins.Bind = mergePluginSet(defaultPlugins.Bind, customPlugins.Bind)
 | 
			
		||||
	defaultPlugins.PostBind = mergePluginSet(defaultPlugins.PostBind, customPlugins.PostBind)
 | 
			
		||||
	return defaultPlugins
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func mergePluginSet(defaultPluginSet, customPluginSet *v1beta1.PluginSet) *v1beta1.PluginSet {
 | 
			
		||||
	disabledPlugins := sets.NewString()
 | 
			
		||||
	if customPluginSet != nil {
 | 
			
		||||
		for _, disabledPlugin := range customPluginSet.Disabled {
 | 
			
		||||
			disabledPlugins.Insert(disabledPlugin.Name)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var enabledPlugins []v1beta1.Plugin
 | 
			
		||||
	if defaultPluginSet != nil && !disabledPlugins.Has("*") {
 | 
			
		||||
		for _, defaultEnabledPlugin := range defaultPluginSet.Enabled {
 | 
			
		||||
			if disabledPlugins.Has(defaultEnabledPlugin.Name) {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			enabledPlugins = append(enabledPlugins, defaultEnabledPlugin)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if customPluginSet != nil {
 | 
			
		||||
		enabledPlugins = append(enabledPlugins, customPluginSet.Enabled...)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(enabledPlugins) == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &v1beta1.PluginSet{Enabled: enabledPlugins}
 | 
			
		||||
}
 | 
			
		||||
@@ -1,376 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2017 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 v1beta1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"github.com/google/go-cmp/cmp"
 | 
			
		||||
	"k8s.io/apiserver/pkg/util/feature"
 | 
			
		||||
	"k8s.io/component-base/featuregate"
 | 
			
		||||
	featuregatetesting "k8s.io/component-base/featuregate/testing"
 | 
			
		||||
	"k8s.io/kube-scheduler/config/v1beta1"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/features"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/framework/plugins/names"
 | 
			
		||||
	"k8s.io/utils/pointer"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestApplyFeatureGates(t *testing.T) {
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		name       string
 | 
			
		||||
		features   map[featuregate.Feature]bool
 | 
			
		||||
		wantConfig *v1beta1.Plugins
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			name: "Feature gates disabled",
 | 
			
		||||
			wantConfig: &v1beta1.Plugins{
 | 
			
		||||
				QueueSort: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: names.PrioritySort},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				PreFilter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: names.NodeResourcesFit},
 | 
			
		||||
						{Name: names.NodePorts},
 | 
			
		||||
						{Name: names.VolumeRestrictions},
 | 
			
		||||
						{Name: names.PodTopologySpread},
 | 
			
		||||
						{Name: names.InterPodAffinity},
 | 
			
		||||
						{Name: names.VolumeBinding},
 | 
			
		||||
						{Name: names.NodeAffinity},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Filter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: names.NodeUnschedulable},
 | 
			
		||||
						{Name: names.NodeName},
 | 
			
		||||
						{Name: names.TaintToleration},
 | 
			
		||||
						{Name: names.NodeAffinity},
 | 
			
		||||
						{Name: names.NodePorts},
 | 
			
		||||
						{Name: names.NodeResourcesFit},
 | 
			
		||||
						{Name: names.VolumeRestrictions},
 | 
			
		||||
						{Name: names.EBSLimits},
 | 
			
		||||
						{Name: names.GCEPDLimits},
 | 
			
		||||
						{Name: names.NodeVolumeLimits},
 | 
			
		||||
						{Name: names.AzureDiskLimits},
 | 
			
		||||
						{Name: names.VolumeBinding},
 | 
			
		||||
						{Name: names.VolumeZone},
 | 
			
		||||
						{Name: names.PodTopologySpread},
 | 
			
		||||
						{Name: names.InterPodAffinity},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				PostFilter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: names.DefaultPreemption},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				PreScore: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: names.InterPodAffinity},
 | 
			
		||||
						{Name: names.PodTopologySpread},
 | 
			
		||||
						{Name: names.TaintToleration},
 | 
			
		||||
						{Name: names.NodeAffinity},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Score: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: names.NodeResourcesBalancedAllocation, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
						{Name: names.ImageLocality, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
						{Name: names.InterPodAffinity, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
						{Name: names.NodeResourcesLeastAllocated, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
						{Name: names.NodeAffinity, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
						{Name: names.NodePreferAvoidPods, Weight: pointer.Int32Ptr(10000)},
 | 
			
		||||
						{Name: names.PodTopologySpread, Weight: pointer.Int32Ptr(2)},
 | 
			
		||||
						{Name: names.TaintToleration, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Reserve: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: names.VolumeBinding},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				PreBind: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: names.VolumeBinding},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Bind: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: names.DefaultBinder},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "DefaultPodTopologySpread disabled",
 | 
			
		||||
			features: map[featuregate.Feature]bool{
 | 
			
		||||
				features.DefaultPodTopologySpread: false,
 | 
			
		||||
			},
 | 
			
		||||
			wantConfig: &v1beta1.Plugins{
 | 
			
		||||
				QueueSort: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: names.PrioritySort},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				PreFilter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: names.NodeResourcesFit},
 | 
			
		||||
						{Name: names.NodePorts},
 | 
			
		||||
						{Name: names.VolumeRestrictions},
 | 
			
		||||
						{Name: names.PodTopologySpread},
 | 
			
		||||
						{Name: names.InterPodAffinity},
 | 
			
		||||
						{Name: names.VolumeBinding},
 | 
			
		||||
						{Name: names.NodeAffinity},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Filter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: names.NodeUnschedulable},
 | 
			
		||||
						{Name: names.NodeName},
 | 
			
		||||
						{Name: names.TaintToleration},
 | 
			
		||||
						{Name: names.NodeAffinity},
 | 
			
		||||
						{Name: names.NodePorts},
 | 
			
		||||
						{Name: names.NodeResourcesFit},
 | 
			
		||||
						{Name: names.VolumeRestrictions},
 | 
			
		||||
						{Name: names.EBSLimits},
 | 
			
		||||
						{Name: names.GCEPDLimits},
 | 
			
		||||
						{Name: names.NodeVolumeLimits},
 | 
			
		||||
						{Name: names.AzureDiskLimits},
 | 
			
		||||
						{Name: names.VolumeBinding},
 | 
			
		||||
						{Name: names.VolumeZone},
 | 
			
		||||
						{Name: names.PodTopologySpread},
 | 
			
		||||
						{Name: names.InterPodAffinity},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				PostFilter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: names.DefaultPreemption},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				PreScore: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: names.InterPodAffinity},
 | 
			
		||||
						{Name: names.PodTopologySpread},
 | 
			
		||||
						{Name: names.TaintToleration},
 | 
			
		||||
						{Name: names.NodeAffinity},
 | 
			
		||||
						{Name: names.SelectorSpread},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Score: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: names.NodeResourcesBalancedAllocation, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
						{Name: names.ImageLocality, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
						{Name: names.InterPodAffinity, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
						{Name: names.NodeResourcesLeastAllocated, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
						{Name: names.NodeAffinity, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
						{Name: names.NodePreferAvoidPods, Weight: pointer.Int32Ptr(10000)},
 | 
			
		||||
						{Name: names.PodTopologySpread, Weight: pointer.Int32Ptr(2)},
 | 
			
		||||
						{Name: names.TaintToleration, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
						{Name: names.SelectorSpread, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Reserve: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: names.VolumeBinding},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				PreBind: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: names.VolumeBinding},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Bind: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: names.DefaultBinder},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, test := range tests {
 | 
			
		||||
		t.Run(test.name, func(t *testing.T) {
 | 
			
		||||
			for k, v := range test.features {
 | 
			
		||||
				defer featuregatetesting.SetFeatureGateDuringTest(t, feature.DefaultFeatureGate, k, v)()
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			gotConfig := getDefaultPlugins()
 | 
			
		||||
			if diff := cmp.Diff(test.wantConfig, gotConfig); diff != "" {
 | 
			
		||||
				t.Errorf("unexpected config diff (-want, +got): %s", diff)
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMergePlugins(t *testing.T) {
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		name            string
 | 
			
		||||
		customPlugins   *v1beta1.Plugins
 | 
			
		||||
		defaultPlugins  *v1beta1.Plugins
 | 
			
		||||
		expectedPlugins *v1beta1.Plugins
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			name: "AppendCustomPlugin",
 | 
			
		||||
			customPlugins: &v1beta1.Plugins{
 | 
			
		||||
				Filter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: "CustomPlugin"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			defaultPlugins: &v1beta1.Plugins{
 | 
			
		||||
				Filter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: "DefaultPlugin1"},
 | 
			
		||||
						{Name: "DefaultPlugin2"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			expectedPlugins: &v1beta1.Plugins{
 | 
			
		||||
				Filter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: "DefaultPlugin1"},
 | 
			
		||||
						{Name: "DefaultPlugin2"},
 | 
			
		||||
						{Name: "CustomPlugin"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "InsertAfterDefaultPlugins2",
 | 
			
		||||
			customPlugins: &v1beta1.Plugins{
 | 
			
		||||
				Filter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: "CustomPlugin"},
 | 
			
		||||
						{Name: "DefaultPlugin2"},
 | 
			
		||||
					},
 | 
			
		||||
					Disabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: "DefaultPlugin2"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			defaultPlugins: &v1beta1.Plugins{
 | 
			
		||||
				Filter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: "DefaultPlugin1"},
 | 
			
		||||
						{Name: "DefaultPlugin2"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			expectedPlugins: &v1beta1.Plugins{
 | 
			
		||||
				Filter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: "DefaultPlugin1"},
 | 
			
		||||
						{Name: "CustomPlugin"},
 | 
			
		||||
						{Name: "DefaultPlugin2"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "InsertBeforeAllPlugins",
 | 
			
		||||
			customPlugins: &v1beta1.Plugins{
 | 
			
		||||
				Filter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: "CustomPlugin"},
 | 
			
		||||
						{Name: "DefaultPlugin1"},
 | 
			
		||||
						{Name: "DefaultPlugin2"},
 | 
			
		||||
					},
 | 
			
		||||
					Disabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: "*"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			defaultPlugins: &v1beta1.Plugins{
 | 
			
		||||
				Filter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: "DefaultPlugin1"},
 | 
			
		||||
						{Name: "DefaultPlugin2"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			expectedPlugins: &v1beta1.Plugins{
 | 
			
		||||
				Filter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: "CustomPlugin"},
 | 
			
		||||
						{Name: "DefaultPlugin1"},
 | 
			
		||||
						{Name: "DefaultPlugin2"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "ReorderDefaultPlugins",
 | 
			
		||||
			customPlugins: &v1beta1.Plugins{
 | 
			
		||||
				Filter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: "DefaultPlugin2"},
 | 
			
		||||
						{Name: "DefaultPlugin1"},
 | 
			
		||||
					},
 | 
			
		||||
					Disabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: "*"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			defaultPlugins: &v1beta1.Plugins{
 | 
			
		||||
				Filter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: "DefaultPlugin1"},
 | 
			
		||||
						{Name: "DefaultPlugin2"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			expectedPlugins: &v1beta1.Plugins{
 | 
			
		||||
				Filter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: "DefaultPlugin2"},
 | 
			
		||||
						{Name: "DefaultPlugin1"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:          "ApplyNilCustomPlugin",
 | 
			
		||||
			customPlugins: nil,
 | 
			
		||||
			defaultPlugins: &v1beta1.Plugins{
 | 
			
		||||
				Filter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: "DefaultPlugin1"},
 | 
			
		||||
						{Name: "DefaultPlugin2"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			expectedPlugins: &v1beta1.Plugins{
 | 
			
		||||
				Filter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: "DefaultPlugin1"},
 | 
			
		||||
						{Name: "DefaultPlugin2"},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, test := range tests {
 | 
			
		||||
		t.Run(test.name, func(t *testing.T) {
 | 
			
		||||
			test.defaultPlugins = mergePlugins(test.defaultPlugins, test.customPlugins)
 | 
			
		||||
			if d := cmp.Diff(test.expectedPlugins, test.defaultPlugins); d != "" {
 | 
			
		||||
				t.Fatalf("plugins mismatch (-want +got):\n%s", d)
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -1,291 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2020 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 v1beta1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	corev1 "k8s.io/api/core/v1"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/util/sets"
 | 
			
		||||
	"k8s.io/apiserver/pkg/util/feature"
 | 
			
		||||
	componentbaseconfigv1alpha1 "k8s.io/component-base/config/v1alpha1"
 | 
			
		||||
	"k8s.io/kube-scheduler/config/v1beta1"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/features"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config"
 | 
			
		||||
	"k8s.io/utils/pointer"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var defaultResourceSpec = []v1beta1.ResourceSpec{
 | 
			
		||||
	{Name: string(corev1.ResourceCPU), Weight: 1},
 | 
			
		||||
	{Name: string(corev1.ResourceMemory), Weight: 1},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func addDefaultingFuncs(scheme *runtime.Scheme) error {
 | 
			
		||||
	return RegisterDefaults(scheme)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func pluginsNames(p *v1beta1.Plugins) []string {
 | 
			
		||||
	if p == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	extensions := []*v1beta1.PluginSet{
 | 
			
		||||
		p.PreFilter,
 | 
			
		||||
		p.Filter,
 | 
			
		||||
		p.PostFilter,
 | 
			
		||||
		p.Reserve,
 | 
			
		||||
		p.PreScore,
 | 
			
		||||
		p.Score,
 | 
			
		||||
		p.PreBind,
 | 
			
		||||
		p.Bind,
 | 
			
		||||
		p.PostBind,
 | 
			
		||||
		p.Permit,
 | 
			
		||||
		p.QueueSort,
 | 
			
		||||
	}
 | 
			
		||||
	n := sets.NewString()
 | 
			
		||||
	for _, e := range extensions {
 | 
			
		||||
		if e != nil {
 | 
			
		||||
			for _, pg := range e.Enabled {
 | 
			
		||||
				n.Insert(pg.Name)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return n.List()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func setDefaults_KubeSchedulerProfile(prof *v1beta1.KubeSchedulerProfile) {
 | 
			
		||||
	// Set default plugins.
 | 
			
		||||
	prof.Plugins = mergePlugins(getDefaultPlugins(), prof.Plugins)
 | 
			
		||||
 | 
			
		||||
	// Set default plugin configs.
 | 
			
		||||
	scheme := getPluginArgConversionScheme()
 | 
			
		||||
	existingConfigs := sets.NewString()
 | 
			
		||||
	for j := range prof.PluginConfig {
 | 
			
		||||
		existingConfigs.Insert(prof.PluginConfig[j].Name)
 | 
			
		||||
		args := prof.PluginConfig[j].Args.Object
 | 
			
		||||
		if _, isUnknown := args.(*runtime.Unknown); isUnknown {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		scheme.Default(args)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Append default configs for plugins that didn't have one explicitly set.
 | 
			
		||||
	for _, name := range pluginsNames(prof.Plugins) {
 | 
			
		||||
		if existingConfigs.Has(name) {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		gvk := v1beta1.SchemeGroupVersion.WithKind(name + "Args")
 | 
			
		||||
		args, err := scheme.New(gvk)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			// This plugin is out-of-tree or doesn't require configuration.
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		scheme.Default(args)
 | 
			
		||||
		args.GetObjectKind().SetGroupVersionKind(gvk)
 | 
			
		||||
		prof.PluginConfig = append(prof.PluginConfig, v1beta1.PluginConfig{
 | 
			
		||||
			Name: name,
 | 
			
		||||
			Args: runtime.RawExtension{Object: args},
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetDefaults_KubeSchedulerConfiguration sets additional defaults
 | 
			
		||||
func SetDefaults_KubeSchedulerConfiguration(obj *v1beta1.KubeSchedulerConfiguration) {
 | 
			
		||||
	if obj.Parallelism == nil {
 | 
			
		||||
		obj.Parallelism = pointer.Int32Ptr(16)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(obj.Profiles) == 0 {
 | 
			
		||||
		obj.Profiles = append(obj.Profiles, v1beta1.KubeSchedulerProfile{})
 | 
			
		||||
	}
 | 
			
		||||
	// Only apply a default scheduler name when there is a single profile.
 | 
			
		||||
	// Validation will ensure that every profile has a non-empty unique name.
 | 
			
		||||
	if len(obj.Profiles) == 1 && obj.Profiles[0].SchedulerName == nil {
 | 
			
		||||
		obj.Profiles[0].SchedulerName = pointer.StringPtr(corev1.DefaultSchedulerName)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Add the default set of plugins and apply the configuration.
 | 
			
		||||
	for i := range obj.Profiles {
 | 
			
		||||
		prof := &obj.Profiles[i]
 | 
			
		||||
		setDefaults_KubeSchedulerProfile(prof)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if obj.PercentageOfNodesToScore == nil {
 | 
			
		||||
		percentageOfNodesToScore := int32(config.DefaultPercentageOfNodesToScore)
 | 
			
		||||
		obj.PercentageOfNodesToScore = &percentageOfNodesToScore
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(obj.LeaderElection.ResourceLock) == 0 {
 | 
			
		||||
		// Use lease-based leader election to reduce cost.
 | 
			
		||||
		// We migrated for EndpointsLease lock in 1.17 and starting in 1.20 we
 | 
			
		||||
		// migrated to Lease lock.
 | 
			
		||||
		obj.LeaderElection.ResourceLock = "leases"
 | 
			
		||||
	}
 | 
			
		||||
	if len(obj.LeaderElection.ResourceNamespace) == 0 {
 | 
			
		||||
		obj.LeaderElection.ResourceNamespace = v1beta1.SchedulerDefaultLockObjectNamespace
 | 
			
		||||
	}
 | 
			
		||||
	if len(obj.LeaderElection.ResourceName) == 0 {
 | 
			
		||||
		obj.LeaderElection.ResourceName = v1beta1.SchedulerDefaultLockObjectName
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(obj.ClientConnection.ContentType) == 0 {
 | 
			
		||||
		obj.ClientConnection.ContentType = "application/vnd.kubernetes.protobuf"
 | 
			
		||||
	}
 | 
			
		||||
	// Scheduler has an opinion about QPS/Burst, setting specific defaults for itself, instead of generic settings.
 | 
			
		||||
	if obj.ClientConnection.QPS == 0.0 {
 | 
			
		||||
		obj.ClientConnection.QPS = 50.0
 | 
			
		||||
	}
 | 
			
		||||
	if obj.ClientConnection.Burst == 0 {
 | 
			
		||||
		obj.ClientConnection.Burst = 100
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Use the default LeaderElectionConfiguration options
 | 
			
		||||
	componentbaseconfigv1alpha1.RecommendedDefaultLeaderElectionConfiguration(&obj.LeaderElection)
 | 
			
		||||
 | 
			
		||||
	if obj.PodInitialBackoffSeconds == nil {
 | 
			
		||||
		val := int64(1)
 | 
			
		||||
		obj.PodInitialBackoffSeconds = &val
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if obj.PodMaxBackoffSeconds == nil {
 | 
			
		||||
		val := int64(10)
 | 
			
		||||
		obj.PodMaxBackoffSeconds = &val
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Enable profiling by default in the scheduler
 | 
			
		||||
	if obj.EnableProfiling == nil {
 | 
			
		||||
		enableProfiling := true
 | 
			
		||||
		obj.EnableProfiling = &enableProfiling
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Enable contention profiling by default if profiling is enabled
 | 
			
		||||
	if *obj.EnableProfiling && obj.EnableContentionProfiling == nil {
 | 
			
		||||
		enableContentionProfiling := true
 | 
			
		||||
		obj.EnableContentionProfiling = &enableContentionProfiling
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetDefaults_DefaultPreemptionArgs(obj *v1beta1.DefaultPreemptionArgs) {
 | 
			
		||||
	if obj.MinCandidateNodesPercentage == nil {
 | 
			
		||||
		obj.MinCandidateNodesPercentage = pointer.Int32Ptr(10)
 | 
			
		||||
	}
 | 
			
		||||
	if obj.MinCandidateNodesAbsolute == nil {
 | 
			
		||||
		obj.MinCandidateNodesAbsolute = pointer.Int32Ptr(100)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetDefaults_InterPodAffinityArgs(obj *v1beta1.InterPodAffinityArgs) {
 | 
			
		||||
	// Note that an object is created manually in cmd/kube-scheduler/app/options/deprecated.go
 | 
			
		||||
	// DeprecatedOptions#ApplyTo.
 | 
			
		||||
	// Update that object if a new default field is added here.
 | 
			
		||||
	if obj.HardPodAffinityWeight == nil {
 | 
			
		||||
		obj.HardPodAffinityWeight = pointer.Int32Ptr(1)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetDefaults_NodeResourcesLeastAllocatedArgs(obj *v1beta1.NodeResourcesLeastAllocatedArgs) {
 | 
			
		||||
	if len(obj.Resources) == 0 {
 | 
			
		||||
		// If no resources specified, used the default set.
 | 
			
		||||
		obj.Resources = append(obj.Resources, defaultResourceSpec...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetDefaults_NodeResourcesMostAllocatedArgs(obj *v1beta1.NodeResourcesMostAllocatedArgs) {
 | 
			
		||||
	if len(obj.Resources) == 0 {
 | 
			
		||||
		// If no resources specified, used the default set.
 | 
			
		||||
		obj.Resources = append(obj.Resources, defaultResourceSpec...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetDefaults_RequestedToCapacityRatioArgs(obj *v1beta1.RequestedToCapacityRatioArgs) {
 | 
			
		||||
	if len(obj.Resources) == 0 {
 | 
			
		||||
		// If no resources specified, used the default set.
 | 
			
		||||
		obj.Resources = append(obj.Resources, defaultResourceSpec...)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If resource weight is 0, use default weight(1) instead.
 | 
			
		||||
	for i := range obj.Resources {
 | 
			
		||||
		if obj.Resources[i].Weight == 0 {
 | 
			
		||||
			obj.Resources[i].Weight = 1
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetDefaults_VolumeBindingArgs(obj *v1beta1.VolumeBindingArgs) {
 | 
			
		||||
	if obj.BindTimeoutSeconds == nil {
 | 
			
		||||
		obj.BindTimeoutSeconds = pointer.Int64Ptr(600)
 | 
			
		||||
	}
 | 
			
		||||
	if len(obj.Shape) == 0 && feature.DefaultFeatureGate.Enabled(features.VolumeCapacityPriority) {
 | 
			
		||||
		obj.Shape = []v1beta1.UtilizationShapePoint{
 | 
			
		||||
			{
 | 
			
		||||
				Utilization: 0,
 | 
			
		||||
				Score:       0,
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				Utilization: 100,
 | 
			
		||||
				Score:       int32(config.MaxCustomPriorityScore),
 | 
			
		||||
			},
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetDefaults_NodeResourcesBalancedAllocationArgs(obj *v1beta1.NodeResourcesBalancedAllocationArgs) {
 | 
			
		||||
	if len(obj.Resources) == 0 {
 | 
			
		||||
		obj.Resources = append(obj.Resources,
 | 
			
		||||
			v1beta1.ResourceSpec{Name: string(corev1.ResourceCPU), Weight: 1},
 | 
			
		||||
			v1beta1.ResourceSpec{Name: string(corev1.ResourceMemory), Weight: 1},
 | 
			
		||||
		)
 | 
			
		||||
	}
 | 
			
		||||
	// If the weight is not set or it is explicitly set to 0, then apply the default weight(1) instead.
 | 
			
		||||
	for i := range obj.Resources {
 | 
			
		||||
		if obj.Resources[i].Weight == 0 {
 | 
			
		||||
			obj.Resources[i].Weight = 1
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetDefaults_PodTopologySpreadArgs(obj *v1beta1.PodTopologySpreadArgs) {
 | 
			
		||||
	if feature.DefaultFeatureGate.Enabled(features.DefaultPodTopologySpread) {
 | 
			
		||||
		if obj.DefaultingType == "" {
 | 
			
		||||
			if len(obj.DefaultConstraints) != 0 {
 | 
			
		||||
				obj.DefaultingType = v1beta1.ListDefaulting
 | 
			
		||||
			} else {
 | 
			
		||||
				obj.DefaultingType = v1beta1.SystemDefaulting
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if obj.DefaultingType == "" {
 | 
			
		||||
		obj.DefaultingType = v1beta1.ListDefaulting
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetDefaults_NodeResourcesFitArgs(obj *v1beta1.NodeResourcesFitArgs) {
 | 
			
		||||
	if obj.ScoringStrategy == nil {
 | 
			
		||||
		obj.ScoringStrategy = &v1beta1.ScoringStrategy{
 | 
			
		||||
			Type:      v1beta1.ScoringStrategyType(config.LeastAllocated),
 | 
			
		||||
			Resources: defaultResourceSpec,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if len(obj.ScoringStrategy.Resources) == 0 {
 | 
			
		||||
		// If no resources specified, use the default set.
 | 
			
		||||
		obj.ScoringStrategy.Resources = append(obj.ScoringStrategy.Resources, defaultResourceSpec...)
 | 
			
		||||
	}
 | 
			
		||||
	for i := range obj.ScoringStrategy.Resources {
 | 
			
		||||
		if obj.ScoringStrategy.Resources[i].Weight == 0 {
 | 
			
		||||
			obj.ScoringStrategy.Resources[i].Weight = 1
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -1,727 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2020 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 v1beta1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/google/go-cmp/cmp"
 | 
			
		||||
	v1 "k8s.io/api/core/v1"
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
 | 
			
		||||
	"k8s.io/apiserver/pkg/util/feature"
 | 
			
		||||
	componentbaseconfig "k8s.io/component-base/config/v1alpha1"
 | 
			
		||||
	"k8s.io/component-base/featuregate"
 | 
			
		||||
	featuregatetesting "k8s.io/component-base/featuregate/testing"
 | 
			
		||||
	"k8s.io/kube-scheduler/config/v1beta1"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/features"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/framework/plugins/names"
 | 
			
		||||
	"k8s.io/utils/pointer"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var pluginConfigs = []v1beta1.PluginConfig{
 | 
			
		||||
	{
 | 
			
		||||
		Name: "DefaultPreemption",
 | 
			
		||||
		Args: runtime.RawExtension{
 | 
			
		||||
			Object: &v1beta1.DefaultPreemptionArgs{
 | 
			
		||||
				TypeMeta: metav1.TypeMeta{
 | 
			
		||||
					Kind:       "DefaultPreemptionArgs",
 | 
			
		||||
					APIVersion: "kubescheduler.config.k8s.io/v1beta1",
 | 
			
		||||
				},
 | 
			
		||||
				MinCandidateNodesPercentage: pointer.Int32Ptr(10),
 | 
			
		||||
				MinCandidateNodesAbsolute:   pointer.Int32Ptr(100),
 | 
			
		||||
			}},
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		Name: "InterPodAffinity",
 | 
			
		||||
		Args: runtime.RawExtension{
 | 
			
		||||
			Object: &v1beta1.InterPodAffinityArgs{
 | 
			
		||||
				TypeMeta: metav1.TypeMeta{
 | 
			
		||||
					Kind:       "InterPodAffinityArgs",
 | 
			
		||||
					APIVersion: "kubescheduler.config.k8s.io/v1beta1",
 | 
			
		||||
				},
 | 
			
		||||
				HardPodAffinityWeight: pointer.Int32Ptr(1),
 | 
			
		||||
			}},
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		Name: "NodeAffinity",
 | 
			
		||||
		Args: runtime.RawExtension{Object: &v1beta1.NodeAffinityArgs{
 | 
			
		||||
			TypeMeta: metav1.TypeMeta{
 | 
			
		||||
				Kind:       "NodeAffinityArgs",
 | 
			
		||||
				APIVersion: "kubescheduler.config.k8s.io/v1beta1",
 | 
			
		||||
			},
 | 
			
		||||
		}},
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		Name: "NodeResourcesBalancedAllocation",
 | 
			
		||||
		Args: runtime.RawExtension{Object: &v1beta1.NodeResourcesBalancedAllocationArgs{
 | 
			
		||||
			TypeMeta: metav1.TypeMeta{
 | 
			
		||||
				Kind:       "NodeResourcesBalancedAllocationArgs",
 | 
			
		||||
				APIVersion: "kubescheduler.config.k8s.io/v1beta1",
 | 
			
		||||
			},
 | 
			
		||||
			Resources: []v1beta1.ResourceSpec{{Name: "cpu", Weight: 1}, {Name: "memory", Weight: 1}},
 | 
			
		||||
		}},
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		Name: "NodeResourcesFit",
 | 
			
		||||
		Args: runtime.RawExtension{Object: &v1beta1.NodeResourcesFitArgs{
 | 
			
		||||
			TypeMeta: metav1.TypeMeta{
 | 
			
		||||
				Kind:       "NodeResourcesFitArgs",
 | 
			
		||||
				APIVersion: "kubescheduler.config.k8s.io/v1beta1",
 | 
			
		||||
			},
 | 
			
		||||
			ScoringStrategy: &v1beta1.ScoringStrategy{
 | 
			
		||||
				Type:      v1beta1.LeastAllocated,
 | 
			
		||||
				Resources: []v1beta1.ResourceSpec{{Name: "cpu", Weight: 1}, {Name: "memory", Weight: 1}},
 | 
			
		||||
			},
 | 
			
		||||
		}},
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		Name: "NodeResourcesLeastAllocated",
 | 
			
		||||
		Args: runtime.RawExtension{Object: &v1beta1.NodeResourcesLeastAllocatedArgs{
 | 
			
		||||
			TypeMeta: metav1.TypeMeta{
 | 
			
		||||
				Kind:       "NodeResourcesLeastAllocatedArgs",
 | 
			
		||||
				APIVersion: "kubescheduler.config.k8s.io/v1beta1",
 | 
			
		||||
			},
 | 
			
		||||
			Resources: []v1beta1.ResourceSpec{{Name: "cpu", Weight: 1}, {Name: "memory", Weight: 1}},
 | 
			
		||||
		}},
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		Name: "PodTopologySpread",
 | 
			
		||||
		Args: runtime.RawExtension{Object: &v1beta1.PodTopologySpreadArgs{
 | 
			
		||||
			TypeMeta: metav1.TypeMeta{
 | 
			
		||||
				Kind:       "PodTopologySpreadArgs",
 | 
			
		||||
				APIVersion: "kubescheduler.config.k8s.io/v1beta1",
 | 
			
		||||
			},
 | 
			
		||||
			DefaultingType: v1beta1.SystemDefaulting,
 | 
			
		||||
		}},
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		Name: "VolumeBinding",
 | 
			
		||||
		Args: runtime.RawExtension{Object: &v1beta1.VolumeBindingArgs{
 | 
			
		||||
			TypeMeta: metav1.TypeMeta{
 | 
			
		||||
				Kind:       "VolumeBindingArgs",
 | 
			
		||||
				APIVersion: "kubescheduler.config.k8s.io/v1beta1",
 | 
			
		||||
			},
 | 
			
		||||
			BindTimeoutSeconds: pointer.Int64Ptr(600),
 | 
			
		||||
		}},
 | 
			
		||||
	},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestSchedulerDefaults(t *testing.T) {
 | 
			
		||||
	enable := true
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		name     string
 | 
			
		||||
		config   *v1beta1.KubeSchedulerConfiguration
 | 
			
		||||
		expected *v1beta1.KubeSchedulerConfiguration
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			name:   "empty config",
 | 
			
		||||
			config: &v1beta1.KubeSchedulerConfiguration{},
 | 
			
		||||
			expected: &v1beta1.KubeSchedulerConfiguration{
 | 
			
		||||
				Parallelism: pointer.Int32Ptr(16),
 | 
			
		||||
				DebuggingConfiguration: componentbaseconfig.DebuggingConfiguration{
 | 
			
		||||
					EnableProfiling:           &enable,
 | 
			
		||||
					EnableContentionProfiling: &enable,
 | 
			
		||||
				},
 | 
			
		||||
				LeaderElection: componentbaseconfig.LeaderElectionConfiguration{
 | 
			
		||||
					LeaderElect:       pointer.BoolPtr(true),
 | 
			
		||||
					LeaseDuration:     metav1.Duration{Duration: 15 * time.Second},
 | 
			
		||||
					RenewDeadline:     metav1.Duration{Duration: 10 * time.Second},
 | 
			
		||||
					RetryPeriod:       metav1.Duration{Duration: 2 * time.Second},
 | 
			
		||||
					ResourceLock:      "leases",
 | 
			
		||||
					ResourceNamespace: "kube-system",
 | 
			
		||||
					ResourceName:      "kube-scheduler",
 | 
			
		||||
				},
 | 
			
		||||
				ClientConnection: componentbaseconfig.ClientConnectionConfiguration{
 | 
			
		||||
					QPS:         50,
 | 
			
		||||
					Burst:       100,
 | 
			
		||||
					ContentType: "application/vnd.kubernetes.protobuf",
 | 
			
		||||
				},
 | 
			
		||||
				PercentageOfNodesToScore: pointer.Int32Ptr(0),
 | 
			
		||||
				PodInitialBackoffSeconds: pointer.Int64Ptr(1),
 | 
			
		||||
				PodMaxBackoffSeconds:     pointer.Int64Ptr(10),
 | 
			
		||||
				Profiles: []v1beta1.KubeSchedulerProfile{
 | 
			
		||||
					{
 | 
			
		||||
						SchedulerName: pointer.StringPtr("default-scheduler"),
 | 
			
		||||
						Plugins:       getDefaultPlugins(),
 | 
			
		||||
						PluginConfig:  pluginConfigs,
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "no scheduler name",
 | 
			
		||||
			config: &v1beta1.KubeSchedulerConfiguration{
 | 
			
		||||
				Profiles: []v1beta1.KubeSchedulerProfile{{}},
 | 
			
		||||
			},
 | 
			
		||||
			expected: &v1beta1.KubeSchedulerConfiguration{
 | 
			
		||||
				Parallelism: pointer.Int32Ptr(16),
 | 
			
		||||
				DebuggingConfiguration: componentbaseconfig.DebuggingConfiguration{
 | 
			
		||||
					EnableProfiling:           &enable,
 | 
			
		||||
					EnableContentionProfiling: &enable,
 | 
			
		||||
				},
 | 
			
		||||
				LeaderElection: componentbaseconfig.LeaderElectionConfiguration{
 | 
			
		||||
					LeaderElect:       pointer.BoolPtr(true),
 | 
			
		||||
					LeaseDuration:     metav1.Duration{Duration: 15 * time.Second},
 | 
			
		||||
					RenewDeadline:     metav1.Duration{Duration: 10 * time.Second},
 | 
			
		||||
					RetryPeriod:       metav1.Duration{Duration: 2 * time.Second},
 | 
			
		||||
					ResourceLock:      "leases",
 | 
			
		||||
					ResourceNamespace: "kube-system",
 | 
			
		||||
					ResourceName:      "kube-scheduler",
 | 
			
		||||
				},
 | 
			
		||||
				ClientConnection: componentbaseconfig.ClientConnectionConfiguration{
 | 
			
		||||
					QPS:         50,
 | 
			
		||||
					Burst:       100,
 | 
			
		||||
					ContentType: "application/vnd.kubernetes.protobuf",
 | 
			
		||||
				},
 | 
			
		||||
				PercentageOfNodesToScore: pointer.Int32Ptr(0),
 | 
			
		||||
				PodInitialBackoffSeconds: pointer.Int64Ptr(1),
 | 
			
		||||
				PodMaxBackoffSeconds:     pointer.Int64Ptr(10),
 | 
			
		||||
				Profiles: []v1beta1.KubeSchedulerProfile{
 | 
			
		||||
					{
 | 
			
		||||
						SchedulerName: pointer.StringPtr("default-scheduler"),
 | 
			
		||||
						Plugins:       getDefaultPlugins(),
 | 
			
		||||
						PluginConfig:  pluginConfigs,
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "two profiles",
 | 
			
		||||
			config: &v1beta1.KubeSchedulerConfiguration{
 | 
			
		||||
				Parallelism: pointer.Int32Ptr(16),
 | 
			
		||||
				Profiles: []v1beta1.KubeSchedulerProfile{
 | 
			
		||||
					{
 | 
			
		||||
						PluginConfig: []v1beta1.PluginConfig{
 | 
			
		||||
							{Name: "FooPlugin"},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						SchedulerName: pointer.StringPtr("custom-scheduler"),
 | 
			
		||||
						Plugins: &v1beta1.Plugins{
 | 
			
		||||
							Bind: &v1beta1.PluginSet{
 | 
			
		||||
								Enabled: []v1beta1.Plugin{
 | 
			
		||||
									{Name: "BarPlugin"},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			expected: &v1beta1.KubeSchedulerConfiguration{
 | 
			
		||||
				Parallelism: pointer.Int32Ptr(16),
 | 
			
		||||
				DebuggingConfiguration: componentbaseconfig.DebuggingConfiguration{
 | 
			
		||||
					EnableProfiling:           &enable,
 | 
			
		||||
					EnableContentionProfiling: &enable,
 | 
			
		||||
				},
 | 
			
		||||
				LeaderElection: componentbaseconfig.LeaderElectionConfiguration{
 | 
			
		||||
					LeaderElect:       pointer.BoolPtr(true),
 | 
			
		||||
					LeaseDuration:     metav1.Duration{Duration: 15 * time.Second},
 | 
			
		||||
					RenewDeadline:     metav1.Duration{Duration: 10 * time.Second},
 | 
			
		||||
					RetryPeriod:       metav1.Duration{Duration: 2 * time.Second},
 | 
			
		||||
					ResourceLock:      "leases",
 | 
			
		||||
					ResourceNamespace: "kube-system",
 | 
			
		||||
					ResourceName:      "kube-scheduler",
 | 
			
		||||
				},
 | 
			
		||||
				ClientConnection: componentbaseconfig.ClientConnectionConfiguration{
 | 
			
		||||
					QPS:         50,
 | 
			
		||||
					Burst:       100,
 | 
			
		||||
					ContentType: "application/vnd.kubernetes.protobuf",
 | 
			
		||||
				},
 | 
			
		||||
				PercentageOfNodesToScore: pointer.Int32Ptr(0),
 | 
			
		||||
				PodInitialBackoffSeconds: pointer.Int64Ptr(1),
 | 
			
		||||
				PodMaxBackoffSeconds:     pointer.Int64Ptr(10),
 | 
			
		||||
				Profiles: []v1beta1.KubeSchedulerProfile{
 | 
			
		||||
					{
 | 
			
		||||
						Plugins: getDefaultPlugins(),
 | 
			
		||||
						PluginConfig: []v1beta1.PluginConfig{
 | 
			
		||||
							{Name: "FooPlugin"},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "DefaultPreemption",
 | 
			
		||||
								Args: runtime.RawExtension{
 | 
			
		||||
									Object: &v1beta1.DefaultPreemptionArgs{
 | 
			
		||||
										TypeMeta: metav1.TypeMeta{
 | 
			
		||||
											Kind:       "DefaultPreemptionArgs",
 | 
			
		||||
											APIVersion: "kubescheduler.config.k8s.io/v1beta1",
 | 
			
		||||
										},
 | 
			
		||||
										MinCandidateNodesPercentage: pointer.Int32Ptr(10),
 | 
			
		||||
										MinCandidateNodesAbsolute:   pointer.Int32Ptr(100),
 | 
			
		||||
									}},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "InterPodAffinity",
 | 
			
		||||
								Args: runtime.RawExtension{
 | 
			
		||||
									Object: &v1beta1.InterPodAffinityArgs{
 | 
			
		||||
										TypeMeta: metav1.TypeMeta{
 | 
			
		||||
											Kind:       "InterPodAffinityArgs",
 | 
			
		||||
											APIVersion: "kubescheduler.config.k8s.io/v1beta1",
 | 
			
		||||
										},
 | 
			
		||||
										HardPodAffinityWeight: pointer.Int32Ptr(1),
 | 
			
		||||
									}},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "NodeAffinity",
 | 
			
		||||
								Args: runtime.RawExtension{Object: &v1beta1.NodeAffinityArgs{
 | 
			
		||||
									TypeMeta: metav1.TypeMeta{
 | 
			
		||||
										Kind:       "NodeAffinityArgs",
 | 
			
		||||
										APIVersion: "kubescheduler.config.k8s.io/v1beta1",
 | 
			
		||||
									},
 | 
			
		||||
								}},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "NodeResourcesBalancedAllocation",
 | 
			
		||||
								Args: runtime.RawExtension{Object: &v1beta1.NodeResourcesBalancedAllocationArgs{
 | 
			
		||||
									TypeMeta: metav1.TypeMeta{
 | 
			
		||||
										Kind:       "NodeResourcesBalancedAllocationArgs",
 | 
			
		||||
										APIVersion: "kubescheduler.config.k8s.io/v1beta1",
 | 
			
		||||
									},
 | 
			
		||||
									Resources: []v1beta1.ResourceSpec{{Name: "cpu", Weight: 1}, {Name: "memory", Weight: 1}},
 | 
			
		||||
								}},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "NodeResourcesFit",
 | 
			
		||||
								Args: runtime.RawExtension{Object: &v1beta1.NodeResourcesFitArgs{
 | 
			
		||||
									TypeMeta: metav1.TypeMeta{
 | 
			
		||||
										Kind:       "NodeResourcesFitArgs",
 | 
			
		||||
										APIVersion: "kubescheduler.config.k8s.io/v1beta1",
 | 
			
		||||
									},
 | 
			
		||||
									ScoringStrategy: &v1beta1.ScoringStrategy{
 | 
			
		||||
										Type:      v1beta1.LeastAllocated,
 | 
			
		||||
										Resources: []v1beta1.ResourceSpec{{Name: "cpu", Weight: 1}, {Name: "memory", Weight: 1}},
 | 
			
		||||
									},
 | 
			
		||||
								}},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "NodeResourcesLeastAllocated",
 | 
			
		||||
								Args: runtime.RawExtension{Object: &v1beta1.NodeResourcesLeastAllocatedArgs{
 | 
			
		||||
									TypeMeta: metav1.TypeMeta{
 | 
			
		||||
										Kind:       "NodeResourcesLeastAllocatedArgs",
 | 
			
		||||
										APIVersion: "kubescheduler.config.k8s.io/v1beta1",
 | 
			
		||||
									},
 | 
			
		||||
									Resources: []v1beta1.ResourceSpec{{Name: "cpu", Weight: 1}, {Name: "memory", Weight: 1}},
 | 
			
		||||
								}},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "PodTopologySpread",
 | 
			
		||||
								Args: runtime.RawExtension{Object: &v1beta1.PodTopologySpreadArgs{
 | 
			
		||||
									TypeMeta: metav1.TypeMeta{
 | 
			
		||||
										Kind:       "PodTopologySpreadArgs",
 | 
			
		||||
										APIVersion: "kubescheduler.config.k8s.io/v1beta1",
 | 
			
		||||
									},
 | 
			
		||||
									DefaultingType: v1beta1.SystemDefaulting,
 | 
			
		||||
								}},
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name: "VolumeBinding",
 | 
			
		||||
								Args: runtime.RawExtension{Object: &v1beta1.VolumeBindingArgs{
 | 
			
		||||
									TypeMeta: metav1.TypeMeta{
 | 
			
		||||
										Kind:       "VolumeBindingArgs",
 | 
			
		||||
										APIVersion: "kubescheduler.config.k8s.io/v1beta1",
 | 
			
		||||
									},
 | 
			
		||||
									BindTimeoutSeconds: pointer.Int64Ptr(600),
 | 
			
		||||
								}},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						SchedulerName: pointer.StringPtr("custom-scheduler"),
 | 
			
		||||
						Plugins: &v1beta1.Plugins{
 | 
			
		||||
							QueueSort: &v1beta1.PluginSet{
 | 
			
		||||
								Enabled: []v1beta1.Plugin{
 | 
			
		||||
									{Name: names.PrioritySort},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							PreFilter: &v1beta1.PluginSet{
 | 
			
		||||
								Enabled: []v1beta1.Plugin{
 | 
			
		||||
									{Name: names.NodeResourcesFit},
 | 
			
		||||
									{Name: names.NodePorts},
 | 
			
		||||
									{Name: names.VolumeRestrictions},
 | 
			
		||||
									{Name: names.PodTopologySpread},
 | 
			
		||||
									{Name: names.InterPodAffinity},
 | 
			
		||||
									{Name: names.VolumeBinding},
 | 
			
		||||
									{Name: names.NodeAffinity},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							Filter: &v1beta1.PluginSet{
 | 
			
		||||
								Enabled: []v1beta1.Plugin{
 | 
			
		||||
									{Name: names.NodeUnschedulable},
 | 
			
		||||
									{Name: names.NodeName},
 | 
			
		||||
									{Name: names.TaintToleration},
 | 
			
		||||
									{Name: names.NodeAffinity},
 | 
			
		||||
									{Name: names.NodePorts},
 | 
			
		||||
									{Name: names.NodeResourcesFit},
 | 
			
		||||
									{Name: names.VolumeRestrictions},
 | 
			
		||||
									{Name: names.EBSLimits},
 | 
			
		||||
									{Name: names.GCEPDLimits},
 | 
			
		||||
									{Name: names.NodeVolumeLimits},
 | 
			
		||||
									{Name: names.AzureDiskLimits},
 | 
			
		||||
									{Name: names.VolumeBinding},
 | 
			
		||||
									{Name: names.VolumeZone},
 | 
			
		||||
									{Name: names.PodTopologySpread},
 | 
			
		||||
									{Name: names.InterPodAffinity},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							PostFilter: &v1beta1.PluginSet{
 | 
			
		||||
								Enabled: []v1beta1.Plugin{
 | 
			
		||||
									{Name: names.DefaultPreemption},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							PreScore: &v1beta1.PluginSet{
 | 
			
		||||
								Enabled: []v1beta1.Plugin{
 | 
			
		||||
									{Name: names.InterPodAffinity},
 | 
			
		||||
									{Name: names.PodTopologySpread},
 | 
			
		||||
									{Name: names.TaintToleration},
 | 
			
		||||
									{Name: names.NodeAffinity},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							Score: &v1beta1.PluginSet{
 | 
			
		||||
								Enabled: []v1beta1.Plugin{
 | 
			
		||||
									{Name: names.NodeResourcesBalancedAllocation, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
									{Name: names.ImageLocality, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
									{Name: names.InterPodAffinity, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
									{Name: names.NodeResourcesLeastAllocated, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
									{Name: names.NodeAffinity, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
									{Name: names.NodePreferAvoidPods, Weight: pointer.Int32Ptr(10000)},
 | 
			
		||||
									{Name: names.PodTopologySpread, Weight: pointer.Int32Ptr(2)},
 | 
			
		||||
									{Name: names.TaintToleration, Weight: pointer.Int32Ptr(1)},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							Reserve: &v1beta1.PluginSet{
 | 
			
		||||
								Enabled: []v1beta1.Plugin{
 | 
			
		||||
									{Name: names.VolumeBinding},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							PreBind: &v1beta1.PluginSet{
 | 
			
		||||
								Enabled: []v1beta1.Plugin{
 | 
			
		||||
									{Name: names.VolumeBinding},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
							Bind: &v1beta1.PluginSet{
 | 
			
		||||
								Enabled: []v1beta1.Plugin{
 | 
			
		||||
									{Name: names.DefaultBinder},
 | 
			
		||||
									{Name: "BarPlugin"},
 | 
			
		||||
								},
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
						PluginConfig: pluginConfigs,
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "set non default parallelism",
 | 
			
		||||
			config: &v1beta1.KubeSchedulerConfiguration{
 | 
			
		||||
				Parallelism: pointer.Int32Ptr(8),
 | 
			
		||||
			},
 | 
			
		||||
			expected: &v1beta1.KubeSchedulerConfiguration{
 | 
			
		||||
				Parallelism: pointer.Int32Ptr(8),
 | 
			
		||||
				DebuggingConfiguration: componentbaseconfig.DebuggingConfiguration{
 | 
			
		||||
					EnableProfiling:           &enable,
 | 
			
		||||
					EnableContentionProfiling: &enable,
 | 
			
		||||
				},
 | 
			
		||||
				LeaderElection: componentbaseconfig.LeaderElectionConfiguration{
 | 
			
		||||
					LeaderElect:       pointer.BoolPtr(true),
 | 
			
		||||
					LeaseDuration:     metav1.Duration{Duration: 15 * time.Second},
 | 
			
		||||
					RenewDeadline:     metav1.Duration{Duration: 10 * time.Second},
 | 
			
		||||
					RetryPeriod:       metav1.Duration{Duration: 2 * time.Second},
 | 
			
		||||
					ResourceLock:      "leases",
 | 
			
		||||
					ResourceNamespace: "kube-system",
 | 
			
		||||
					ResourceName:      "kube-scheduler",
 | 
			
		||||
				},
 | 
			
		||||
				ClientConnection: componentbaseconfig.ClientConnectionConfiguration{
 | 
			
		||||
					QPS:         50,
 | 
			
		||||
					Burst:       100,
 | 
			
		||||
					ContentType: "application/vnd.kubernetes.protobuf",
 | 
			
		||||
				},
 | 
			
		||||
				PercentageOfNodesToScore: pointer.Int32Ptr(0),
 | 
			
		||||
				PodInitialBackoffSeconds: pointer.Int64Ptr(1),
 | 
			
		||||
				PodMaxBackoffSeconds:     pointer.Int64Ptr(10),
 | 
			
		||||
				Profiles: []v1beta1.KubeSchedulerProfile{
 | 
			
		||||
					{
 | 
			
		||||
						SchedulerName: pointer.StringPtr("default-scheduler"),
 | 
			
		||||
						Plugins:       getDefaultPlugins(),
 | 
			
		||||
						PluginConfig:  pluginConfigs,
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	for _, tc := range tests {
 | 
			
		||||
		t.Run(tc.name, func(t *testing.T) {
 | 
			
		||||
			SetDefaults_KubeSchedulerConfiguration(tc.config)
 | 
			
		||||
			if diff := cmp.Diff(tc.expected, tc.config); diff != "" {
 | 
			
		||||
				t.Errorf("Got unexpected defaults (-want, +got):\n%s", diff)
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestPluginArgsDefaults(t *testing.T) {
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		name     string
 | 
			
		||||
		features map[featuregate.Feature]bool
 | 
			
		||||
		in       runtime.Object
 | 
			
		||||
		want     runtime.Object
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			name: "DefaultPreemptionArgs empty",
 | 
			
		||||
			in:   &v1beta1.DefaultPreemptionArgs{},
 | 
			
		||||
			want: &v1beta1.DefaultPreemptionArgs{
 | 
			
		||||
				MinCandidateNodesPercentage: pointer.Int32Ptr(10),
 | 
			
		||||
				MinCandidateNodesAbsolute:   pointer.Int32Ptr(100),
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "DefaultPreemptionArgs with value",
 | 
			
		||||
			in: &v1beta1.DefaultPreemptionArgs{
 | 
			
		||||
				MinCandidateNodesPercentage: pointer.Int32Ptr(50),
 | 
			
		||||
			},
 | 
			
		||||
			want: &v1beta1.DefaultPreemptionArgs{
 | 
			
		||||
				MinCandidateNodesPercentage: pointer.Int32Ptr(50),
 | 
			
		||||
				MinCandidateNodesAbsolute:   pointer.Int32Ptr(100),
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "InterPodAffinityArgs empty",
 | 
			
		||||
			in:   &v1beta1.InterPodAffinityArgs{},
 | 
			
		||||
			want: &v1beta1.InterPodAffinityArgs{
 | 
			
		||||
				HardPodAffinityWeight: pointer.Int32Ptr(1),
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "InterPodAffinityArgs explicit 0",
 | 
			
		||||
			in: &v1beta1.InterPodAffinityArgs{
 | 
			
		||||
				HardPodAffinityWeight: pointer.Int32Ptr(0),
 | 
			
		||||
			},
 | 
			
		||||
			want: &v1beta1.InterPodAffinityArgs{
 | 
			
		||||
				HardPodAffinityWeight: pointer.Int32Ptr(0),
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "InterPodAffinityArgs with value",
 | 
			
		||||
			in: &v1beta1.InterPodAffinityArgs{
 | 
			
		||||
				HardPodAffinityWeight: pointer.Int32Ptr(5),
 | 
			
		||||
			},
 | 
			
		||||
			want: &v1beta1.InterPodAffinityArgs{
 | 
			
		||||
				HardPodAffinityWeight: pointer.Int32Ptr(5),
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "NodeResourcesLeastAllocatedArgs resources empty",
 | 
			
		||||
			in:   &v1beta1.NodeResourcesLeastAllocatedArgs{},
 | 
			
		||||
			want: &v1beta1.NodeResourcesLeastAllocatedArgs{
 | 
			
		||||
				Resources: []v1beta1.ResourceSpec{
 | 
			
		||||
					{Name: "cpu", Weight: 1},
 | 
			
		||||
					{Name: "memory", Weight: 1},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "NodeResourcesLeastAllocatedArgs resources with value",
 | 
			
		||||
			in: &v1beta1.NodeResourcesLeastAllocatedArgs{
 | 
			
		||||
				Resources: []v1beta1.ResourceSpec{
 | 
			
		||||
					{Name: "resource", Weight: 2},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: &v1beta1.NodeResourcesLeastAllocatedArgs{
 | 
			
		||||
				Resources: []v1beta1.ResourceSpec{
 | 
			
		||||
					{Name: "resource", Weight: 2},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "NodeResourcesMostAllocatedArgs resources empty",
 | 
			
		||||
			in:   &v1beta1.NodeResourcesMostAllocatedArgs{},
 | 
			
		||||
			want: &v1beta1.NodeResourcesMostAllocatedArgs{
 | 
			
		||||
				Resources: []v1beta1.ResourceSpec{
 | 
			
		||||
					{Name: "cpu", Weight: 1},
 | 
			
		||||
					{Name: "memory", Weight: 1},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "NodeResourcesMostAllocatedArgs resources with value",
 | 
			
		||||
			in: &v1beta1.NodeResourcesMostAllocatedArgs{
 | 
			
		||||
				Resources: []v1beta1.ResourceSpec{
 | 
			
		||||
					{Name: "resource", Weight: 2},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: &v1beta1.NodeResourcesMostAllocatedArgs{
 | 
			
		||||
				Resources: []v1beta1.ResourceSpec{
 | 
			
		||||
					{Name: "resource", Weight: 2},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "NodeResourcesBalancedAllocationArgs resources empty",
 | 
			
		||||
			in:   &v1beta1.NodeResourcesBalancedAllocationArgs{},
 | 
			
		||||
			want: &v1beta1.NodeResourcesBalancedAllocationArgs{
 | 
			
		||||
				Resources: []v1beta1.ResourceSpec{
 | 
			
		||||
					{Name: "cpu", Weight: 1}, {Name: "memory", Weight: 1},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "NodeResourcesBalancedAllocationArgs with scalar resource",
 | 
			
		||||
			in: &v1beta1.NodeResourcesBalancedAllocationArgs{
 | 
			
		||||
				Resources: []v1beta1.ResourceSpec{
 | 
			
		||||
					{Name: "scalar.io/scalar1", Weight: 1},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: &v1beta1.NodeResourcesBalancedAllocationArgs{
 | 
			
		||||
				Resources: []v1beta1.ResourceSpec{
 | 
			
		||||
					{Name: "scalar.io/scalar1", Weight: 1},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "NodeResourcesBalancedAllocationArgs with mixed resources",
 | 
			
		||||
			in: &v1beta1.NodeResourcesBalancedAllocationArgs{
 | 
			
		||||
				Resources: []v1beta1.ResourceSpec{
 | 
			
		||||
					{Name: string(v1.ResourceCPU), Weight: 1},
 | 
			
		||||
					{Name: "scalar.io/scalar1", Weight: 1},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: &v1beta1.NodeResourcesBalancedAllocationArgs{
 | 
			
		||||
				Resources: []v1beta1.ResourceSpec{
 | 
			
		||||
					{Name: string(v1.ResourceCPU), Weight: 1},
 | 
			
		||||
					{Name: "scalar.io/scalar1", Weight: 1},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "NodeResourcesBalancedAllocationArgs have resource no weight",
 | 
			
		||||
			in: &v1beta1.NodeResourcesBalancedAllocationArgs{
 | 
			
		||||
				Resources: []v1beta1.ResourceSpec{
 | 
			
		||||
					{Name: string(v1.ResourceCPU)},
 | 
			
		||||
					{Name: "scalar.io/scalar0"},
 | 
			
		||||
					{Name: "scalar.io/scalar1", Weight: 1},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: &v1beta1.NodeResourcesBalancedAllocationArgs{
 | 
			
		||||
				Resources: []v1beta1.ResourceSpec{
 | 
			
		||||
					{Name: string(v1.ResourceCPU), Weight: 1},
 | 
			
		||||
					{Name: "scalar.io/scalar0", Weight: 1},
 | 
			
		||||
					{Name: "scalar.io/scalar1", Weight: 1},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "PodTopologySpreadArgs resources empty",
 | 
			
		||||
			in:   &v1beta1.PodTopologySpreadArgs{},
 | 
			
		||||
			want: &v1beta1.PodTopologySpreadArgs{
 | 
			
		||||
				DefaultingType: v1beta1.SystemDefaulting,
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "PodTopologySpreadArgs resources with value",
 | 
			
		||||
			in: &v1beta1.PodTopologySpreadArgs{
 | 
			
		||||
				DefaultConstraints: []v1.TopologySpreadConstraint{
 | 
			
		||||
					{
 | 
			
		||||
						TopologyKey:       "planet",
 | 
			
		||||
						WhenUnsatisfiable: v1.DoNotSchedule,
 | 
			
		||||
						MaxSkew:           2,
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: &v1beta1.PodTopologySpreadArgs{
 | 
			
		||||
				DefaultConstraints: []v1.TopologySpreadConstraint{
 | 
			
		||||
					{
 | 
			
		||||
						TopologyKey:       "planet",
 | 
			
		||||
						WhenUnsatisfiable: v1.DoNotSchedule,
 | 
			
		||||
						MaxSkew:           2,
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				// TODO(#94008): Make SystemDefaulting in v1beta2.
 | 
			
		||||
				DefaultingType: v1beta1.ListDefaulting,
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "PodTopologySpreadArgs empty, DefaultPodTopologySpread feature disabled",
 | 
			
		||||
			features: map[featuregate.Feature]bool{
 | 
			
		||||
				features.DefaultPodTopologySpread: false,
 | 
			
		||||
			},
 | 
			
		||||
			in: &v1beta1.PodTopologySpreadArgs{},
 | 
			
		||||
			want: &v1beta1.PodTopologySpreadArgs{
 | 
			
		||||
				DefaultingType: v1beta1.ListDefaulting,
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "NodeResourcesFitArgs not set",
 | 
			
		||||
			in:   &v1beta1.NodeResourcesFitArgs{},
 | 
			
		||||
			want: &v1beta1.NodeResourcesFitArgs{
 | 
			
		||||
				ScoringStrategy: &v1beta1.ScoringStrategy{
 | 
			
		||||
					Type:      v1beta1.LeastAllocated,
 | 
			
		||||
					Resources: defaultResourceSpec,
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "NodeResourcesFitArgs Resources empty",
 | 
			
		||||
			in: &v1beta1.NodeResourcesFitArgs{
 | 
			
		||||
				ScoringStrategy: &v1beta1.ScoringStrategy{
 | 
			
		||||
					Type: v1beta1.MostAllocated,
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: &v1beta1.NodeResourcesFitArgs{
 | 
			
		||||
				ScoringStrategy: &v1beta1.ScoringStrategy{
 | 
			
		||||
					Type:      v1beta1.MostAllocated,
 | 
			
		||||
					Resources: defaultResourceSpec,
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "VolumeBindingArgs empty, VolumeCapacityPriority disabled",
 | 
			
		||||
			features: map[featuregate.Feature]bool{
 | 
			
		||||
				features.VolumeCapacityPriority: false,
 | 
			
		||||
			},
 | 
			
		||||
			in: &v1beta1.VolumeBindingArgs{},
 | 
			
		||||
			want: &v1beta1.VolumeBindingArgs{
 | 
			
		||||
				BindTimeoutSeconds: pointer.Int64Ptr(600),
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "VolumeBindingArgs empty, VolumeCapacityPriority enabled",
 | 
			
		||||
			features: map[featuregate.Feature]bool{
 | 
			
		||||
				features.VolumeCapacityPriority: true,
 | 
			
		||||
			},
 | 
			
		||||
			in: &v1beta1.VolumeBindingArgs{},
 | 
			
		||||
			want: &v1beta1.VolumeBindingArgs{
 | 
			
		||||
				BindTimeoutSeconds: pointer.Int64Ptr(600),
 | 
			
		||||
				Shape: []v1beta1.UtilizationShapePoint{
 | 
			
		||||
					{Utilization: 0, Score: 0},
 | 
			
		||||
					{Utilization: 100, Score: 10},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	for _, tc := range tests {
 | 
			
		||||
		scheme := runtime.NewScheme()
 | 
			
		||||
		utilruntime.Must(AddToScheme(scheme))
 | 
			
		||||
		t.Run(tc.name, func(t *testing.T) {
 | 
			
		||||
			for k, v := range tc.features {
 | 
			
		||||
				defer featuregatetesting.SetFeatureGateDuringTest(t, feature.DefaultFeatureGate, k, v)()
 | 
			
		||||
			}
 | 
			
		||||
			scheme.Default(tc.in)
 | 
			
		||||
			if diff := cmp.Diff(tc.in, tc.want); diff != "" {
 | 
			
		||||
				t.Errorf("Got unexpected defaults (-want, +got):\n%s", diff)
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -1,24 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2020 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.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// +k8s:deepcopy-gen=package
 | 
			
		||||
// +k8s:conversion-gen=k8s.io/kubernetes/pkg/scheduler/apis/config
 | 
			
		||||
// +k8s:conversion-gen-external-types=k8s.io/kube-scheduler/config/v1beta1
 | 
			
		||||
// +k8s:defaulter-gen=TypeMeta
 | 
			
		||||
// +k8s:defaulter-gen-input=k8s.io/kube-scheduler/config/v1beta1
 | 
			
		||||
// +groupName=kubescheduler.config.k8s.io
 | 
			
		||||
 | 
			
		||||
package v1beta1 // import "k8s.io/kubernetes/pkg/scheduler/apis/config/v1beta1"
 | 
			
		||||
@@ -1,42 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2020 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 v1beta1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"k8s.io/kube-scheduler/config/v1beta1"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// GroupName is the group name used in this package
 | 
			
		||||
const GroupName = v1beta1.GroupName
 | 
			
		||||
 | 
			
		||||
// SchemeGroupVersion is group version used to register these objects
 | 
			
		||||
var SchemeGroupVersion = v1beta1.SchemeGroupVersion
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// localSchemeBuilder extends the SchemeBuilder instance with the external types. In this package,
 | 
			
		||||
	// defaulting and conversion init funcs are registered as well.
 | 
			
		||||
	localSchemeBuilder = &v1beta1.SchemeBuilder
 | 
			
		||||
	// AddToScheme is a global function that registers this API group & version to a scheme
 | 
			
		||||
	AddToScheme = localSchemeBuilder.AddToScheme
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	// We only register manually written functions here. The registration of the
 | 
			
		||||
	// generated functions takes place in the generated files. The separation
 | 
			
		||||
	// makes the code compile even when the generated files are missing.
 | 
			
		||||
	localSchemeBuilder.Register(addDefaultingFuncs)
 | 
			
		||||
}
 | 
			
		||||
@@ -1,970 +0,0 @@
 | 
			
		||||
//go:build !ignore_autogenerated
 | 
			
		||||
// +build !ignore_autogenerated
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Copyright 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.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// Code generated by conversion-gen. DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
package v1beta1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	unsafe "unsafe"
 | 
			
		||||
 | 
			
		||||
	corev1 "k8s.io/api/core/v1"
 | 
			
		||||
	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	conversion "k8s.io/apimachinery/pkg/conversion"
 | 
			
		||||
	runtime "k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
	v1alpha1 "k8s.io/component-base/config/v1alpha1"
 | 
			
		||||
	configv1 "k8s.io/kube-scheduler/config/v1"
 | 
			
		||||
	v1beta1 "k8s.io/kube-scheduler/config/v1beta1"
 | 
			
		||||
	config "k8s.io/kubernetes/pkg/scheduler/apis/config"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	localSchemeBuilder.Register(RegisterConversions)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RegisterConversions adds conversion functions to the given scheme.
 | 
			
		||||
// Public to allow building arbitrary schemes.
 | 
			
		||||
func RegisterConversions(s *runtime.Scheme) error {
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.DefaultPreemptionArgs)(nil), (*config.DefaultPreemptionArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_DefaultPreemptionArgs_To_config_DefaultPreemptionArgs(a.(*v1beta1.DefaultPreemptionArgs), b.(*config.DefaultPreemptionArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.DefaultPreemptionArgs)(nil), (*v1beta1.DefaultPreemptionArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_DefaultPreemptionArgs_To_v1beta1_DefaultPreemptionArgs(a.(*config.DefaultPreemptionArgs), b.(*v1beta1.DefaultPreemptionArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.Extender)(nil), (*config.Extender)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_Extender_To_config_Extender(a.(*v1beta1.Extender), b.(*config.Extender), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.Extender)(nil), (*v1beta1.Extender)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_Extender_To_v1beta1_Extender(a.(*config.Extender), b.(*v1beta1.Extender), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.InterPodAffinityArgs)(nil), (*config.InterPodAffinityArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_InterPodAffinityArgs_To_config_InterPodAffinityArgs(a.(*v1beta1.InterPodAffinityArgs), b.(*config.InterPodAffinityArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.InterPodAffinityArgs)(nil), (*v1beta1.InterPodAffinityArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_InterPodAffinityArgs_To_v1beta1_InterPodAffinityArgs(a.(*config.InterPodAffinityArgs), b.(*v1beta1.InterPodAffinityArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.KubeSchedulerProfile)(nil), (*config.KubeSchedulerProfile)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_KubeSchedulerProfile_To_config_KubeSchedulerProfile(a.(*v1beta1.KubeSchedulerProfile), b.(*config.KubeSchedulerProfile), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.KubeSchedulerProfile)(nil), (*v1beta1.KubeSchedulerProfile)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_KubeSchedulerProfile_To_v1beta1_KubeSchedulerProfile(a.(*config.KubeSchedulerProfile), b.(*v1beta1.KubeSchedulerProfile), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.NodeAffinityArgs)(nil), (*config.NodeAffinityArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_NodeAffinityArgs_To_config_NodeAffinityArgs(a.(*v1beta1.NodeAffinityArgs), b.(*config.NodeAffinityArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.NodeAffinityArgs)(nil), (*v1beta1.NodeAffinityArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_NodeAffinityArgs_To_v1beta1_NodeAffinityArgs(a.(*config.NodeAffinityArgs), b.(*v1beta1.NodeAffinityArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.NodeLabelArgs)(nil), (*config.NodeLabelArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_NodeLabelArgs_To_config_NodeLabelArgs(a.(*v1beta1.NodeLabelArgs), b.(*config.NodeLabelArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.NodeLabelArgs)(nil), (*v1beta1.NodeLabelArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_NodeLabelArgs_To_v1beta1_NodeLabelArgs(a.(*config.NodeLabelArgs), b.(*v1beta1.NodeLabelArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.NodeResourcesBalancedAllocationArgs)(nil), (*config.NodeResourcesBalancedAllocationArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_NodeResourcesBalancedAllocationArgs_To_config_NodeResourcesBalancedAllocationArgs(a.(*v1beta1.NodeResourcesBalancedAllocationArgs), b.(*config.NodeResourcesBalancedAllocationArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.NodeResourcesBalancedAllocationArgs)(nil), (*v1beta1.NodeResourcesBalancedAllocationArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_NodeResourcesBalancedAllocationArgs_To_v1beta1_NodeResourcesBalancedAllocationArgs(a.(*config.NodeResourcesBalancedAllocationArgs), b.(*v1beta1.NodeResourcesBalancedAllocationArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.NodeResourcesFitArgs)(nil), (*config.NodeResourcesFitArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_NodeResourcesFitArgs_To_config_NodeResourcesFitArgs(a.(*v1beta1.NodeResourcesFitArgs), b.(*config.NodeResourcesFitArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.NodeResourcesFitArgs)(nil), (*v1beta1.NodeResourcesFitArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_NodeResourcesFitArgs_To_v1beta1_NodeResourcesFitArgs(a.(*config.NodeResourcesFitArgs), b.(*v1beta1.NodeResourcesFitArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.NodeResourcesLeastAllocatedArgs)(nil), (*config.NodeResourcesLeastAllocatedArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_NodeResourcesLeastAllocatedArgs_To_config_NodeResourcesLeastAllocatedArgs(a.(*v1beta1.NodeResourcesLeastAllocatedArgs), b.(*config.NodeResourcesLeastAllocatedArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.NodeResourcesLeastAllocatedArgs)(nil), (*v1beta1.NodeResourcesLeastAllocatedArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_NodeResourcesLeastAllocatedArgs_To_v1beta1_NodeResourcesLeastAllocatedArgs(a.(*config.NodeResourcesLeastAllocatedArgs), b.(*v1beta1.NodeResourcesLeastAllocatedArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.NodeResourcesMostAllocatedArgs)(nil), (*config.NodeResourcesMostAllocatedArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_NodeResourcesMostAllocatedArgs_To_config_NodeResourcesMostAllocatedArgs(a.(*v1beta1.NodeResourcesMostAllocatedArgs), b.(*config.NodeResourcesMostAllocatedArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.NodeResourcesMostAllocatedArgs)(nil), (*v1beta1.NodeResourcesMostAllocatedArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_NodeResourcesMostAllocatedArgs_To_v1beta1_NodeResourcesMostAllocatedArgs(a.(*config.NodeResourcesMostAllocatedArgs), b.(*v1beta1.NodeResourcesMostAllocatedArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.Plugin)(nil), (*config.Plugin)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_Plugin_To_config_Plugin(a.(*v1beta1.Plugin), b.(*config.Plugin), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.Plugin)(nil), (*v1beta1.Plugin)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_Plugin_To_v1beta1_Plugin(a.(*config.Plugin), b.(*v1beta1.Plugin), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.PluginConfig)(nil), (*config.PluginConfig)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_PluginConfig_To_config_PluginConfig(a.(*v1beta1.PluginConfig), b.(*config.PluginConfig), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.PluginConfig)(nil), (*v1beta1.PluginConfig)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_PluginConfig_To_v1beta1_PluginConfig(a.(*config.PluginConfig), b.(*v1beta1.PluginConfig), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.PluginSet)(nil), (*v1beta1.PluginSet)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_PluginSet_To_v1beta1_PluginSet(a.(*config.PluginSet), b.(*v1beta1.PluginSet), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.PodTopologySpreadArgs)(nil), (*config.PodTopologySpreadArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_PodTopologySpreadArgs_To_config_PodTopologySpreadArgs(a.(*v1beta1.PodTopologySpreadArgs), b.(*config.PodTopologySpreadArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.PodTopologySpreadArgs)(nil), (*v1beta1.PodTopologySpreadArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_PodTopologySpreadArgs_To_v1beta1_PodTopologySpreadArgs(a.(*config.PodTopologySpreadArgs), b.(*v1beta1.PodTopologySpreadArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.RequestedToCapacityRatioArgs)(nil), (*config.RequestedToCapacityRatioArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_RequestedToCapacityRatioArgs_To_config_RequestedToCapacityRatioArgs(a.(*v1beta1.RequestedToCapacityRatioArgs), b.(*config.RequestedToCapacityRatioArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.RequestedToCapacityRatioArgs)(nil), (*v1beta1.RequestedToCapacityRatioArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_RequestedToCapacityRatioArgs_To_v1beta1_RequestedToCapacityRatioArgs(a.(*config.RequestedToCapacityRatioArgs), b.(*v1beta1.RequestedToCapacityRatioArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.RequestedToCapacityRatioParam)(nil), (*config.RequestedToCapacityRatioParam)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_RequestedToCapacityRatioParam_To_config_RequestedToCapacityRatioParam(a.(*v1beta1.RequestedToCapacityRatioParam), b.(*config.RequestedToCapacityRatioParam), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.RequestedToCapacityRatioParam)(nil), (*v1beta1.RequestedToCapacityRatioParam)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_RequestedToCapacityRatioParam_To_v1beta1_RequestedToCapacityRatioParam(a.(*config.RequestedToCapacityRatioParam), b.(*v1beta1.RequestedToCapacityRatioParam), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.ResourceSpec)(nil), (*config.ResourceSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_ResourceSpec_To_config_ResourceSpec(a.(*v1beta1.ResourceSpec), b.(*config.ResourceSpec), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.ResourceSpec)(nil), (*v1beta1.ResourceSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_ResourceSpec_To_v1beta1_ResourceSpec(a.(*config.ResourceSpec), b.(*v1beta1.ResourceSpec), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.ScoringStrategy)(nil), (*config.ScoringStrategy)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_ScoringStrategy_To_config_ScoringStrategy(a.(*v1beta1.ScoringStrategy), b.(*config.ScoringStrategy), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.ScoringStrategy)(nil), (*v1beta1.ScoringStrategy)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_ScoringStrategy_To_v1beta1_ScoringStrategy(a.(*config.ScoringStrategy), b.(*v1beta1.ScoringStrategy), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.ServiceAffinityArgs)(nil), (*config.ServiceAffinityArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_ServiceAffinityArgs_To_config_ServiceAffinityArgs(a.(*v1beta1.ServiceAffinityArgs), b.(*config.ServiceAffinityArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.ServiceAffinityArgs)(nil), (*v1beta1.ServiceAffinityArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_ServiceAffinityArgs_To_v1beta1_ServiceAffinityArgs(a.(*config.ServiceAffinityArgs), b.(*v1beta1.ServiceAffinityArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.UtilizationShapePoint)(nil), (*config.UtilizationShapePoint)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_UtilizationShapePoint_To_config_UtilizationShapePoint(a.(*v1beta1.UtilizationShapePoint), b.(*config.UtilizationShapePoint), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.UtilizationShapePoint)(nil), (*v1beta1.UtilizationShapePoint)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_UtilizationShapePoint_To_v1beta1_UtilizationShapePoint(a.(*config.UtilizationShapePoint), b.(*v1beta1.UtilizationShapePoint), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*v1beta1.VolumeBindingArgs)(nil), (*config.VolumeBindingArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_VolumeBindingArgs_To_config_VolumeBindingArgs(a.(*v1beta1.VolumeBindingArgs), b.(*config.VolumeBindingArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddGeneratedConversionFunc((*config.VolumeBindingArgs)(nil), (*v1beta1.VolumeBindingArgs)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_VolumeBindingArgs_To_v1beta1_VolumeBindingArgs(a.(*config.VolumeBindingArgs), b.(*v1beta1.VolumeBindingArgs), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddConversionFunc((*config.KubeSchedulerConfiguration)(nil), (*v1beta1.KubeSchedulerConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_KubeSchedulerConfiguration_To_v1beta1_KubeSchedulerConfiguration(a.(*config.KubeSchedulerConfiguration), b.(*v1beta1.KubeSchedulerConfiguration), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddConversionFunc((*config.Plugins)(nil), (*v1beta1.Plugins)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_config_Plugins_To_v1beta1_Plugins(a.(*config.Plugins), b.(*v1beta1.Plugins), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddConversionFunc((*v1beta1.KubeSchedulerConfiguration)(nil), (*config.KubeSchedulerConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_KubeSchedulerConfiguration_To_config_KubeSchedulerConfiguration(a.(*v1beta1.KubeSchedulerConfiguration), b.(*config.KubeSchedulerConfiguration), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddConversionFunc((*v1beta1.PluginSet)(nil), (*config.PluginSet)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_PluginSet_To_config_PluginSet(a.(*v1beta1.PluginSet), b.(*config.PluginSet), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := s.AddConversionFunc((*v1beta1.Plugins)(nil), (*config.Plugins)(nil), func(a, b interface{}, scope conversion.Scope) error {
 | 
			
		||||
		return Convert_v1beta1_Plugins_To_config_Plugins(a.(*v1beta1.Plugins), b.(*config.Plugins), scope)
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_DefaultPreemptionArgs_To_config_DefaultPreemptionArgs(in *v1beta1.DefaultPreemptionArgs, out *config.DefaultPreemptionArgs, s conversion.Scope) error {
 | 
			
		||||
	if err := v1.Convert_Pointer_int32_To_int32(&in.MinCandidateNodesPercentage, &out.MinCandidateNodesPercentage, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := v1.Convert_Pointer_int32_To_int32(&in.MinCandidateNodesAbsolute, &out.MinCandidateNodesAbsolute, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_DefaultPreemptionArgs_To_config_DefaultPreemptionArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_DefaultPreemptionArgs_To_config_DefaultPreemptionArgs(in *v1beta1.DefaultPreemptionArgs, out *config.DefaultPreemptionArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_DefaultPreemptionArgs_To_config_DefaultPreemptionArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_DefaultPreemptionArgs_To_v1beta1_DefaultPreemptionArgs(in *config.DefaultPreemptionArgs, out *v1beta1.DefaultPreemptionArgs, s conversion.Scope) error {
 | 
			
		||||
	if err := v1.Convert_int32_To_Pointer_int32(&in.MinCandidateNodesPercentage, &out.MinCandidateNodesPercentage, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := v1.Convert_int32_To_Pointer_int32(&in.MinCandidateNodesAbsolute, &out.MinCandidateNodesAbsolute, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_DefaultPreemptionArgs_To_v1beta1_DefaultPreemptionArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_DefaultPreemptionArgs_To_v1beta1_DefaultPreemptionArgs(in *config.DefaultPreemptionArgs, out *v1beta1.DefaultPreemptionArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_DefaultPreemptionArgs_To_v1beta1_DefaultPreemptionArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_Extender_To_config_Extender(in *v1beta1.Extender, out *config.Extender, s conversion.Scope) error {
 | 
			
		||||
	out.URLPrefix = in.URLPrefix
 | 
			
		||||
	out.FilterVerb = in.FilterVerb
 | 
			
		||||
	out.PreemptVerb = in.PreemptVerb
 | 
			
		||||
	out.PrioritizeVerb = in.PrioritizeVerb
 | 
			
		||||
	out.Weight = in.Weight
 | 
			
		||||
	out.BindVerb = in.BindVerb
 | 
			
		||||
	out.EnableHTTPS = in.EnableHTTPS
 | 
			
		||||
	out.TLSConfig = (*config.ExtenderTLSConfig)(unsafe.Pointer(in.TLSConfig))
 | 
			
		||||
	out.HTTPTimeout = in.HTTPTimeout
 | 
			
		||||
	out.NodeCacheCapable = in.NodeCacheCapable
 | 
			
		||||
	out.ManagedResources = *(*[]config.ExtenderManagedResource)(unsafe.Pointer(&in.ManagedResources))
 | 
			
		||||
	out.Ignorable = in.Ignorable
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_Extender_To_config_Extender is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_Extender_To_config_Extender(in *v1beta1.Extender, out *config.Extender, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_Extender_To_config_Extender(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_Extender_To_v1beta1_Extender(in *config.Extender, out *v1beta1.Extender, s conversion.Scope) error {
 | 
			
		||||
	out.URLPrefix = in.URLPrefix
 | 
			
		||||
	out.FilterVerb = in.FilterVerb
 | 
			
		||||
	out.PreemptVerb = in.PreemptVerb
 | 
			
		||||
	out.PrioritizeVerb = in.PrioritizeVerb
 | 
			
		||||
	out.Weight = in.Weight
 | 
			
		||||
	out.BindVerb = in.BindVerb
 | 
			
		||||
	out.EnableHTTPS = in.EnableHTTPS
 | 
			
		||||
	out.TLSConfig = (*configv1.ExtenderTLSConfig)(unsafe.Pointer(in.TLSConfig))
 | 
			
		||||
	out.HTTPTimeout = in.HTTPTimeout
 | 
			
		||||
	out.NodeCacheCapable = in.NodeCacheCapable
 | 
			
		||||
	out.ManagedResources = *(*[]configv1.ExtenderManagedResource)(unsafe.Pointer(&in.ManagedResources))
 | 
			
		||||
	out.Ignorable = in.Ignorable
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_Extender_To_v1beta1_Extender is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_Extender_To_v1beta1_Extender(in *config.Extender, out *v1beta1.Extender, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_Extender_To_v1beta1_Extender(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_InterPodAffinityArgs_To_config_InterPodAffinityArgs(in *v1beta1.InterPodAffinityArgs, out *config.InterPodAffinityArgs, s conversion.Scope) error {
 | 
			
		||||
	if err := v1.Convert_Pointer_int32_To_int32(&in.HardPodAffinityWeight, &out.HardPodAffinityWeight, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_InterPodAffinityArgs_To_config_InterPodAffinityArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_InterPodAffinityArgs_To_config_InterPodAffinityArgs(in *v1beta1.InterPodAffinityArgs, out *config.InterPodAffinityArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_InterPodAffinityArgs_To_config_InterPodAffinityArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_InterPodAffinityArgs_To_v1beta1_InterPodAffinityArgs(in *config.InterPodAffinityArgs, out *v1beta1.InterPodAffinityArgs, s conversion.Scope) error {
 | 
			
		||||
	if err := v1.Convert_int32_To_Pointer_int32(&in.HardPodAffinityWeight, &out.HardPodAffinityWeight, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_InterPodAffinityArgs_To_v1beta1_InterPodAffinityArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_InterPodAffinityArgs_To_v1beta1_InterPodAffinityArgs(in *config.InterPodAffinityArgs, out *v1beta1.InterPodAffinityArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_InterPodAffinityArgs_To_v1beta1_InterPodAffinityArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_KubeSchedulerConfiguration_To_config_KubeSchedulerConfiguration(in *v1beta1.KubeSchedulerConfiguration, out *config.KubeSchedulerConfiguration, s conversion.Scope) error {
 | 
			
		||||
	if err := v1.Convert_Pointer_int32_To_int32(&in.Parallelism, &out.Parallelism, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := v1alpha1.Convert_v1alpha1_LeaderElectionConfiguration_To_config_LeaderElectionConfiguration(&in.LeaderElection, &out.LeaderElection, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := v1alpha1.Convert_v1alpha1_ClientConnectionConfiguration_To_config_ClientConnectionConfiguration(&in.ClientConnection, &out.ClientConnection, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := v1.Convert_Pointer_string_To_string(&in.HealthzBindAddress, &out.HealthzBindAddress, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := v1.Convert_Pointer_string_To_string(&in.MetricsBindAddress, &out.MetricsBindAddress, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := v1alpha1.Convert_v1alpha1_DebuggingConfiguration_To_config_DebuggingConfiguration(&in.DebuggingConfiguration, &out.DebuggingConfiguration, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := v1.Convert_Pointer_int32_To_int32(&in.PercentageOfNodesToScore, &out.PercentageOfNodesToScore, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := v1.Convert_Pointer_int64_To_int64(&in.PodInitialBackoffSeconds, &out.PodInitialBackoffSeconds, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := v1.Convert_Pointer_int64_To_int64(&in.PodMaxBackoffSeconds, &out.PodMaxBackoffSeconds, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if in.Profiles != nil {
 | 
			
		||||
		in, out := &in.Profiles, &out.Profiles
 | 
			
		||||
		*out = make([]config.KubeSchedulerProfile, len(*in))
 | 
			
		||||
		for i := range *in {
 | 
			
		||||
			if err := Convert_v1beta1_KubeSchedulerProfile_To_config_KubeSchedulerProfile(&(*in)[i], &(*out)[i], s); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		out.Profiles = nil
 | 
			
		||||
	}
 | 
			
		||||
	out.Extenders = *(*[]config.Extender)(unsafe.Pointer(&in.Extenders))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_KubeSchedulerConfiguration_To_v1beta1_KubeSchedulerConfiguration(in *config.KubeSchedulerConfiguration, out *v1beta1.KubeSchedulerConfiguration, s conversion.Scope) error {
 | 
			
		||||
	if err := v1.Convert_int32_To_Pointer_int32(&in.Parallelism, &out.Parallelism, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := v1alpha1.Convert_config_LeaderElectionConfiguration_To_v1alpha1_LeaderElectionConfiguration(&in.LeaderElection, &out.LeaderElection, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := v1alpha1.Convert_config_ClientConnectionConfiguration_To_v1alpha1_ClientConnectionConfiguration(&in.ClientConnection, &out.ClientConnection, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := v1.Convert_string_To_Pointer_string(&in.HealthzBindAddress, &out.HealthzBindAddress, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := v1.Convert_string_To_Pointer_string(&in.MetricsBindAddress, &out.MetricsBindAddress, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := v1alpha1.Convert_config_DebuggingConfiguration_To_v1alpha1_DebuggingConfiguration(&in.DebuggingConfiguration, &out.DebuggingConfiguration, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := v1.Convert_int32_To_Pointer_int32(&in.PercentageOfNodesToScore, &out.PercentageOfNodesToScore, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := v1.Convert_int64_To_Pointer_int64(&in.PodInitialBackoffSeconds, &out.PodInitialBackoffSeconds, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := v1.Convert_int64_To_Pointer_int64(&in.PodMaxBackoffSeconds, &out.PodMaxBackoffSeconds, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if in.Profiles != nil {
 | 
			
		||||
		in, out := &in.Profiles, &out.Profiles
 | 
			
		||||
		*out = make([]v1beta1.KubeSchedulerProfile, len(*in))
 | 
			
		||||
		for i := range *in {
 | 
			
		||||
			if err := Convert_config_KubeSchedulerProfile_To_v1beta1_KubeSchedulerProfile(&(*in)[i], &(*out)[i], s); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		out.Profiles = nil
 | 
			
		||||
	}
 | 
			
		||||
	out.Extenders = *(*[]v1beta1.Extender)(unsafe.Pointer(&in.Extenders))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_KubeSchedulerProfile_To_config_KubeSchedulerProfile(in *v1beta1.KubeSchedulerProfile, out *config.KubeSchedulerProfile, s conversion.Scope) error {
 | 
			
		||||
	if err := v1.Convert_Pointer_string_To_string(&in.SchedulerName, &out.SchedulerName, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if in.Plugins != nil {
 | 
			
		||||
		in, out := &in.Plugins, &out.Plugins
 | 
			
		||||
		*out = new(config.Plugins)
 | 
			
		||||
		if err := Convert_v1beta1_Plugins_To_config_Plugins(*in, *out, s); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		out.Plugins = nil
 | 
			
		||||
	}
 | 
			
		||||
	if in.PluginConfig != nil {
 | 
			
		||||
		in, out := &in.PluginConfig, &out.PluginConfig
 | 
			
		||||
		*out = make([]config.PluginConfig, len(*in))
 | 
			
		||||
		for i := range *in {
 | 
			
		||||
			if err := Convert_v1beta1_PluginConfig_To_config_PluginConfig(&(*in)[i], &(*out)[i], s); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		out.PluginConfig = nil
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_KubeSchedulerProfile_To_config_KubeSchedulerProfile is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_KubeSchedulerProfile_To_config_KubeSchedulerProfile(in *v1beta1.KubeSchedulerProfile, out *config.KubeSchedulerProfile, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_KubeSchedulerProfile_To_config_KubeSchedulerProfile(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_KubeSchedulerProfile_To_v1beta1_KubeSchedulerProfile(in *config.KubeSchedulerProfile, out *v1beta1.KubeSchedulerProfile, s conversion.Scope) error {
 | 
			
		||||
	if err := v1.Convert_string_To_Pointer_string(&in.SchedulerName, &out.SchedulerName, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if in.Plugins != nil {
 | 
			
		||||
		in, out := &in.Plugins, &out.Plugins
 | 
			
		||||
		*out = new(v1beta1.Plugins)
 | 
			
		||||
		if err := Convert_config_Plugins_To_v1beta1_Plugins(*in, *out, s); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		out.Plugins = nil
 | 
			
		||||
	}
 | 
			
		||||
	if in.PluginConfig != nil {
 | 
			
		||||
		in, out := &in.PluginConfig, &out.PluginConfig
 | 
			
		||||
		*out = make([]v1beta1.PluginConfig, len(*in))
 | 
			
		||||
		for i := range *in {
 | 
			
		||||
			if err := Convert_config_PluginConfig_To_v1beta1_PluginConfig(&(*in)[i], &(*out)[i], s); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		out.PluginConfig = nil
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_KubeSchedulerProfile_To_v1beta1_KubeSchedulerProfile is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_KubeSchedulerProfile_To_v1beta1_KubeSchedulerProfile(in *config.KubeSchedulerProfile, out *v1beta1.KubeSchedulerProfile, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_KubeSchedulerProfile_To_v1beta1_KubeSchedulerProfile(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_NodeAffinityArgs_To_config_NodeAffinityArgs(in *v1beta1.NodeAffinityArgs, out *config.NodeAffinityArgs, s conversion.Scope) error {
 | 
			
		||||
	out.AddedAffinity = (*corev1.NodeAffinity)(unsafe.Pointer(in.AddedAffinity))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_NodeAffinityArgs_To_config_NodeAffinityArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_NodeAffinityArgs_To_config_NodeAffinityArgs(in *v1beta1.NodeAffinityArgs, out *config.NodeAffinityArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_NodeAffinityArgs_To_config_NodeAffinityArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_NodeAffinityArgs_To_v1beta1_NodeAffinityArgs(in *config.NodeAffinityArgs, out *v1beta1.NodeAffinityArgs, s conversion.Scope) error {
 | 
			
		||||
	out.AddedAffinity = (*corev1.NodeAffinity)(unsafe.Pointer(in.AddedAffinity))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_NodeAffinityArgs_To_v1beta1_NodeAffinityArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_NodeAffinityArgs_To_v1beta1_NodeAffinityArgs(in *config.NodeAffinityArgs, out *v1beta1.NodeAffinityArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_NodeAffinityArgs_To_v1beta1_NodeAffinityArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_NodeLabelArgs_To_config_NodeLabelArgs(in *v1beta1.NodeLabelArgs, out *config.NodeLabelArgs, s conversion.Scope) error {
 | 
			
		||||
	out.PresentLabels = *(*[]string)(unsafe.Pointer(&in.PresentLabels))
 | 
			
		||||
	out.AbsentLabels = *(*[]string)(unsafe.Pointer(&in.AbsentLabels))
 | 
			
		||||
	out.PresentLabelsPreference = *(*[]string)(unsafe.Pointer(&in.PresentLabelsPreference))
 | 
			
		||||
	out.AbsentLabelsPreference = *(*[]string)(unsafe.Pointer(&in.AbsentLabelsPreference))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_NodeLabelArgs_To_config_NodeLabelArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_NodeLabelArgs_To_config_NodeLabelArgs(in *v1beta1.NodeLabelArgs, out *config.NodeLabelArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_NodeLabelArgs_To_config_NodeLabelArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_NodeLabelArgs_To_v1beta1_NodeLabelArgs(in *config.NodeLabelArgs, out *v1beta1.NodeLabelArgs, s conversion.Scope) error {
 | 
			
		||||
	out.PresentLabels = *(*[]string)(unsafe.Pointer(&in.PresentLabels))
 | 
			
		||||
	out.AbsentLabels = *(*[]string)(unsafe.Pointer(&in.AbsentLabels))
 | 
			
		||||
	out.PresentLabelsPreference = *(*[]string)(unsafe.Pointer(&in.PresentLabelsPreference))
 | 
			
		||||
	out.AbsentLabelsPreference = *(*[]string)(unsafe.Pointer(&in.AbsentLabelsPreference))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_NodeLabelArgs_To_v1beta1_NodeLabelArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_NodeLabelArgs_To_v1beta1_NodeLabelArgs(in *config.NodeLabelArgs, out *v1beta1.NodeLabelArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_NodeLabelArgs_To_v1beta1_NodeLabelArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_NodeResourcesBalancedAllocationArgs_To_config_NodeResourcesBalancedAllocationArgs(in *v1beta1.NodeResourcesBalancedAllocationArgs, out *config.NodeResourcesBalancedAllocationArgs, s conversion.Scope) error {
 | 
			
		||||
	out.Resources = *(*[]config.ResourceSpec)(unsafe.Pointer(&in.Resources))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_NodeResourcesBalancedAllocationArgs_To_config_NodeResourcesBalancedAllocationArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_NodeResourcesBalancedAllocationArgs_To_config_NodeResourcesBalancedAllocationArgs(in *v1beta1.NodeResourcesBalancedAllocationArgs, out *config.NodeResourcesBalancedAllocationArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_NodeResourcesBalancedAllocationArgs_To_config_NodeResourcesBalancedAllocationArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_NodeResourcesBalancedAllocationArgs_To_v1beta1_NodeResourcesBalancedAllocationArgs(in *config.NodeResourcesBalancedAllocationArgs, out *v1beta1.NodeResourcesBalancedAllocationArgs, s conversion.Scope) error {
 | 
			
		||||
	out.Resources = *(*[]v1beta1.ResourceSpec)(unsafe.Pointer(&in.Resources))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_NodeResourcesBalancedAllocationArgs_To_v1beta1_NodeResourcesBalancedAllocationArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_NodeResourcesBalancedAllocationArgs_To_v1beta1_NodeResourcesBalancedAllocationArgs(in *config.NodeResourcesBalancedAllocationArgs, out *v1beta1.NodeResourcesBalancedAllocationArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_NodeResourcesBalancedAllocationArgs_To_v1beta1_NodeResourcesBalancedAllocationArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_NodeResourcesFitArgs_To_config_NodeResourcesFitArgs(in *v1beta1.NodeResourcesFitArgs, out *config.NodeResourcesFitArgs, s conversion.Scope) error {
 | 
			
		||||
	out.IgnoredResources = *(*[]string)(unsafe.Pointer(&in.IgnoredResources))
 | 
			
		||||
	out.IgnoredResourceGroups = *(*[]string)(unsafe.Pointer(&in.IgnoredResourceGroups))
 | 
			
		||||
	out.ScoringStrategy = (*config.ScoringStrategy)(unsafe.Pointer(in.ScoringStrategy))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_NodeResourcesFitArgs_To_config_NodeResourcesFitArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_NodeResourcesFitArgs_To_config_NodeResourcesFitArgs(in *v1beta1.NodeResourcesFitArgs, out *config.NodeResourcesFitArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_NodeResourcesFitArgs_To_config_NodeResourcesFitArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_NodeResourcesFitArgs_To_v1beta1_NodeResourcesFitArgs(in *config.NodeResourcesFitArgs, out *v1beta1.NodeResourcesFitArgs, s conversion.Scope) error {
 | 
			
		||||
	out.IgnoredResources = *(*[]string)(unsafe.Pointer(&in.IgnoredResources))
 | 
			
		||||
	out.IgnoredResourceGroups = *(*[]string)(unsafe.Pointer(&in.IgnoredResourceGroups))
 | 
			
		||||
	out.ScoringStrategy = (*v1beta1.ScoringStrategy)(unsafe.Pointer(in.ScoringStrategy))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_NodeResourcesFitArgs_To_v1beta1_NodeResourcesFitArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_NodeResourcesFitArgs_To_v1beta1_NodeResourcesFitArgs(in *config.NodeResourcesFitArgs, out *v1beta1.NodeResourcesFitArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_NodeResourcesFitArgs_To_v1beta1_NodeResourcesFitArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_NodeResourcesLeastAllocatedArgs_To_config_NodeResourcesLeastAllocatedArgs(in *v1beta1.NodeResourcesLeastAllocatedArgs, out *config.NodeResourcesLeastAllocatedArgs, s conversion.Scope) error {
 | 
			
		||||
	out.Resources = *(*[]config.ResourceSpec)(unsafe.Pointer(&in.Resources))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_NodeResourcesLeastAllocatedArgs_To_config_NodeResourcesLeastAllocatedArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_NodeResourcesLeastAllocatedArgs_To_config_NodeResourcesLeastAllocatedArgs(in *v1beta1.NodeResourcesLeastAllocatedArgs, out *config.NodeResourcesLeastAllocatedArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_NodeResourcesLeastAllocatedArgs_To_config_NodeResourcesLeastAllocatedArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_NodeResourcesLeastAllocatedArgs_To_v1beta1_NodeResourcesLeastAllocatedArgs(in *config.NodeResourcesLeastAllocatedArgs, out *v1beta1.NodeResourcesLeastAllocatedArgs, s conversion.Scope) error {
 | 
			
		||||
	out.Resources = *(*[]v1beta1.ResourceSpec)(unsafe.Pointer(&in.Resources))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_NodeResourcesLeastAllocatedArgs_To_v1beta1_NodeResourcesLeastAllocatedArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_NodeResourcesLeastAllocatedArgs_To_v1beta1_NodeResourcesLeastAllocatedArgs(in *config.NodeResourcesLeastAllocatedArgs, out *v1beta1.NodeResourcesLeastAllocatedArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_NodeResourcesLeastAllocatedArgs_To_v1beta1_NodeResourcesLeastAllocatedArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_NodeResourcesMostAllocatedArgs_To_config_NodeResourcesMostAllocatedArgs(in *v1beta1.NodeResourcesMostAllocatedArgs, out *config.NodeResourcesMostAllocatedArgs, s conversion.Scope) error {
 | 
			
		||||
	out.Resources = *(*[]config.ResourceSpec)(unsafe.Pointer(&in.Resources))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_NodeResourcesMostAllocatedArgs_To_config_NodeResourcesMostAllocatedArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_NodeResourcesMostAllocatedArgs_To_config_NodeResourcesMostAllocatedArgs(in *v1beta1.NodeResourcesMostAllocatedArgs, out *config.NodeResourcesMostAllocatedArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_NodeResourcesMostAllocatedArgs_To_config_NodeResourcesMostAllocatedArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_NodeResourcesMostAllocatedArgs_To_v1beta1_NodeResourcesMostAllocatedArgs(in *config.NodeResourcesMostAllocatedArgs, out *v1beta1.NodeResourcesMostAllocatedArgs, s conversion.Scope) error {
 | 
			
		||||
	out.Resources = *(*[]v1beta1.ResourceSpec)(unsafe.Pointer(&in.Resources))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_NodeResourcesMostAllocatedArgs_To_v1beta1_NodeResourcesMostAllocatedArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_NodeResourcesMostAllocatedArgs_To_v1beta1_NodeResourcesMostAllocatedArgs(in *config.NodeResourcesMostAllocatedArgs, out *v1beta1.NodeResourcesMostAllocatedArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_NodeResourcesMostAllocatedArgs_To_v1beta1_NodeResourcesMostAllocatedArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_Plugin_To_config_Plugin(in *v1beta1.Plugin, out *config.Plugin, s conversion.Scope) error {
 | 
			
		||||
	out.Name = in.Name
 | 
			
		||||
	if err := v1.Convert_Pointer_int32_To_int32(&in.Weight, &out.Weight, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_Plugin_To_config_Plugin is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_Plugin_To_config_Plugin(in *v1beta1.Plugin, out *config.Plugin, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_Plugin_To_config_Plugin(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_Plugin_To_v1beta1_Plugin(in *config.Plugin, out *v1beta1.Plugin, s conversion.Scope) error {
 | 
			
		||||
	out.Name = in.Name
 | 
			
		||||
	if err := v1.Convert_int32_To_Pointer_int32(&in.Weight, &out.Weight, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_Plugin_To_v1beta1_Plugin is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_Plugin_To_v1beta1_Plugin(in *config.Plugin, out *v1beta1.Plugin, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_Plugin_To_v1beta1_Plugin(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_PluginConfig_To_config_PluginConfig(in *v1beta1.PluginConfig, out *config.PluginConfig, s conversion.Scope) error {
 | 
			
		||||
	out.Name = in.Name
 | 
			
		||||
	if err := runtime.Convert_runtime_RawExtension_To_runtime_Object(&in.Args, &out.Args, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_PluginConfig_To_config_PluginConfig is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_PluginConfig_To_config_PluginConfig(in *v1beta1.PluginConfig, out *config.PluginConfig, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_PluginConfig_To_config_PluginConfig(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_PluginConfig_To_v1beta1_PluginConfig(in *config.PluginConfig, out *v1beta1.PluginConfig, s conversion.Scope) error {
 | 
			
		||||
	out.Name = in.Name
 | 
			
		||||
	if err := runtime.Convert_runtime_Object_To_runtime_RawExtension(&in.Args, &out.Args, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_PluginConfig_To_v1beta1_PluginConfig is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_PluginConfig_To_v1beta1_PluginConfig(in *config.PluginConfig, out *v1beta1.PluginConfig, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_PluginConfig_To_v1beta1_PluginConfig(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_PluginSet_To_config_PluginSet(in *v1beta1.PluginSet, out *config.PluginSet, s conversion.Scope) error {
 | 
			
		||||
	if in.Enabled != nil {
 | 
			
		||||
		in, out := &in.Enabled, &out.Enabled
 | 
			
		||||
		*out = make([]config.Plugin, len(*in))
 | 
			
		||||
		for i := range *in {
 | 
			
		||||
			if err := Convert_v1beta1_Plugin_To_config_Plugin(&(*in)[i], &(*out)[i], s); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		out.Enabled = nil
 | 
			
		||||
	}
 | 
			
		||||
	if in.Disabled != nil {
 | 
			
		||||
		in, out := &in.Disabled, &out.Disabled
 | 
			
		||||
		*out = make([]config.Plugin, len(*in))
 | 
			
		||||
		for i := range *in {
 | 
			
		||||
			if err := Convert_v1beta1_Plugin_To_config_Plugin(&(*in)[i], &(*out)[i], s); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		out.Disabled = nil
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_PluginSet_To_v1beta1_PluginSet(in *config.PluginSet, out *v1beta1.PluginSet, s conversion.Scope) error {
 | 
			
		||||
	if in.Enabled != nil {
 | 
			
		||||
		in, out := &in.Enabled, &out.Enabled
 | 
			
		||||
		*out = make([]v1beta1.Plugin, len(*in))
 | 
			
		||||
		for i := range *in {
 | 
			
		||||
			if err := Convert_config_Plugin_To_v1beta1_Plugin(&(*in)[i], &(*out)[i], s); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		out.Enabled = nil
 | 
			
		||||
	}
 | 
			
		||||
	if in.Disabled != nil {
 | 
			
		||||
		in, out := &in.Disabled, &out.Disabled
 | 
			
		||||
		*out = make([]v1beta1.Plugin, len(*in))
 | 
			
		||||
		for i := range *in {
 | 
			
		||||
			if err := Convert_config_Plugin_To_v1beta1_Plugin(&(*in)[i], &(*out)[i], s); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		out.Disabled = nil
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_PluginSet_To_v1beta1_PluginSet is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_PluginSet_To_v1beta1_PluginSet(in *config.PluginSet, out *v1beta1.PluginSet, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_PluginSet_To_v1beta1_PluginSet(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_Plugins_To_config_Plugins(in *v1beta1.Plugins, out *config.Plugins, s conversion.Scope) error {
 | 
			
		||||
	// WARNING: in.QueueSort requires manual conversion: inconvertible types (*k8s.io/kube-scheduler/config/v1beta1.PluginSet vs k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet)
 | 
			
		||||
	// WARNING: in.PreFilter requires manual conversion: inconvertible types (*k8s.io/kube-scheduler/config/v1beta1.PluginSet vs k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet)
 | 
			
		||||
	// WARNING: in.Filter requires manual conversion: inconvertible types (*k8s.io/kube-scheduler/config/v1beta1.PluginSet vs k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet)
 | 
			
		||||
	// WARNING: in.PostFilter requires manual conversion: inconvertible types (*k8s.io/kube-scheduler/config/v1beta1.PluginSet vs k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet)
 | 
			
		||||
	// WARNING: in.PreScore requires manual conversion: inconvertible types (*k8s.io/kube-scheduler/config/v1beta1.PluginSet vs k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet)
 | 
			
		||||
	// WARNING: in.Score requires manual conversion: inconvertible types (*k8s.io/kube-scheduler/config/v1beta1.PluginSet vs k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet)
 | 
			
		||||
	// WARNING: in.Reserve requires manual conversion: inconvertible types (*k8s.io/kube-scheduler/config/v1beta1.PluginSet vs k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet)
 | 
			
		||||
	// WARNING: in.Permit requires manual conversion: inconvertible types (*k8s.io/kube-scheduler/config/v1beta1.PluginSet vs k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet)
 | 
			
		||||
	// WARNING: in.PreBind requires manual conversion: inconvertible types (*k8s.io/kube-scheduler/config/v1beta1.PluginSet vs k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet)
 | 
			
		||||
	// WARNING: in.Bind requires manual conversion: inconvertible types (*k8s.io/kube-scheduler/config/v1beta1.PluginSet vs k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet)
 | 
			
		||||
	// WARNING: in.PostBind requires manual conversion: inconvertible types (*k8s.io/kube-scheduler/config/v1beta1.PluginSet vs k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_Plugins_To_v1beta1_Plugins(in *config.Plugins, out *v1beta1.Plugins, s conversion.Scope) error {
 | 
			
		||||
	// WARNING: in.QueueSort requires manual conversion: inconvertible types (k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet vs *k8s.io/kube-scheduler/config/v1beta1.PluginSet)
 | 
			
		||||
	// WARNING: in.PreFilter requires manual conversion: inconvertible types (k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet vs *k8s.io/kube-scheduler/config/v1beta1.PluginSet)
 | 
			
		||||
	// WARNING: in.Filter requires manual conversion: inconvertible types (k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet vs *k8s.io/kube-scheduler/config/v1beta1.PluginSet)
 | 
			
		||||
	// WARNING: in.PostFilter requires manual conversion: inconvertible types (k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet vs *k8s.io/kube-scheduler/config/v1beta1.PluginSet)
 | 
			
		||||
	// WARNING: in.PreScore requires manual conversion: inconvertible types (k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet vs *k8s.io/kube-scheduler/config/v1beta1.PluginSet)
 | 
			
		||||
	// WARNING: in.Score requires manual conversion: inconvertible types (k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet vs *k8s.io/kube-scheduler/config/v1beta1.PluginSet)
 | 
			
		||||
	// WARNING: in.Reserve requires manual conversion: inconvertible types (k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet vs *k8s.io/kube-scheduler/config/v1beta1.PluginSet)
 | 
			
		||||
	// WARNING: in.Permit requires manual conversion: inconvertible types (k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet vs *k8s.io/kube-scheduler/config/v1beta1.PluginSet)
 | 
			
		||||
	// WARNING: in.PreBind requires manual conversion: inconvertible types (k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet vs *k8s.io/kube-scheduler/config/v1beta1.PluginSet)
 | 
			
		||||
	// WARNING: in.Bind requires manual conversion: inconvertible types (k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet vs *k8s.io/kube-scheduler/config/v1beta1.PluginSet)
 | 
			
		||||
	// WARNING: in.PostBind requires manual conversion: inconvertible types (k8s.io/kubernetes/pkg/scheduler/apis/config.PluginSet vs *k8s.io/kube-scheduler/config/v1beta1.PluginSet)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_PodTopologySpreadArgs_To_config_PodTopologySpreadArgs(in *v1beta1.PodTopologySpreadArgs, out *config.PodTopologySpreadArgs, s conversion.Scope) error {
 | 
			
		||||
	out.DefaultConstraints = *(*[]corev1.TopologySpreadConstraint)(unsafe.Pointer(&in.DefaultConstraints))
 | 
			
		||||
	out.DefaultingType = config.PodTopologySpreadConstraintsDefaulting(in.DefaultingType)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_PodTopologySpreadArgs_To_config_PodTopologySpreadArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_PodTopologySpreadArgs_To_config_PodTopologySpreadArgs(in *v1beta1.PodTopologySpreadArgs, out *config.PodTopologySpreadArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_PodTopologySpreadArgs_To_config_PodTopologySpreadArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_PodTopologySpreadArgs_To_v1beta1_PodTopologySpreadArgs(in *config.PodTopologySpreadArgs, out *v1beta1.PodTopologySpreadArgs, s conversion.Scope) error {
 | 
			
		||||
	out.DefaultConstraints = *(*[]corev1.TopologySpreadConstraint)(unsafe.Pointer(&in.DefaultConstraints))
 | 
			
		||||
	out.DefaultingType = v1beta1.PodTopologySpreadConstraintsDefaulting(in.DefaultingType)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_PodTopologySpreadArgs_To_v1beta1_PodTopologySpreadArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_PodTopologySpreadArgs_To_v1beta1_PodTopologySpreadArgs(in *config.PodTopologySpreadArgs, out *v1beta1.PodTopologySpreadArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_PodTopologySpreadArgs_To_v1beta1_PodTopologySpreadArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_RequestedToCapacityRatioArgs_To_config_RequestedToCapacityRatioArgs(in *v1beta1.RequestedToCapacityRatioArgs, out *config.RequestedToCapacityRatioArgs, s conversion.Scope) error {
 | 
			
		||||
	out.Shape = *(*[]config.UtilizationShapePoint)(unsafe.Pointer(&in.Shape))
 | 
			
		||||
	out.Resources = *(*[]config.ResourceSpec)(unsafe.Pointer(&in.Resources))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_RequestedToCapacityRatioArgs_To_config_RequestedToCapacityRatioArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_RequestedToCapacityRatioArgs_To_config_RequestedToCapacityRatioArgs(in *v1beta1.RequestedToCapacityRatioArgs, out *config.RequestedToCapacityRatioArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_RequestedToCapacityRatioArgs_To_config_RequestedToCapacityRatioArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_RequestedToCapacityRatioArgs_To_v1beta1_RequestedToCapacityRatioArgs(in *config.RequestedToCapacityRatioArgs, out *v1beta1.RequestedToCapacityRatioArgs, s conversion.Scope) error {
 | 
			
		||||
	out.Shape = *(*[]v1beta1.UtilizationShapePoint)(unsafe.Pointer(&in.Shape))
 | 
			
		||||
	out.Resources = *(*[]v1beta1.ResourceSpec)(unsafe.Pointer(&in.Resources))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_RequestedToCapacityRatioArgs_To_v1beta1_RequestedToCapacityRatioArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_RequestedToCapacityRatioArgs_To_v1beta1_RequestedToCapacityRatioArgs(in *config.RequestedToCapacityRatioArgs, out *v1beta1.RequestedToCapacityRatioArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_RequestedToCapacityRatioArgs_To_v1beta1_RequestedToCapacityRatioArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_RequestedToCapacityRatioParam_To_config_RequestedToCapacityRatioParam(in *v1beta1.RequestedToCapacityRatioParam, out *config.RequestedToCapacityRatioParam, s conversion.Scope) error {
 | 
			
		||||
	out.Shape = *(*[]config.UtilizationShapePoint)(unsafe.Pointer(&in.Shape))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_RequestedToCapacityRatioParam_To_config_RequestedToCapacityRatioParam is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_RequestedToCapacityRatioParam_To_config_RequestedToCapacityRatioParam(in *v1beta1.RequestedToCapacityRatioParam, out *config.RequestedToCapacityRatioParam, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_RequestedToCapacityRatioParam_To_config_RequestedToCapacityRatioParam(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_RequestedToCapacityRatioParam_To_v1beta1_RequestedToCapacityRatioParam(in *config.RequestedToCapacityRatioParam, out *v1beta1.RequestedToCapacityRatioParam, s conversion.Scope) error {
 | 
			
		||||
	out.Shape = *(*[]v1beta1.UtilizationShapePoint)(unsafe.Pointer(&in.Shape))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_RequestedToCapacityRatioParam_To_v1beta1_RequestedToCapacityRatioParam is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_RequestedToCapacityRatioParam_To_v1beta1_RequestedToCapacityRatioParam(in *config.RequestedToCapacityRatioParam, out *v1beta1.RequestedToCapacityRatioParam, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_RequestedToCapacityRatioParam_To_v1beta1_RequestedToCapacityRatioParam(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_ResourceSpec_To_config_ResourceSpec(in *v1beta1.ResourceSpec, out *config.ResourceSpec, s conversion.Scope) error {
 | 
			
		||||
	out.Name = in.Name
 | 
			
		||||
	out.Weight = in.Weight
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_ResourceSpec_To_config_ResourceSpec is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_ResourceSpec_To_config_ResourceSpec(in *v1beta1.ResourceSpec, out *config.ResourceSpec, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_ResourceSpec_To_config_ResourceSpec(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_ResourceSpec_To_v1beta1_ResourceSpec(in *config.ResourceSpec, out *v1beta1.ResourceSpec, s conversion.Scope) error {
 | 
			
		||||
	out.Name = in.Name
 | 
			
		||||
	out.Weight = in.Weight
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_ResourceSpec_To_v1beta1_ResourceSpec is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_ResourceSpec_To_v1beta1_ResourceSpec(in *config.ResourceSpec, out *v1beta1.ResourceSpec, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_ResourceSpec_To_v1beta1_ResourceSpec(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_ScoringStrategy_To_config_ScoringStrategy(in *v1beta1.ScoringStrategy, out *config.ScoringStrategy, s conversion.Scope) error {
 | 
			
		||||
	out.Type = config.ScoringStrategyType(in.Type)
 | 
			
		||||
	out.Resources = *(*[]config.ResourceSpec)(unsafe.Pointer(&in.Resources))
 | 
			
		||||
	out.RequestedToCapacityRatio = (*config.RequestedToCapacityRatioParam)(unsafe.Pointer(in.RequestedToCapacityRatio))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_ScoringStrategy_To_config_ScoringStrategy is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_ScoringStrategy_To_config_ScoringStrategy(in *v1beta1.ScoringStrategy, out *config.ScoringStrategy, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_ScoringStrategy_To_config_ScoringStrategy(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_ScoringStrategy_To_v1beta1_ScoringStrategy(in *config.ScoringStrategy, out *v1beta1.ScoringStrategy, s conversion.Scope) error {
 | 
			
		||||
	out.Type = v1beta1.ScoringStrategyType(in.Type)
 | 
			
		||||
	out.Resources = *(*[]v1beta1.ResourceSpec)(unsafe.Pointer(&in.Resources))
 | 
			
		||||
	out.RequestedToCapacityRatio = (*v1beta1.RequestedToCapacityRatioParam)(unsafe.Pointer(in.RequestedToCapacityRatio))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_ScoringStrategy_To_v1beta1_ScoringStrategy is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_ScoringStrategy_To_v1beta1_ScoringStrategy(in *config.ScoringStrategy, out *v1beta1.ScoringStrategy, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_ScoringStrategy_To_v1beta1_ScoringStrategy(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_ServiceAffinityArgs_To_config_ServiceAffinityArgs(in *v1beta1.ServiceAffinityArgs, out *config.ServiceAffinityArgs, s conversion.Scope) error {
 | 
			
		||||
	out.AffinityLabels = *(*[]string)(unsafe.Pointer(&in.AffinityLabels))
 | 
			
		||||
	out.AntiAffinityLabelsPreference = *(*[]string)(unsafe.Pointer(&in.AntiAffinityLabelsPreference))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_ServiceAffinityArgs_To_config_ServiceAffinityArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_ServiceAffinityArgs_To_config_ServiceAffinityArgs(in *v1beta1.ServiceAffinityArgs, out *config.ServiceAffinityArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_ServiceAffinityArgs_To_config_ServiceAffinityArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_ServiceAffinityArgs_To_v1beta1_ServiceAffinityArgs(in *config.ServiceAffinityArgs, out *v1beta1.ServiceAffinityArgs, s conversion.Scope) error {
 | 
			
		||||
	out.AffinityLabels = *(*[]string)(unsafe.Pointer(&in.AffinityLabels))
 | 
			
		||||
	out.AntiAffinityLabelsPreference = *(*[]string)(unsafe.Pointer(&in.AntiAffinityLabelsPreference))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_ServiceAffinityArgs_To_v1beta1_ServiceAffinityArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_ServiceAffinityArgs_To_v1beta1_ServiceAffinityArgs(in *config.ServiceAffinityArgs, out *v1beta1.ServiceAffinityArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_ServiceAffinityArgs_To_v1beta1_ServiceAffinityArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_UtilizationShapePoint_To_config_UtilizationShapePoint(in *v1beta1.UtilizationShapePoint, out *config.UtilizationShapePoint, s conversion.Scope) error {
 | 
			
		||||
	out.Utilization = in.Utilization
 | 
			
		||||
	out.Score = in.Score
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_UtilizationShapePoint_To_config_UtilizationShapePoint is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_UtilizationShapePoint_To_config_UtilizationShapePoint(in *v1beta1.UtilizationShapePoint, out *config.UtilizationShapePoint, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_UtilizationShapePoint_To_config_UtilizationShapePoint(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_UtilizationShapePoint_To_v1beta1_UtilizationShapePoint(in *config.UtilizationShapePoint, out *v1beta1.UtilizationShapePoint, s conversion.Scope) error {
 | 
			
		||||
	out.Utilization = in.Utilization
 | 
			
		||||
	out.Score = in.Score
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_UtilizationShapePoint_To_v1beta1_UtilizationShapePoint is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_UtilizationShapePoint_To_v1beta1_UtilizationShapePoint(in *config.UtilizationShapePoint, out *v1beta1.UtilizationShapePoint, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_UtilizationShapePoint_To_v1beta1_UtilizationShapePoint(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_v1beta1_VolumeBindingArgs_To_config_VolumeBindingArgs(in *v1beta1.VolumeBindingArgs, out *config.VolumeBindingArgs, s conversion.Scope) error {
 | 
			
		||||
	if err := v1.Convert_Pointer_int64_To_int64(&in.BindTimeoutSeconds, &out.BindTimeoutSeconds, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	out.Shape = *(*[]config.UtilizationShapePoint)(unsafe.Pointer(&in.Shape))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_v1beta1_VolumeBindingArgs_To_config_VolumeBindingArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_v1beta1_VolumeBindingArgs_To_config_VolumeBindingArgs(in *v1beta1.VolumeBindingArgs, out *config.VolumeBindingArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_v1beta1_VolumeBindingArgs_To_config_VolumeBindingArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func autoConvert_config_VolumeBindingArgs_To_v1beta1_VolumeBindingArgs(in *config.VolumeBindingArgs, out *v1beta1.VolumeBindingArgs, s conversion.Scope) error {
 | 
			
		||||
	if err := v1.Convert_int64_To_Pointer_int64(&in.BindTimeoutSeconds, &out.BindTimeoutSeconds, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	out.Shape = *(*[]v1beta1.UtilizationShapePoint)(unsafe.Pointer(&in.Shape))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert_config_VolumeBindingArgs_To_v1beta1_VolumeBindingArgs is an autogenerated conversion function.
 | 
			
		||||
func Convert_config_VolumeBindingArgs_To_v1beta1_VolumeBindingArgs(in *config.VolumeBindingArgs, out *v1beta1.VolumeBindingArgs, s conversion.Scope) error {
 | 
			
		||||
	return autoConvert_config_VolumeBindingArgs_To_v1beta1_VolumeBindingArgs(in, out, s)
 | 
			
		||||
}
 | 
			
		||||
@@ -1,22 +0,0 @@
 | 
			
		||||
//go:build !ignore_autogenerated
 | 
			
		||||
// +build !ignore_autogenerated
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Copyright 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.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// Code generated by deepcopy-gen. DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
package v1beta1
 | 
			
		||||
@@ -1,94 +0,0 @@
 | 
			
		||||
//go:build !ignore_autogenerated
 | 
			
		||||
// +build !ignore_autogenerated
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Copyright 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.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// Code generated by defaulter-gen. DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
package v1beta1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	runtime "k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
	v1beta1 "k8s.io/kube-scheduler/config/v1beta1"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// RegisterDefaults adds defaulters functions to the given scheme.
 | 
			
		||||
// Public to allow building arbitrary schemes.
 | 
			
		||||
// All generated defaulters are covering - they call all nested defaulters.
 | 
			
		||||
func RegisterDefaults(scheme *runtime.Scheme) error {
 | 
			
		||||
	scheme.AddTypeDefaultingFunc(&v1beta1.DefaultPreemptionArgs{}, func(obj interface{}) { SetObjectDefaults_DefaultPreemptionArgs(obj.(*v1beta1.DefaultPreemptionArgs)) })
 | 
			
		||||
	scheme.AddTypeDefaultingFunc(&v1beta1.InterPodAffinityArgs{}, func(obj interface{}) { SetObjectDefaults_InterPodAffinityArgs(obj.(*v1beta1.InterPodAffinityArgs)) })
 | 
			
		||||
	scheme.AddTypeDefaultingFunc(&v1beta1.KubeSchedulerConfiguration{}, func(obj interface{}) {
 | 
			
		||||
		SetObjectDefaults_KubeSchedulerConfiguration(obj.(*v1beta1.KubeSchedulerConfiguration))
 | 
			
		||||
	})
 | 
			
		||||
	scheme.AddTypeDefaultingFunc(&v1beta1.NodeResourcesBalancedAllocationArgs{}, func(obj interface{}) {
 | 
			
		||||
		SetObjectDefaults_NodeResourcesBalancedAllocationArgs(obj.(*v1beta1.NodeResourcesBalancedAllocationArgs))
 | 
			
		||||
	})
 | 
			
		||||
	scheme.AddTypeDefaultingFunc(&v1beta1.NodeResourcesFitArgs{}, func(obj interface{}) { SetObjectDefaults_NodeResourcesFitArgs(obj.(*v1beta1.NodeResourcesFitArgs)) })
 | 
			
		||||
	scheme.AddTypeDefaultingFunc(&v1beta1.NodeResourcesLeastAllocatedArgs{}, func(obj interface{}) {
 | 
			
		||||
		SetObjectDefaults_NodeResourcesLeastAllocatedArgs(obj.(*v1beta1.NodeResourcesLeastAllocatedArgs))
 | 
			
		||||
	})
 | 
			
		||||
	scheme.AddTypeDefaultingFunc(&v1beta1.NodeResourcesMostAllocatedArgs{}, func(obj interface{}) {
 | 
			
		||||
		SetObjectDefaults_NodeResourcesMostAllocatedArgs(obj.(*v1beta1.NodeResourcesMostAllocatedArgs))
 | 
			
		||||
	})
 | 
			
		||||
	scheme.AddTypeDefaultingFunc(&v1beta1.PodTopologySpreadArgs{}, func(obj interface{}) { SetObjectDefaults_PodTopologySpreadArgs(obj.(*v1beta1.PodTopologySpreadArgs)) })
 | 
			
		||||
	scheme.AddTypeDefaultingFunc(&v1beta1.RequestedToCapacityRatioArgs{}, func(obj interface{}) {
 | 
			
		||||
		SetObjectDefaults_RequestedToCapacityRatioArgs(obj.(*v1beta1.RequestedToCapacityRatioArgs))
 | 
			
		||||
	})
 | 
			
		||||
	scheme.AddTypeDefaultingFunc(&v1beta1.VolumeBindingArgs{}, func(obj interface{}) { SetObjectDefaults_VolumeBindingArgs(obj.(*v1beta1.VolumeBindingArgs)) })
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetObjectDefaults_DefaultPreemptionArgs(in *v1beta1.DefaultPreemptionArgs) {
 | 
			
		||||
	SetDefaults_DefaultPreemptionArgs(in)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetObjectDefaults_InterPodAffinityArgs(in *v1beta1.InterPodAffinityArgs) {
 | 
			
		||||
	SetDefaults_InterPodAffinityArgs(in)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetObjectDefaults_KubeSchedulerConfiguration(in *v1beta1.KubeSchedulerConfiguration) {
 | 
			
		||||
	SetDefaults_KubeSchedulerConfiguration(in)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetObjectDefaults_NodeResourcesBalancedAllocationArgs(in *v1beta1.NodeResourcesBalancedAllocationArgs) {
 | 
			
		||||
	SetDefaults_NodeResourcesBalancedAllocationArgs(in)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetObjectDefaults_NodeResourcesFitArgs(in *v1beta1.NodeResourcesFitArgs) {
 | 
			
		||||
	SetDefaults_NodeResourcesFitArgs(in)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetObjectDefaults_NodeResourcesLeastAllocatedArgs(in *v1beta1.NodeResourcesLeastAllocatedArgs) {
 | 
			
		||||
	SetDefaults_NodeResourcesLeastAllocatedArgs(in)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetObjectDefaults_NodeResourcesMostAllocatedArgs(in *v1beta1.NodeResourcesMostAllocatedArgs) {
 | 
			
		||||
	SetDefaults_NodeResourcesMostAllocatedArgs(in)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetObjectDefaults_PodTopologySpreadArgs(in *v1beta1.PodTopologySpreadArgs) {
 | 
			
		||||
	SetDefaults_PodTopologySpreadArgs(in)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetObjectDefaults_RequestedToCapacityRatioArgs(in *v1beta1.RequestedToCapacityRatioArgs) {
 | 
			
		||||
	SetDefaults_RequestedToCapacityRatioArgs(in)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetObjectDefaults_VolumeBindingArgs(in *v1beta1.VolumeBindingArgs) {
 | 
			
		||||
	SetDefaults_VolumeBindingArgs(in)
 | 
			
		||||
}
 | 
			
		||||
@@ -33,7 +33,6 @@ import (
 | 
			
		||||
	componentbasevalidation "k8s.io/component-base/config/validation"
 | 
			
		||||
	v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config/v1beta1"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config/v1beta2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -126,10 +125,6 @@ type removedPlugins struct {
 | 
			
		||||
// Remember to add an entry to that list when creating a new component config
 | 
			
		||||
// version (even if the list of removed plugins is empty).
 | 
			
		||||
var removedPluginsByVersion = []removedPlugins{
 | 
			
		||||
	{
 | 
			
		||||
		schemeGroupVersion: v1beta1.SchemeGroupVersion.String(),
 | 
			
		||||
		plugins:            []string{},
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		schemeGroupVersion: v1beta2.SchemeGroupVersion.String(),
 | 
			
		||||
		plugins: []string{
 | 
			
		||||
@@ -143,39 +138,6 @@ var removedPluginsByVersion = []removedPlugins{
 | 
			
		||||
	},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// conflictScorePluginsByVersion maintains a map of conflict plugins in each version.
 | 
			
		||||
// Remember to add an entry to that list when creating a new component config
 | 
			
		||||
// version (even if the list of conflict plugins is empty).
 | 
			
		||||
var conflictScorePluginsByVersion = map[string]map[string]sets.String{
 | 
			
		||||
	v1beta1.SchemeGroupVersion.String(): {
 | 
			
		||||
		"NodeResourcesFit": sets.NewString(
 | 
			
		||||
			"NodeResourcesLeastAllocated",
 | 
			
		||||
			"NodeResourcesMostAllocated",
 | 
			
		||||
			"RequestedToCapacityRatio"),
 | 
			
		||||
	},
 | 
			
		||||
	v1beta2.SchemeGroupVersion.String(): nil,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// isScorePluginConflict checks if a given plugin was conflict with other plugin in the given component
 | 
			
		||||
// config version or earlier.
 | 
			
		||||
func isScorePluginConflict(apiVersion string, name string, profile *config.KubeSchedulerProfile) []string {
 | 
			
		||||
	var conflictPlugins []string
 | 
			
		||||
	cp, ok := conflictScorePluginsByVersion[apiVersion]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	plugin, ok := cp[name]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	for _, p := range profile.Plugins.Score.Enabled {
 | 
			
		||||
		if plugin.Has(p.Name) {
 | 
			
		||||
			conflictPlugins = append(conflictPlugins, p.Name)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return conflictPlugins
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// isPluginRemoved checks if a given plugin was removed in the given component
 | 
			
		||||
// config version or earlier.
 | 
			
		||||
func isPluginRemoved(apiVersion string, name string) (bool, string) {
 | 
			
		||||
@@ -202,16 +164,6 @@ func validatePluginSetForRemovedPlugins(path *field.Path, apiVersion string, ps
 | 
			
		||||
	return errs
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func validateScorePluginSetForConflictPlugins(path *field.Path, apiVersion string, profile *config.KubeSchedulerProfile) []error {
 | 
			
		||||
	var errs []error
 | 
			
		||||
	for i, plugin := range profile.Plugins.Score.Enabled {
 | 
			
		||||
		if cp := isScorePluginConflict(apiVersion, plugin.Name, profile); len(cp) > 0 {
 | 
			
		||||
			errs = append(errs, field.Invalid(path.Child("enabled").Index(i), plugin.Name, fmt.Sprintf("was conflict with %q in version %q (KubeSchedulerConfiguration is version %q)", cp, apiVersion, apiVersion)))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return errs
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func validateKubeSchedulerProfile(path *field.Path, apiVersion string, profile *config.KubeSchedulerProfile) []error {
 | 
			
		||||
	var errs []error
 | 
			
		||||
	if len(profile.SchedulerName) == 0 {
 | 
			
		||||
@@ -257,8 +209,6 @@ func validatePluginConfig(path *field.Path, apiVersion string, profile *config.K
 | 
			
		||||
			errs = append(errs, validatePluginSetForRemovedPlugins(
 | 
			
		||||
				pluginsPath.Child(s), apiVersion, p)...)
 | 
			
		||||
		}
 | 
			
		||||
		errs = append(errs, validateScorePluginSetForConflictPlugins(
 | 
			
		||||
			pluginsPath.Child("score"), apiVersion, profile)...)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	seenPluginConfig := make(sets.String)
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,6 @@ import (
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	componentbaseconfig "k8s.io/component-base/config"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config/v1beta1"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config/v1beta2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -209,37 +208,9 @@ func TestValidateKubeSchedulerConfiguration(t *testing.T) {
 | 
			
		||||
	badRemovedPlugins3 := validConfig.DeepCopy() // default v1beta2
 | 
			
		||||
	badRemovedPlugins3.Profiles[0].Plugins.Score.Enabled = append(badRemovedPlugins3.Profiles[0].Plugins.Score.Enabled, config.Plugin{Name: "NodeResourcesMostAllocated", Weight: 2})
 | 
			
		||||
 | 
			
		||||
	goodRemovedPlugins1 := validConfig.DeepCopy() // ServiceAffinity is okay in v1beta1.
 | 
			
		||||
	goodRemovedPlugins1.APIVersion = v1beta1.SchemeGroupVersion.String()
 | 
			
		||||
	goodRemovedPlugins1.Profiles[0].Plugins.Score.Enabled = append(goodRemovedPlugins1.Profiles[0].Plugins.Score.Enabled, config.Plugin{Name: "ServiceAffinity", Weight: 2})
 | 
			
		||||
 | 
			
		||||
	goodRemovedPlugins2 := validConfig.DeepCopy()
 | 
			
		||||
	goodRemovedPlugins2.Profiles[0].Plugins.Score.Enabled = append(goodRemovedPlugins2.Profiles[0].Plugins.Score.Enabled, config.Plugin{Name: "PodTopologySpread", Weight: 2})
 | 
			
		||||
 | 
			
		||||
	goodRemovedPlugins3 := validConfig.DeepCopy()
 | 
			
		||||
	goodRemovedPlugins3.APIVersion = v1beta1.SchemeGroupVersion.String()
 | 
			
		||||
	goodRemovedPlugins3.Profiles[0].Plugins.Score.Enabled = append(goodRemovedPlugins3.Profiles[0].Plugins.Score.Enabled, config.Plugin{Name: "NodeResourcesMostAllocated", Weight: 2})
 | 
			
		||||
 | 
			
		||||
	badConflictPlugins1 := validConfig.DeepCopy()
 | 
			
		||||
	badConflictPlugins1.APIVersion = v1beta1.SchemeGroupVersion.String()
 | 
			
		||||
	badConflictPlugins1.Profiles[0].Plugins.Score.Enabled = append(badConflictPlugins1.Profiles[0].Plugins.Score.Enabled, config.Plugin{Name: "NodeResourcesFit", Weight: 2})
 | 
			
		||||
	badConflictPlugins1.Profiles[0].Plugins.Score.Enabled = append(badConflictPlugins1.Profiles[0].Plugins.Score.Enabled, config.Plugin{Name: "NodeResourcesLeastAllocated", Weight: 2})
 | 
			
		||||
	badConflictPlugins1.Profiles[0].Plugins.Score.Enabled = append(badConflictPlugins1.Profiles[0].Plugins.Score.Enabled, config.Plugin{Name: "NodeResourcesMostAllocated", Weight: 2})
 | 
			
		||||
	badConflictPlugins1.Profiles[0].Plugins.Score.Enabled = append(badConflictPlugins1.Profiles[0].Plugins.Score.Enabled, config.Plugin{Name: "RequestedToCapacityRatio", Weight: 2})
 | 
			
		||||
 | 
			
		||||
	goodConflictPlugins1 := validConfig.DeepCopy()
 | 
			
		||||
	goodConflictPlugins1.APIVersion = v1beta1.SchemeGroupVersion.String()
 | 
			
		||||
	goodConflictPlugins1.Profiles[0].Plugins.Score.Enabled = append(goodConflictPlugins1.Profiles[0].Plugins.Score.Enabled, config.Plugin{Name: "NodeResourcesLeastAllocated", Weight: 2})
 | 
			
		||||
	goodConflictPlugins1.Profiles[0].Plugins.Score.Enabled = append(goodConflictPlugins1.Profiles[0].Plugins.Score.Enabled, config.Plugin{Name: "NodeResourcesMostAllocated", Weight: 2})
 | 
			
		||||
	goodConflictPlugins1.Profiles[0].Plugins.Score.Enabled = append(goodConflictPlugins1.Profiles[0].Plugins.Score.Enabled, config.Plugin{Name: "RequestedToCapacityRatio", Weight: 2})
 | 
			
		||||
 | 
			
		||||
	goodConflictPlugins2 := validConfig.DeepCopy()
 | 
			
		||||
	goodConflictPlugins2.APIVersion = v1beta1.SchemeGroupVersion.String()
 | 
			
		||||
	goodConflictPlugins2.Profiles[0].Plugins.Filter.Enabled = append(goodConflictPlugins2.Profiles[0].Plugins.Filter.Enabled, config.Plugin{Name: "NodeResourcesFit", Weight: 2})
 | 
			
		||||
	goodConflictPlugins2.Profiles[0].Plugins.Score.Enabled = append(goodConflictPlugins2.Profiles[0].Plugins.Score.Enabled, config.Plugin{Name: "NodeResourcesLeastAllocated", Weight: 2})
 | 
			
		||||
	goodConflictPlugins2.Profiles[0].Plugins.Score.Enabled = append(goodConflictPlugins2.Profiles[0].Plugins.Score.Enabled, config.Plugin{Name: "NodeResourcesMostAllocated", Weight: 2})
 | 
			
		||||
	goodConflictPlugins2.Profiles[0].Plugins.Score.Enabled = append(goodConflictPlugins2.Profiles[0].Plugins.Score.Enabled, config.Plugin{Name: "RequestedToCapacityRatio", Weight: 2})
 | 
			
		||||
 | 
			
		||||
	deprecatedPluginsConfig := validConfig.DeepCopy()
 | 
			
		||||
	deprecatedPluginsConfig.Profiles[0].PluginConfig = append(deprecatedPluginsConfig.Profiles[0].PluginConfig, config.PluginConfig{
 | 
			
		||||
		Name: "NodeResourcesLeastAllocated",
 | 
			
		||||
@@ -335,31 +306,10 @@ func TestValidateKubeSchedulerConfiguration(t *testing.T) {
 | 
			
		||||
			expectedToFail: true,
 | 
			
		||||
			config:         badRemovedPlugins3,
 | 
			
		||||
		},
 | 
			
		||||
		"good-removed-plugins-1": {
 | 
			
		||||
			expectedToFail: false,
 | 
			
		||||
			config:         goodRemovedPlugins1,
 | 
			
		||||
		},
 | 
			
		||||
		"good-removed-plugins-2": {
 | 
			
		||||
			expectedToFail: false,
 | 
			
		||||
			config:         goodRemovedPlugins2,
 | 
			
		||||
		},
 | 
			
		||||
		"good-removed-plugins-3": {
 | 
			
		||||
			expectedToFail: false,
 | 
			
		||||
			config:         goodRemovedPlugins3,
 | 
			
		||||
		},
 | 
			
		||||
		"bad-conflict-plugins-1": {
 | 
			
		||||
			expectedToFail: true,
 | 
			
		||||
			config:         badConflictPlugins1,
 | 
			
		||||
			errorString:    "profiles[0].plugins.score.enabled[0]: Invalid value: \"NodeResourcesFit\": was conflict with [\"NodeResourcesLeastAllocated\" \"NodeResourcesMostAllocated\" \"RequestedToCapacityRatio\"] in version \"kubescheduler.config.k8s.io/v1beta1\" (KubeSchedulerConfiguration is version \"kubescheduler.config.k8s.io/v1beta1\")",
 | 
			
		||||
		},
 | 
			
		||||
		"good-conflict-plugins-1": {
 | 
			
		||||
			expectedToFail: false,
 | 
			
		||||
			config:         goodConflictPlugins1,
 | 
			
		||||
		},
 | 
			
		||||
		"good-conflict-plugins-2": {
 | 
			
		||||
			expectedToFail: false,
 | 
			
		||||
			config:         goodConflictPlugins2,
 | 
			
		||||
		},
 | 
			
		||||
		"bad-plugins-config": {
 | 
			
		||||
			expectedToFail: true,
 | 
			
		||||
			config:         deprecatedPluginsConfig,
 | 
			
		||||
 
 | 
			
		||||
@@ -35,10 +35,10 @@ import (
 | 
			
		||||
	clientsetfake "k8s.io/client-go/kubernetes/fake"
 | 
			
		||||
	clienttesting "k8s.io/client-go/testing"
 | 
			
		||||
	"k8s.io/client-go/tools/events"
 | 
			
		||||
	kubeschedulerconfigv1beta1 "k8s.io/kube-scheduler/config/v1beta1"
 | 
			
		||||
	kubeschedulerconfigv1beta2 "k8s.io/kube-scheduler/config/v1beta2"
 | 
			
		||||
	extenderv1 "k8s.io/kube-scheduler/extender/v1"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config"
 | 
			
		||||
	configv1beta1 "k8s.io/kubernetes/pkg/scheduler/apis/config/v1beta1"
 | 
			
		||||
	configv1beta2 "k8s.io/kubernetes/pkg/scheduler/apis/config/v1beta2"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/framework"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultbinder"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/framework/plugins/feature"
 | 
			
		||||
@@ -86,10 +86,10 @@ var (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func getDefaultDefaultPreemptionArgs() *config.DefaultPreemptionArgs {
 | 
			
		||||
	v1beta1dpa := &kubeschedulerconfigv1beta1.DefaultPreemptionArgs{}
 | 
			
		||||
	configv1beta1.SetDefaults_DefaultPreemptionArgs(v1beta1dpa)
 | 
			
		||||
	v1beta2dpa := &kubeschedulerconfigv1beta2.DefaultPreemptionArgs{}
 | 
			
		||||
	configv1beta2.SetDefaults_DefaultPreemptionArgs(v1beta2dpa)
 | 
			
		||||
	dpa := &config.DefaultPreemptionArgs{}
 | 
			
		||||
	configv1beta1.Convert_v1beta1_DefaultPreemptionArgs_To_config_DefaultPreemptionArgs(v1beta1dpa, dpa, nil)
 | 
			
		||||
	configv1beta2.Convert_v1beta2_DefaultPreemptionArgs_To_config_DefaultPreemptionArgs(v1beta2dpa, dpa, nil)
 | 
			
		||||
	return dpa
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2020 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.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// +k8s:deepcopy-gen=package
 | 
			
		||||
// +k8s:openapi-gen=true
 | 
			
		||||
// +groupName=kubescheduler.config.k8s.io
 | 
			
		||||
 | 
			
		||||
package v1beta1 // import "k8s.io/kube-scheduler/config/v1beta1"
 | 
			
		||||
@@ -1,55 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2020 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 v1beta1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// GroupName is the group name used in this package
 | 
			
		||||
const GroupName = "kubescheduler.config.k8s.io"
 | 
			
		||||
 | 
			
		||||
// SchemeGroupVersion is group version used to register these objects
 | 
			
		||||
var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1beta1"}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// SchemeBuilder is the scheme builder with scheme init functions to run for this API package
 | 
			
		||||
	SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
 | 
			
		||||
	// AddToScheme is a global function that registers this API group & version to a scheme
 | 
			
		||||
	AddToScheme = SchemeBuilder.AddToScheme
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// addKnownTypes registers known types to the given scheme
 | 
			
		||||
func addKnownTypes(scheme *runtime.Scheme) error {
 | 
			
		||||
	scheme.AddKnownTypes(SchemeGroupVersion,
 | 
			
		||||
		&KubeSchedulerConfiguration{},
 | 
			
		||||
		&DefaultPreemptionArgs{},
 | 
			
		||||
		&InterPodAffinityArgs{},
 | 
			
		||||
		&NodeLabelArgs{},
 | 
			
		||||
		&NodeResourcesFitArgs{},
 | 
			
		||||
		&PodTopologySpreadArgs{},
 | 
			
		||||
		&RequestedToCapacityRatioArgs{},
 | 
			
		||||
		&ServiceAffinityArgs{},
 | 
			
		||||
		&NodeResourcesBalancedAllocationArgs{},
 | 
			
		||||
		&NodeResourcesLeastAllocatedArgs{},
 | 
			
		||||
		&NodeResourcesMostAllocatedArgs{},
 | 
			
		||||
		&VolumeBindingArgs{},
 | 
			
		||||
		&NodeAffinityArgs{},
 | 
			
		||||
	)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
@@ -1,310 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2020 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 v1beta1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
	componentbaseconfigv1alpha1 "k8s.io/component-base/config/v1alpha1"
 | 
			
		||||
	v1 "k8s.io/kube-scheduler/config/v1"
 | 
			
		||||
	"sigs.k8s.io/yaml"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// SchedulerDefaultLockObjectNamespace defines default scheduler lock object namespace ("kube-system")
 | 
			
		||||
	SchedulerDefaultLockObjectNamespace string = metav1.NamespaceSystem
 | 
			
		||||
 | 
			
		||||
	// SchedulerDefaultLockObjectName defines default scheduler lock object name ("kube-scheduler")
 | 
			
		||||
	SchedulerDefaultLockObjectName = "kube-scheduler"
 | 
			
		||||
 | 
			
		||||
	// SchedulerDefaultProviderName defines the default provider names
 | 
			
		||||
	SchedulerDefaultProviderName = "DefaultProvider"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | 
			
		||||
 | 
			
		||||
// KubeSchedulerConfiguration configures a scheduler
 | 
			
		||||
type KubeSchedulerConfiguration struct {
 | 
			
		||||
	metav1.TypeMeta `json:",inline"`
 | 
			
		||||
 | 
			
		||||
	// Parallelism defines the amount of parallelism in algorithms for scheduling a Pods. Must be greater than 0. Defaults to 16
 | 
			
		||||
	Parallelism *int32 `json:"parallelism,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// LeaderElection defines the configuration of leader election client.
 | 
			
		||||
	LeaderElection componentbaseconfigv1alpha1.LeaderElectionConfiguration `json:"leaderElection"`
 | 
			
		||||
 | 
			
		||||
	// ClientConnection specifies the kubeconfig file and client connection
 | 
			
		||||
	// settings for the proxy server to use when communicating with the apiserver.
 | 
			
		||||
	ClientConnection componentbaseconfigv1alpha1.ClientConnectionConfiguration `json:"clientConnection"`
 | 
			
		||||
 | 
			
		||||
	// Note: Both HealthzBindAddress and MetricsBindAddress fields are deprecated.
 | 
			
		||||
	// Only empty address or port 0 is allowed. Anything else will fail validation.
 | 
			
		||||
	// HealthzBindAddress is the IP address and port for the health check server to serve on.
 | 
			
		||||
	HealthzBindAddress *string `json:"healthzBindAddress,omitempty"`
 | 
			
		||||
	// MetricsBindAddress is the IP address and port for the metrics server to serve on.
 | 
			
		||||
	MetricsBindAddress *string `json:"metricsBindAddress,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// DebuggingConfiguration holds configuration for Debugging related features
 | 
			
		||||
	// TODO: We might wanna make this a substruct like Debugging componentbaseconfigv1alpha1.DebuggingConfiguration
 | 
			
		||||
	componentbaseconfigv1alpha1.DebuggingConfiguration `json:",inline"`
 | 
			
		||||
 | 
			
		||||
	// PercentageOfNodesToScore is the percentage of all nodes that once found feasible
 | 
			
		||||
	// for running a pod, the scheduler stops its search for more feasible nodes in
 | 
			
		||||
	// the cluster. This helps improve scheduler's performance. Scheduler always tries to find
 | 
			
		||||
	// at least "minFeasibleNodesToFind" feasible nodes no matter what the value of this flag is.
 | 
			
		||||
	// Example: if the cluster size is 500 nodes and the value of this flag is 30,
 | 
			
		||||
	// then scheduler stops finding further feasible nodes once it finds 150 feasible ones.
 | 
			
		||||
	// When the value is 0, default percentage (5%--50% based on the size of the cluster) of the
 | 
			
		||||
	// nodes will be scored.
 | 
			
		||||
	PercentageOfNodesToScore *int32 `json:"percentageOfNodesToScore,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// PodInitialBackoffSeconds is the initial backoff for unschedulable pods.
 | 
			
		||||
	// If specified, it must be greater than 0. If this value is null, the default value (1s)
 | 
			
		||||
	// will be used.
 | 
			
		||||
	PodInitialBackoffSeconds *int64 `json:"podInitialBackoffSeconds,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// PodMaxBackoffSeconds is the max backoff for unschedulable pods.
 | 
			
		||||
	// If specified, it must be greater than podInitialBackoffSeconds. If this value is null,
 | 
			
		||||
	// the default value (10s) will be used.
 | 
			
		||||
	PodMaxBackoffSeconds *int64 `json:"podMaxBackoffSeconds,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// Profiles are scheduling profiles that kube-scheduler supports. Pods can
 | 
			
		||||
	// choose to be scheduled under a particular profile by setting its associated
 | 
			
		||||
	// scheduler name. Pods that don't specify any scheduler name are scheduled
 | 
			
		||||
	// with the "default-scheduler" profile, if present here.
 | 
			
		||||
	// +listType=map
 | 
			
		||||
	// +listMapKey=schedulerName
 | 
			
		||||
	Profiles []KubeSchedulerProfile `json:"profiles,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// Extenders are the list of scheduler extenders, each holding the values of how to communicate
 | 
			
		||||
	// with the extender. These extenders are shared by all scheduler profiles.
 | 
			
		||||
	// +listType=set
 | 
			
		||||
	Extenders []Extender `json:"extenders,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeNestedObjects decodes plugin args for known types.
 | 
			
		||||
func (c *KubeSchedulerConfiguration) DecodeNestedObjects(d runtime.Decoder) error {
 | 
			
		||||
	for i := range c.Profiles {
 | 
			
		||||
		prof := &c.Profiles[i]
 | 
			
		||||
		for j := range prof.PluginConfig {
 | 
			
		||||
			err := prof.PluginConfig[j].decodeNestedObjects(d)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return fmt.Errorf("decoding .profiles[%d].pluginConfig[%d]: %w", i, j, err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncodeNestedObjects encodes plugin args.
 | 
			
		||||
func (c *KubeSchedulerConfiguration) EncodeNestedObjects(e runtime.Encoder) error {
 | 
			
		||||
	for i := range c.Profiles {
 | 
			
		||||
		prof := &c.Profiles[i]
 | 
			
		||||
		for j := range prof.PluginConfig {
 | 
			
		||||
			err := prof.PluginConfig[j].encodeNestedObjects(e)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return fmt.Errorf("encoding .profiles[%d].pluginConfig[%d]: %w", i, j, err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// KubeSchedulerProfile is a scheduling profile.
 | 
			
		||||
type KubeSchedulerProfile struct {
 | 
			
		||||
	// SchedulerName is the name of the scheduler associated to this profile.
 | 
			
		||||
	// If SchedulerName matches with the pod's "spec.schedulerName", then the pod
 | 
			
		||||
	// is scheduled with this profile.
 | 
			
		||||
	SchedulerName *string `json:"schedulerName,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// Plugins specify the set of plugins that should be enabled or disabled.
 | 
			
		||||
	// Enabled plugins are the ones that should be enabled in addition to the
 | 
			
		||||
	// default plugins. Disabled plugins are any of the default plugins that
 | 
			
		||||
	// should be disabled.
 | 
			
		||||
	// When no enabled or disabled plugin is specified for an extension point,
 | 
			
		||||
	// default plugins for that extension point will be used if there is any.
 | 
			
		||||
	// If a QueueSort plugin is specified, the same QueueSort Plugin and
 | 
			
		||||
	// PluginConfig must be specified for all profiles.
 | 
			
		||||
	Plugins *Plugins `json:"plugins,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// PluginConfig is an optional set of custom plugin arguments for each plugin.
 | 
			
		||||
	// Omitting config args for a plugin is equivalent to using the default config
 | 
			
		||||
	// for that plugin.
 | 
			
		||||
	// +listType=map
 | 
			
		||||
	// +listMapKey=name
 | 
			
		||||
	PluginConfig []PluginConfig `json:"pluginConfig,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Plugins include multiple extension points. When specified, the list of plugins for
 | 
			
		||||
// a particular extension point are the only ones enabled. If an extension point is
 | 
			
		||||
// omitted from the config, then the default set of plugins is used for that extension point.
 | 
			
		||||
// Enabled plugins are called in the order specified here, after default plugins. If they need to
 | 
			
		||||
// be invoked before default plugins, default plugins must be disabled and re-enabled here in desired order.
 | 
			
		||||
type Plugins struct {
 | 
			
		||||
	// QueueSort is a list of plugins that should be invoked when sorting pods in the scheduling queue.
 | 
			
		||||
	QueueSort *PluginSet `json:"queueSort,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// PreFilter is a list of plugins that should be invoked at "PreFilter" extension point of the scheduling framework.
 | 
			
		||||
	PreFilter *PluginSet `json:"preFilter,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// Filter is a list of plugins that should be invoked when filtering out nodes that cannot run the Pod.
 | 
			
		||||
	Filter *PluginSet `json:"filter,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// PostFilter is a list of plugins that are invoked after filtering phase, no matter whether filtering succeeds or not.
 | 
			
		||||
	PostFilter *PluginSet `json:"postFilter,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// PreScore is a list of plugins that are invoked before scoring.
 | 
			
		||||
	PreScore *PluginSet `json:"preScore,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// Score is a list of plugins that should be invoked when ranking nodes that have passed the filtering phase.
 | 
			
		||||
	Score *PluginSet `json:"score,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// Reserve is a list of plugins invoked when reserving/unreserving resources
 | 
			
		||||
	// after a node is assigned to run the pod.
 | 
			
		||||
	Reserve *PluginSet `json:"reserve,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// Permit is a list of plugins that control binding of a Pod. These plugins can prevent or delay binding of a Pod.
 | 
			
		||||
	Permit *PluginSet `json:"permit,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// PreBind is a list of plugins that should be invoked before a pod is bound.
 | 
			
		||||
	PreBind *PluginSet `json:"preBind,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// Bind is a list of plugins that should be invoked at "Bind" extension point of the scheduling framework.
 | 
			
		||||
	// The scheduler call these plugins in order. Scheduler skips the rest of these plugins as soon as one returns success.
 | 
			
		||||
	Bind *PluginSet `json:"bind,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// PostBind is a list of plugins that should be invoked after a pod is successfully bound.
 | 
			
		||||
	PostBind *PluginSet `json:"postBind,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PluginSet specifies enabled and disabled plugins for an extension point.
 | 
			
		||||
// If an array is empty, missing, or nil, default plugins at that extension point will be used.
 | 
			
		||||
type PluginSet struct {
 | 
			
		||||
	// Enabled specifies plugins that should be enabled in addition to default plugins.
 | 
			
		||||
	// These are called after default plugins and in the same order specified here.
 | 
			
		||||
	// +listType=atomic
 | 
			
		||||
	Enabled []Plugin `json:"enabled,omitempty"`
 | 
			
		||||
	// Disabled specifies default plugins that should be disabled.
 | 
			
		||||
	// When all default plugins need to be disabled, an array containing only one "*" should be provided.
 | 
			
		||||
	// +listType=map
 | 
			
		||||
	// +listMapKey=name
 | 
			
		||||
	Disabled []Plugin `json:"disabled,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Plugin specifies a plugin name and its weight when applicable. Weight is used only for Score plugins.
 | 
			
		||||
type Plugin struct {
 | 
			
		||||
	// Name defines the name of plugin
 | 
			
		||||
	Name string `json:"name"`
 | 
			
		||||
	// Weight defines the weight of plugin, only used for Score plugins.
 | 
			
		||||
	Weight *int32 `json:"weight,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PluginConfig specifies arguments that should be passed to a plugin at the time of initialization.
 | 
			
		||||
// A plugin that is invoked at multiple extension points is initialized once. Args can have arbitrary structure.
 | 
			
		||||
// It is up to the plugin to process these Args.
 | 
			
		||||
type PluginConfig struct {
 | 
			
		||||
	// Name defines the name of plugin being configured
 | 
			
		||||
	Name string `json:"name"`
 | 
			
		||||
	// Args defines the arguments passed to the plugins at the time of initialization. Args can have arbitrary structure.
 | 
			
		||||
	Args runtime.RawExtension `json:"args,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *PluginConfig) decodeNestedObjects(d runtime.Decoder) error {
 | 
			
		||||
	gvk := SchemeGroupVersion.WithKind(c.Name + "Args")
 | 
			
		||||
	// dry-run to detect and skip out-of-tree plugin args.
 | 
			
		||||
	if _, _, err := d.Decode(nil, &gvk, nil); runtime.IsNotRegisteredError(err) {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	obj, parsedGvk, err := d.Decode(c.Args.Raw, &gvk, nil)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("decoding args for plugin %s: %w", c.Name, err)
 | 
			
		||||
	}
 | 
			
		||||
	if parsedGvk.GroupKind() != gvk.GroupKind() {
 | 
			
		||||
		return fmt.Errorf("args for plugin %s were not of type %s, got %s", c.Name, gvk.GroupKind(), parsedGvk.GroupKind())
 | 
			
		||||
	}
 | 
			
		||||
	c.Args.Object = obj
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *PluginConfig) encodeNestedObjects(e runtime.Encoder) error {
 | 
			
		||||
	if c.Args.Object == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	var buf bytes.Buffer
 | 
			
		||||
	err := e.Encode(c.Args.Object, &buf)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	// The <e> encoder might be a YAML encoder, but the parent encoder expects
 | 
			
		||||
	// JSON output, so we convert YAML back to JSON.
 | 
			
		||||
	// This is a no-op if <e> produces JSON.
 | 
			
		||||
	json, err := yaml.YAMLToJSON(buf.Bytes())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	c.Args.Raw = json
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Extender holds the parameters used to communicate with the extender. If a verb is unspecified/empty,
 | 
			
		||||
// it is assumed that the extender chose not to provide that extension.
 | 
			
		||||
type Extender struct {
 | 
			
		||||
	// URLPrefix at which the extender is available
 | 
			
		||||
	URLPrefix string `json:"urlPrefix"`
 | 
			
		||||
	// Verb for the filter call, empty if not supported. This verb is appended to the URLPrefix when issuing the filter call to extender.
 | 
			
		||||
	FilterVerb string `json:"filterVerb,omitempty"`
 | 
			
		||||
	// Verb for the preempt call, empty if not supported. This verb is appended to the URLPrefix when issuing the preempt call to extender.
 | 
			
		||||
	PreemptVerb string `json:"preemptVerb,omitempty"`
 | 
			
		||||
	// Verb for the prioritize call, empty if not supported. This verb is appended to the URLPrefix when issuing the prioritize call to extender.
 | 
			
		||||
	PrioritizeVerb string `json:"prioritizeVerb,omitempty"`
 | 
			
		||||
	// The numeric multiplier for the node scores that the prioritize call generates.
 | 
			
		||||
	// The weight should be a positive integer
 | 
			
		||||
	Weight int64 `json:"weight,omitempty"`
 | 
			
		||||
	// Verb for the bind call, empty if not supported. This verb is appended to the URLPrefix when issuing the bind call to extender.
 | 
			
		||||
	// If this method is implemented by the extender, it is the extender's responsibility to bind the pod to apiserver. Only one extender
 | 
			
		||||
	// can implement this function.
 | 
			
		||||
	BindVerb string `json:"bindVerb,omitempty"`
 | 
			
		||||
	// EnableHTTPS specifies whether https should be used to communicate with the extender
 | 
			
		||||
	EnableHTTPS bool `json:"enableHTTPS,omitempty"`
 | 
			
		||||
	// TLSConfig specifies the transport layer security config
 | 
			
		||||
	TLSConfig *v1.ExtenderTLSConfig `json:"tlsConfig,omitempty"`
 | 
			
		||||
	// HTTPTimeout specifies the timeout duration for a call to the extender. Filter timeout fails the scheduling of the pod. Prioritize
 | 
			
		||||
	// timeout is ignored, k8s/other extenders priorities are used to select the node.
 | 
			
		||||
	HTTPTimeout metav1.Duration `json:"httpTimeout,omitempty"`
 | 
			
		||||
	// NodeCacheCapable specifies that the extender is capable of caching node information,
 | 
			
		||||
	// so the scheduler should only send minimal information about the eligible nodes
 | 
			
		||||
	// assuming that the extender already cached full details of all nodes in the cluster
 | 
			
		||||
	NodeCacheCapable bool `json:"nodeCacheCapable,omitempty"`
 | 
			
		||||
	// ManagedResources is a list of extended resources that are managed by
 | 
			
		||||
	// this extender.
 | 
			
		||||
	// - A pod will be sent to the extender on the Filter, Prioritize and Bind
 | 
			
		||||
	//   (if the extender is the binder) phases iff the pod requests at least
 | 
			
		||||
	//   one of the extended resources in this list. If empty or unspecified,
 | 
			
		||||
	//   all pods will be sent to this extender.
 | 
			
		||||
	// - If IgnoredByScheduler is set to true for a resource, kube-scheduler
 | 
			
		||||
	//   will skip checking the resource in predicates.
 | 
			
		||||
	// +optional
 | 
			
		||||
	// +listType=atomic
 | 
			
		||||
	ManagedResources []v1.ExtenderManagedResource `json:"managedResources,omitempty"`
 | 
			
		||||
	// Ignorable specifies if the extender is ignorable, i.e. scheduling should not
 | 
			
		||||
	// fail when the extender returns an error or is not reachable.
 | 
			
		||||
	Ignorable bool `json:"ignorable,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
@@ -1,310 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2020 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 v1beta1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	corev1 "k8s.io/api/core/v1"
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | 
			
		||||
 | 
			
		||||
// DefaultPreemptionArgs holds arguments used to configure the
 | 
			
		||||
// DefaultPreemption plugin.
 | 
			
		||||
type DefaultPreemptionArgs struct {
 | 
			
		||||
	metav1.TypeMeta `json:",inline"`
 | 
			
		||||
 | 
			
		||||
	// MinCandidateNodesPercentage is the minimum number of candidates to
 | 
			
		||||
	// shortlist when dry running preemption as a percentage of number of nodes.
 | 
			
		||||
	// Must be in the range [0, 100]. Defaults to 10% of the cluster size if
 | 
			
		||||
	// unspecified.
 | 
			
		||||
	MinCandidateNodesPercentage *int32 `json:"minCandidateNodesPercentage,omitempty"`
 | 
			
		||||
	// MinCandidateNodesAbsolute is the absolute minimum number of candidates to
 | 
			
		||||
	// shortlist. The likely number of candidates enumerated for dry running
 | 
			
		||||
	// preemption is given by the formula:
 | 
			
		||||
	// numCandidates = max(numNodes * minCandidateNodesPercentage, minCandidateNodesAbsolute)
 | 
			
		||||
	// We say "likely" because there are other factors such as PDB violations
 | 
			
		||||
	// that play a role in the number of candidates shortlisted. Must be at least
 | 
			
		||||
	// 0 nodes. Defaults to 100 nodes if unspecified.
 | 
			
		||||
	MinCandidateNodesAbsolute *int32 `json:"minCandidateNodesAbsolute,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | 
			
		||||
 | 
			
		||||
// InterPodAffinityArgs holds arguments used to configure the InterPodAffinity plugin.
 | 
			
		||||
type InterPodAffinityArgs struct {
 | 
			
		||||
	metav1.TypeMeta `json:",inline"`
 | 
			
		||||
 | 
			
		||||
	// HardPodAffinityWeight is the scoring weight for existing pods with a
 | 
			
		||||
	// matching hard affinity to the incoming pod.
 | 
			
		||||
	HardPodAffinityWeight *int32 `json:"hardPodAffinityWeight,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | 
			
		||||
 | 
			
		||||
// NodeLabelArgs holds arguments used to configure the NodeLabel plugin.
 | 
			
		||||
//
 | 
			
		||||
// This plugin has been deprecated and is only configurable through the
 | 
			
		||||
// scheduler policy API and the v1beta1 component config API. It is recommended
 | 
			
		||||
// to use the NodeAffinity plugin instead.
 | 
			
		||||
type NodeLabelArgs struct {
 | 
			
		||||
	metav1.TypeMeta `json:",inline"`
 | 
			
		||||
 | 
			
		||||
	// PresentLabels should be present for the node to be considered a fit for hosting the pod
 | 
			
		||||
	// +listType=atomic
 | 
			
		||||
	PresentLabels []string `json:"presentLabels,omitempty"`
 | 
			
		||||
	// AbsentLabels should be absent for the node to be considered a fit for hosting the pod
 | 
			
		||||
	// +listType=atomic
 | 
			
		||||
	AbsentLabels []string `json:"absentLabels,omitempty"`
 | 
			
		||||
	// Nodes that have labels in the list will get a higher score.
 | 
			
		||||
	// +listType=atomic
 | 
			
		||||
	PresentLabelsPreference []string `json:"presentLabelsPreference,omitempty"`
 | 
			
		||||
	// Nodes that don't have labels in the list will get a higher score.
 | 
			
		||||
	// +listType=atomic
 | 
			
		||||
	AbsentLabelsPreference []string `json:"absentLabelsPreference,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | 
			
		||||
 | 
			
		||||
// NodeResourcesFitArgs holds arguments used to configure the NodeResourcesFit plugin.
 | 
			
		||||
type NodeResourcesFitArgs struct {
 | 
			
		||||
	metav1.TypeMeta `json:",inline"`
 | 
			
		||||
 | 
			
		||||
	// IgnoredResources is the list of resources that NodeResources fit filter
 | 
			
		||||
	// should ignore. This doesn't apply to scoring.
 | 
			
		||||
	// +listType=atomic
 | 
			
		||||
	IgnoredResources []string `json:"ignoredResources,omitempty"`
 | 
			
		||||
	// IgnoredResourceGroups defines the list of resource groups that NodeResources fit filter should ignore.
 | 
			
		||||
	// e.g. if group is ["example.com"], it will ignore all resource names that begin
 | 
			
		||||
	// with "example.com", such as "example.com/aaa" and "example.com/bbb".
 | 
			
		||||
	// A resource group name can't contain '/'. This doesn't apply to scoring.
 | 
			
		||||
	// +listType=atomic
 | 
			
		||||
	IgnoredResourceGroups []string `json:"ignoredResourceGroups,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// ScoringStrategy selects the node resource scoring strategy.
 | 
			
		||||
	// The default strategy is LeastAllocated with an equal "cpu" and "memory" weight.
 | 
			
		||||
	ScoringStrategy *ScoringStrategy `json:"scoringStrategy,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PodTopologySpreadConstraintsDefaulting defines how to set default constraints
 | 
			
		||||
// for the PodTopologySpread plugin.
 | 
			
		||||
type PodTopologySpreadConstraintsDefaulting string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// SystemDefaulting instructs to use the kubernetes defined default.
 | 
			
		||||
	SystemDefaulting PodTopologySpreadConstraintsDefaulting = "System"
 | 
			
		||||
	// ListDefaulting instructs to use the config provided default.
 | 
			
		||||
	ListDefaulting PodTopologySpreadConstraintsDefaulting = "List"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | 
			
		||||
 | 
			
		||||
// PodTopologySpreadArgs holds arguments used to configure the PodTopologySpread plugin.
 | 
			
		||||
type PodTopologySpreadArgs struct {
 | 
			
		||||
	metav1.TypeMeta `json:",inline"`
 | 
			
		||||
 | 
			
		||||
	// DefaultConstraints defines topology spread constraints to be applied to
 | 
			
		||||
	// Pods that don't define any in `pod.spec.topologySpreadConstraints`.
 | 
			
		||||
	// `.defaultConstraints[*].labelSelectors` must be empty, as they are
 | 
			
		||||
	// deduced from the Pod's membership to Services, ReplicationControllers,
 | 
			
		||||
	// ReplicaSets or StatefulSets.
 | 
			
		||||
	// When not empty, .defaultingType must be "List".
 | 
			
		||||
	// +optional
 | 
			
		||||
	// +listType=atomic
 | 
			
		||||
	DefaultConstraints []corev1.TopologySpreadConstraint `json:"defaultConstraints,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// DefaultingType determines how .defaultConstraints are deduced. Can be one
 | 
			
		||||
	// of "System" or "List".
 | 
			
		||||
	//
 | 
			
		||||
	// - "System": Use kubernetes defined constraints that spread Pods among
 | 
			
		||||
	//   Nodes and Zones.
 | 
			
		||||
	// - "List": Use constraints defined in .defaultConstraints.
 | 
			
		||||
	//
 | 
			
		||||
	// Defaults to "List" if feature gate DefaultPodTopologySpread is disabled
 | 
			
		||||
	// and to "System" if enabled.
 | 
			
		||||
	// +optional
 | 
			
		||||
	DefaultingType PodTopologySpreadConstraintsDefaulting `json:"defaultingType,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | 
			
		||||
 | 
			
		||||
// RequestedToCapacityRatioArgs holds arguments used to configure RequestedToCapacityRatio plugin.
 | 
			
		||||
type RequestedToCapacityRatioArgs struct {
 | 
			
		||||
	metav1.TypeMeta `json:",inline"`
 | 
			
		||||
 | 
			
		||||
	// Points defining priority function shape
 | 
			
		||||
	// +listType=atomic
 | 
			
		||||
	Shape []UtilizationShapePoint `json:"shape"`
 | 
			
		||||
	// Resources to be managed
 | 
			
		||||
	// +listType=atomic
 | 
			
		||||
	Resources []ResourceSpec `json:"resources,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | 
			
		||||
 | 
			
		||||
// NodeResourcesLeastAllocatedArgs holds arguments used to configure NodeResourcesLeastAllocated plugin.
 | 
			
		||||
type NodeResourcesLeastAllocatedArgs struct {
 | 
			
		||||
	metav1.TypeMeta `json:",inline"`
 | 
			
		||||
 | 
			
		||||
	// Resources to be managed, if no resource is provided, default resource set with both
 | 
			
		||||
	// the weight of "cpu" and "memory" set to "1" will be applied.
 | 
			
		||||
	// Resource with "0" weight will not accountable for the final score.
 | 
			
		||||
	// +listType=atomic
 | 
			
		||||
	Resources []ResourceSpec `json:"resources,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | 
			
		||||
 | 
			
		||||
// NodeResourcesMostAllocatedArgs holds arguments used to configure NodeResourcesMostAllocated plugin.
 | 
			
		||||
type NodeResourcesMostAllocatedArgs struct {
 | 
			
		||||
	metav1.TypeMeta `json:",inline"`
 | 
			
		||||
 | 
			
		||||
	// Resources to be managed, if no resource is provided, default resource set with both
 | 
			
		||||
	// the weight of "cpu" and "memory" set to "1" will be applied.
 | 
			
		||||
	// Resource with "0" weight will not accountable for the final score.
 | 
			
		||||
	// +listType=atomic
 | 
			
		||||
	Resources []ResourceSpec `json:"resources,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | 
			
		||||
 | 
			
		||||
// NodeResourcesBalancedAllocationArgs holds arguments used to configure NodeResourcesBalancedAllocation plugin.
 | 
			
		||||
type NodeResourcesBalancedAllocationArgs struct {
 | 
			
		||||
	metav1.TypeMeta `json:",inline"`
 | 
			
		||||
 | 
			
		||||
	// Resources to be managed, the default is "cpu" and "memory" if not specified.
 | 
			
		||||
	// +listType=map
 | 
			
		||||
	// +listMapKey=name
 | 
			
		||||
	Resources []ResourceSpec `json:"resources,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UtilizationShapePoint represents single point of priority function shape.
 | 
			
		||||
type UtilizationShapePoint struct {
 | 
			
		||||
	// Utilization (x axis). Valid values are 0 to 100. Fully utilized node maps to 100.
 | 
			
		||||
	Utilization int32 `json:"utilization"`
 | 
			
		||||
	// Score assigned to given utilization (y axis). Valid values are 0 to 10.
 | 
			
		||||
	Score int32 `json:"score"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ResourceSpec represents a single resource.
 | 
			
		||||
type ResourceSpec struct {
 | 
			
		||||
	// Name of the resource.
 | 
			
		||||
	Name string `json:"name"`
 | 
			
		||||
	// Weight of the resource.
 | 
			
		||||
	Weight int64 `json:"weight,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | 
			
		||||
 | 
			
		||||
// ServiceAffinityArgs holds arguments used to configure the ServiceAffinity plugin.
 | 
			
		||||
//
 | 
			
		||||
// This plugin has been deprecated and is only configurable through the
 | 
			
		||||
// scheduler policy API and the v1beta1 component config API. It is recommended
 | 
			
		||||
// to use the InterPodAffinity plugin instead.
 | 
			
		||||
type ServiceAffinityArgs struct {
 | 
			
		||||
	metav1.TypeMeta `json:",inline"`
 | 
			
		||||
 | 
			
		||||
	// AffinityLabels are homogeneous for pods that are scheduled to a node.
 | 
			
		||||
	// (i.e. it returns true IFF this pod can be added to this node such that all other pods in
 | 
			
		||||
	// the same service are running on nodes with the exact same values for Labels).
 | 
			
		||||
	// +listType=atomic
 | 
			
		||||
	AffinityLabels []string `json:"affinityLabels,omitempty"`
 | 
			
		||||
	// AntiAffinityLabelsPreference are the labels to consider for service anti affinity scoring.
 | 
			
		||||
	// +listType=atomic
 | 
			
		||||
	AntiAffinityLabelsPreference []string `json:"antiAffinityLabelsPreference,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | 
			
		||||
 | 
			
		||||
// VolumeBindingArgs holds arguments used to configure the VolumeBinding plugin.
 | 
			
		||||
type VolumeBindingArgs struct {
 | 
			
		||||
	metav1.TypeMeta `json:",inline"`
 | 
			
		||||
 | 
			
		||||
	// BindTimeoutSeconds is the timeout in seconds in volume binding operation.
 | 
			
		||||
	// Value must be non-negative integer. The value zero indicates no waiting.
 | 
			
		||||
	// If this value is nil, the default value (600) will be used.
 | 
			
		||||
	BindTimeoutSeconds *int64 `json:"bindTimeoutSeconds,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// Shape specifies the points defining the score function shape, which is
 | 
			
		||||
	// used to score nodes based on the utilization of statically provisioned
 | 
			
		||||
	// PVs. The utilization is calculated by dividing the total requested
 | 
			
		||||
	// storage of the pod by the total capacity of feasible PVs on each node.
 | 
			
		||||
	// Each point contains utilization (ranges from 0 to 100) and its
 | 
			
		||||
	// associated score (ranges from 0 to 10). You can turn the priority by
 | 
			
		||||
	// specifying different scores for different utilization numbers.
 | 
			
		||||
	// The default shape points are:
 | 
			
		||||
	// 1) 0 for 0 utilization
 | 
			
		||||
	// 2) 10 for 100 utilization
 | 
			
		||||
	// All points must be sorted in increasing order by utilization.
 | 
			
		||||
	// +featureGate=VolumeCapacityPriority
 | 
			
		||||
	// +optional
 | 
			
		||||
	// +listType=atomic
 | 
			
		||||
	Shape []UtilizationShapePoint `json:"shape,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | 
			
		||||
 | 
			
		||||
// NodeAffinityArgs holds arguments to configure the NodeAffinity plugin.
 | 
			
		||||
type NodeAffinityArgs struct {
 | 
			
		||||
	metav1.TypeMeta `json:",inline"`
 | 
			
		||||
 | 
			
		||||
	// AddedAffinity is applied to all Pods additionally to the NodeAffinity
 | 
			
		||||
	// specified in the PodSpec. That is, Nodes need to satisfy AddedAffinity
 | 
			
		||||
	// AND .spec.NodeAffinity. AddedAffinity is empty by default (all Nodes
 | 
			
		||||
	// match).
 | 
			
		||||
	// When AddedAffinity is used, some Pods with affinity requirements that match
 | 
			
		||||
	// a specific Node (such as Daemonset Pods) might remain unschedulable.
 | 
			
		||||
	// +optional
 | 
			
		||||
	AddedAffinity *corev1.NodeAffinity `json:"addedAffinity,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ScoringStrategyType the type of scoring strategy used in NodeResourcesFit plugin.
 | 
			
		||||
type ScoringStrategyType string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// LeastAllocated strategy prioritizes nodes with least allcoated resources.
 | 
			
		||||
	LeastAllocated ScoringStrategyType = "LeastAllocated"
 | 
			
		||||
	// MostAllocated strategy prioritizes nodes with most allcoated resources.
 | 
			
		||||
	MostAllocated ScoringStrategyType = "MostAllocated"
 | 
			
		||||
	// RequestedToCapacityRatio strategy allows specifying a custom shape function
 | 
			
		||||
	// to score nodes based on the request to capacity ratio.
 | 
			
		||||
	RequestedToCapacityRatio ScoringStrategyType = "RequestedToCapacityRatio"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ScoringStrategy define ScoringStrategyType for node resource plugin
 | 
			
		||||
type ScoringStrategy struct {
 | 
			
		||||
	// Type selects which strategy to run.
 | 
			
		||||
	Type ScoringStrategyType `json:"type,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// Resources to consider when scoring.
 | 
			
		||||
	// The default resource set includes "cpu" and "memory" with an equal weight.
 | 
			
		||||
	// Allowed weights go from 1 to 100.
 | 
			
		||||
	// Weight defaults to 1 if not specified or explicitly set to 0.
 | 
			
		||||
	// +listType=map
 | 
			
		||||
	// +listMapKey=name
 | 
			
		||||
	Resources []ResourceSpec `json:"resources,omitempty"`
 | 
			
		||||
 | 
			
		||||
	// Arguments specific to RequestedToCapacityRatio strategy.
 | 
			
		||||
	RequestedToCapacityRatio *RequestedToCapacityRatioParam `json:"requestedToCapacityRatio,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RequestedToCapacityRatioParam define RequestedToCapacityRatio parameters
 | 
			
		||||
type RequestedToCapacityRatioParam struct {
 | 
			
		||||
	// Shape is a list of points defining the scoring function shape.
 | 
			
		||||
	// +listType=atomic
 | 
			
		||||
	Shape []UtilizationShapePoint `json:"shape,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
@@ -1,785 +0,0 @@
 | 
			
		||||
//go:build !ignore_autogenerated
 | 
			
		||||
// +build !ignore_autogenerated
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Copyright 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.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// Code generated by deepcopy-gen. DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
package v1beta1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	corev1 "k8s.io/api/core/v1"
 | 
			
		||||
	runtime "k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
	v1 "k8s.io/kube-scheduler/config/v1"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *DefaultPreemptionArgs) DeepCopyInto(out *DefaultPreemptionArgs) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	out.TypeMeta = in.TypeMeta
 | 
			
		||||
	if in.MinCandidateNodesPercentage != nil {
 | 
			
		||||
		in, out := &in.MinCandidateNodesPercentage, &out.MinCandidateNodesPercentage
 | 
			
		||||
		*out = new(int32)
 | 
			
		||||
		**out = **in
 | 
			
		||||
	}
 | 
			
		||||
	if in.MinCandidateNodesAbsolute != nil {
 | 
			
		||||
		in, out := &in.MinCandidateNodesAbsolute, &out.MinCandidateNodesAbsolute
 | 
			
		||||
		*out = new(int32)
 | 
			
		||||
		**out = **in
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DefaultPreemptionArgs.
 | 
			
		||||
func (in *DefaultPreemptionArgs) DeepCopy() *DefaultPreemptionArgs {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(DefaultPreemptionArgs)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
 | 
			
		||||
func (in *DefaultPreemptionArgs) DeepCopyObject() runtime.Object {
 | 
			
		||||
	if c := in.DeepCopy(); c != nil {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *Extender) DeepCopyInto(out *Extender) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	if in.TLSConfig != nil {
 | 
			
		||||
		in, out := &in.TLSConfig, &out.TLSConfig
 | 
			
		||||
		*out = new(v1.ExtenderTLSConfig)
 | 
			
		||||
		(*in).DeepCopyInto(*out)
 | 
			
		||||
	}
 | 
			
		||||
	out.HTTPTimeout = in.HTTPTimeout
 | 
			
		||||
	if in.ManagedResources != nil {
 | 
			
		||||
		in, out := &in.ManagedResources, &out.ManagedResources
 | 
			
		||||
		*out = make([]v1.ExtenderManagedResource, len(*in))
 | 
			
		||||
		copy(*out, *in)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Extender.
 | 
			
		||||
func (in *Extender) DeepCopy() *Extender {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(Extender)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *InterPodAffinityArgs) DeepCopyInto(out *InterPodAffinityArgs) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	out.TypeMeta = in.TypeMeta
 | 
			
		||||
	if in.HardPodAffinityWeight != nil {
 | 
			
		||||
		in, out := &in.HardPodAffinityWeight, &out.HardPodAffinityWeight
 | 
			
		||||
		*out = new(int32)
 | 
			
		||||
		**out = **in
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InterPodAffinityArgs.
 | 
			
		||||
func (in *InterPodAffinityArgs) DeepCopy() *InterPodAffinityArgs {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(InterPodAffinityArgs)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
 | 
			
		||||
func (in *InterPodAffinityArgs) DeepCopyObject() runtime.Object {
 | 
			
		||||
	if c := in.DeepCopy(); c != nil {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *KubeSchedulerConfiguration) DeepCopyInto(out *KubeSchedulerConfiguration) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	out.TypeMeta = in.TypeMeta
 | 
			
		||||
	if in.Parallelism != nil {
 | 
			
		||||
		in, out := &in.Parallelism, &out.Parallelism
 | 
			
		||||
		*out = new(int32)
 | 
			
		||||
		**out = **in
 | 
			
		||||
	}
 | 
			
		||||
	in.LeaderElection.DeepCopyInto(&out.LeaderElection)
 | 
			
		||||
	out.ClientConnection = in.ClientConnection
 | 
			
		||||
	if in.HealthzBindAddress != nil {
 | 
			
		||||
		in, out := &in.HealthzBindAddress, &out.HealthzBindAddress
 | 
			
		||||
		*out = new(string)
 | 
			
		||||
		**out = **in
 | 
			
		||||
	}
 | 
			
		||||
	if in.MetricsBindAddress != nil {
 | 
			
		||||
		in, out := &in.MetricsBindAddress, &out.MetricsBindAddress
 | 
			
		||||
		*out = new(string)
 | 
			
		||||
		**out = **in
 | 
			
		||||
	}
 | 
			
		||||
	in.DebuggingConfiguration.DeepCopyInto(&out.DebuggingConfiguration)
 | 
			
		||||
	if in.PercentageOfNodesToScore != nil {
 | 
			
		||||
		in, out := &in.PercentageOfNodesToScore, &out.PercentageOfNodesToScore
 | 
			
		||||
		*out = new(int32)
 | 
			
		||||
		**out = **in
 | 
			
		||||
	}
 | 
			
		||||
	if in.PodInitialBackoffSeconds != nil {
 | 
			
		||||
		in, out := &in.PodInitialBackoffSeconds, &out.PodInitialBackoffSeconds
 | 
			
		||||
		*out = new(int64)
 | 
			
		||||
		**out = **in
 | 
			
		||||
	}
 | 
			
		||||
	if in.PodMaxBackoffSeconds != nil {
 | 
			
		||||
		in, out := &in.PodMaxBackoffSeconds, &out.PodMaxBackoffSeconds
 | 
			
		||||
		*out = new(int64)
 | 
			
		||||
		**out = **in
 | 
			
		||||
	}
 | 
			
		||||
	if in.Profiles != nil {
 | 
			
		||||
		in, out := &in.Profiles, &out.Profiles
 | 
			
		||||
		*out = make([]KubeSchedulerProfile, len(*in))
 | 
			
		||||
		for i := range *in {
 | 
			
		||||
			(*in)[i].DeepCopyInto(&(*out)[i])
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if in.Extenders != nil {
 | 
			
		||||
		in, out := &in.Extenders, &out.Extenders
 | 
			
		||||
		*out = make([]Extender, len(*in))
 | 
			
		||||
		for i := range *in {
 | 
			
		||||
			(*in)[i].DeepCopyInto(&(*out)[i])
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeSchedulerConfiguration.
 | 
			
		||||
func (in *KubeSchedulerConfiguration) DeepCopy() *KubeSchedulerConfiguration {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(KubeSchedulerConfiguration)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
 | 
			
		||||
func (in *KubeSchedulerConfiguration) DeepCopyObject() runtime.Object {
 | 
			
		||||
	if c := in.DeepCopy(); c != nil {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *KubeSchedulerProfile) DeepCopyInto(out *KubeSchedulerProfile) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	if in.SchedulerName != nil {
 | 
			
		||||
		in, out := &in.SchedulerName, &out.SchedulerName
 | 
			
		||||
		*out = new(string)
 | 
			
		||||
		**out = **in
 | 
			
		||||
	}
 | 
			
		||||
	if in.Plugins != nil {
 | 
			
		||||
		in, out := &in.Plugins, &out.Plugins
 | 
			
		||||
		*out = new(Plugins)
 | 
			
		||||
		(*in).DeepCopyInto(*out)
 | 
			
		||||
	}
 | 
			
		||||
	if in.PluginConfig != nil {
 | 
			
		||||
		in, out := &in.PluginConfig, &out.PluginConfig
 | 
			
		||||
		*out = make([]PluginConfig, len(*in))
 | 
			
		||||
		for i := range *in {
 | 
			
		||||
			(*in)[i].DeepCopyInto(&(*out)[i])
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeSchedulerProfile.
 | 
			
		||||
func (in *KubeSchedulerProfile) DeepCopy() *KubeSchedulerProfile {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(KubeSchedulerProfile)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *NodeAffinityArgs) DeepCopyInto(out *NodeAffinityArgs) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	out.TypeMeta = in.TypeMeta
 | 
			
		||||
	if in.AddedAffinity != nil {
 | 
			
		||||
		in, out := &in.AddedAffinity, &out.AddedAffinity
 | 
			
		||||
		*out = new(corev1.NodeAffinity)
 | 
			
		||||
		(*in).DeepCopyInto(*out)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeAffinityArgs.
 | 
			
		||||
func (in *NodeAffinityArgs) DeepCopy() *NodeAffinityArgs {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(NodeAffinityArgs)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
 | 
			
		||||
func (in *NodeAffinityArgs) DeepCopyObject() runtime.Object {
 | 
			
		||||
	if c := in.DeepCopy(); c != nil {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *NodeLabelArgs) DeepCopyInto(out *NodeLabelArgs) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	out.TypeMeta = in.TypeMeta
 | 
			
		||||
	if in.PresentLabels != nil {
 | 
			
		||||
		in, out := &in.PresentLabels, &out.PresentLabels
 | 
			
		||||
		*out = make([]string, len(*in))
 | 
			
		||||
		copy(*out, *in)
 | 
			
		||||
	}
 | 
			
		||||
	if in.AbsentLabels != nil {
 | 
			
		||||
		in, out := &in.AbsentLabels, &out.AbsentLabels
 | 
			
		||||
		*out = make([]string, len(*in))
 | 
			
		||||
		copy(*out, *in)
 | 
			
		||||
	}
 | 
			
		||||
	if in.PresentLabelsPreference != nil {
 | 
			
		||||
		in, out := &in.PresentLabelsPreference, &out.PresentLabelsPreference
 | 
			
		||||
		*out = make([]string, len(*in))
 | 
			
		||||
		copy(*out, *in)
 | 
			
		||||
	}
 | 
			
		||||
	if in.AbsentLabelsPreference != nil {
 | 
			
		||||
		in, out := &in.AbsentLabelsPreference, &out.AbsentLabelsPreference
 | 
			
		||||
		*out = make([]string, len(*in))
 | 
			
		||||
		copy(*out, *in)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeLabelArgs.
 | 
			
		||||
func (in *NodeLabelArgs) DeepCopy() *NodeLabelArgs {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(NodeLabelArgs)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
 | 
			
		||||
func (in *NodeLabelArgs) DeepCopyObject() runtime.Object {
 | 
			
		||||
	if c := in.DeepCopy(); c != nil {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *NodeResourcesBalancedAllocationArgs) DeepCopyInto(out *NodeResourcesBalancedAllocationArgs) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	out.TypeMeta = in.TypeMeta
 | 
			
		||||
	if in.Resources != nil {
 | 
			
		||||
		in, out := &in.Resources, &out.Resources
 | 
			
		||||
		*out = make([]ResourceSpec, len(*in))
 | 
			
		||||
		copy(*out, *in)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeResourcesBalancedAllocationArgs.
 | 
			
		||||
func (in *NodeResourcesBalancedAllocationArgs) DeepCopy() *NodeResourcesBalancedAllocationArgs {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(NodeResourcesBalancedAllocationArgs)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
 | 
			
		||||
func (in *NodeResourcesBalancedAllocationArgs) DeepCopyObject() runtime.Object {
 | 
			
		||||
	if c := in.DeepCopy(); c != nil {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *NodeResourcesFitArgs) DeepCopyInto(out *NodeResourcesFitArgs) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	out.TypeMeta = in.TypeMeta
 | 
			
		||||
	if in.IgnoredResources != nil {
 | 
			
		||||
		in, out := &in.IgnoredResources, &out.IgnoredResources
 | 
			
		||||
		*out = make([]string, len(*in))
 | 
			
		||||
		copy(*out, *in)
 | 
			
		||||
	}
 | 
			
		||||
	if in.IgnoredResourceGroups != nil {
 | 
			
		||||
		in, out := &in.IgnoredResourceGroups, &out.IgnoredResourceGroups
 | 
			
		||||
		*out = make([]string, len(*in))
 | 
			
		||||
		copy(*out, *in)
 | 
			
		||||
	}
 | 
			
		||||
	if in.ScoringStrategy != nil {
 | 
			
		||||
		in, out := &in.ScoringStrategy, &out.ScoringStrategy
 | 
			
		||||
		*out = new(ScoringStrategy)
 | 
			
		||||
		(*in).DeepCopyInto(*out)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeResourcesFitArgs.
 | 
			
		||||
func (in *NodeResourcesFitArgs) DeepCopy() *NodeResourcesFitArgs {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(NodeResourcesFitArgs)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
 | 
			
		||||
func (in *NodeResourcesFitArgs) DeepCopyObject() runtime.Object {
 | 
			
		||||
	if c := in.DeepCopy(); c != nil {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *NodeResourcesLeastAllocatedArgs) DeepCopyInto(out *NodeResourcesLeastAllocatedArgs) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	out.TypeMeta = in.TypeMeta
 | 
			
		||||
	if in.Resources != nil {
 | 
			
		||||
		in, out := &in.Resources, &out.Resources
 | 
			
		||||
		*out = make([]ResourceSpec, len(*in))
 | 
			
		||||
		copy(*out, *in)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeResourcesLeastAllocatedArgs.
 | 
			
		||||
func (in *NodeResourcesLeastAllocatedArgs) DeepCopy() *NodeResourcesLeastAllocatedArgs {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(NodeResourcesLeastAllocatedArgs)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
 | 
			
		||||
func (in *NodeResourcesLeastAllocatedArgs) DeepCopyObject() runtime.Object {
 | 
			
		||||
	if c := in.DeepCopy(); c != nil {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *NodeResourcesMostAllocatedArgs) DeepCopyInto(out *NodeResourcesMostAllocatedArgs) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	out.TypeMeta = in.TypeMeta
 | 
			
		||||
	if in.Resources != nil {
 | 
			
		||||
		in, out := &in.Resources, &out.Resources
 | 
			
		||||
		*out = make([]ResourceSpec, len(*in))
 | 
			
		||||
		copy(*out, *in)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeResourcesMostAllocatedArgs.
 | 
			
		||||
func (in *NodeResourcesMostAllocatedArgs) DeepCopy() *NodeResourcesMostAllocatedArgs {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(NodeResourcesMostAllocatedArgs)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
 | 
			
		||||
func (in *NodeResourcesMostAllocatedArgs) DeepCopyObject() runtime.Object {
 | 
			
		||||
	if c := in.DeepCopy(); c != nil {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *Plugin) DeepCopyInto(out *Plugin) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	if in.Weight != nil {
 | 
			
		||||
		in, out := &in.Weight, &out.Weight
 | 
			
		||||
		*out = new(int32)
 | 
			
		||||
		**out = **in
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Plugin.
 | 
			
		||||
func (in *Plugin) DeepCopy() *Plugin {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(Plugin)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *PluginConfig) DeepCopyInto(out *PluginConfig) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	in.Args.DeepCopyInto(&out.Args)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PluginConfig.
 | 
			
		||||
func (in *PluginConfig) DeepCopy() *PluginConfig {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(PluginConfig)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *PluginSet) DeepCopyInto(out *PluginSet) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	if in.Enabled != nil {
 | 
			
		||||
		in, out := &in.Enabled, &out.Enabled
 | 
			
		||||
		*out = make([]Plugin, len(*in))
 | 
			
		||||
		for i := range *in {
 | 
			
		||||
			(*in)[i].DeepCopyInto(&(*out)[i])
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if in.Disabled != nil {
 | 
			
		||||
		in, out := &in.Disabled, &out.Disabled
 | 
			
		||||
		*out = make([]Plugin, len(*in))
 | 
			
		||||
		for i := range *in {
 | 
			
		||||
			(*in)[i].DeepCopyInto(&(*out)[i])
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PluginSet.
 | 
			
		||||
func (in *PluginSet) DeepCopy() *PluginSet {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(PluginSet)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *Plugins) DeepCopyInto(out *Plugins) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	if in.QueueSort != nil {
 | 
			
		||||
		in, out := &in.QueueSort, &out.QueueSort
 | 
			
		||||
		*out = new(PluginSet)
 | 
			
		||||
		(*in).DeepCopyInto(*out)
 | 
			
		||||
	}
 | 
			
		||||
	if in.PreFilter != nil {
 | 
			
		||||
		in, out := &in.PreFilter, &out.PreFilter
 | 
			
		||||
		*out = new(PluginSet)
 | 
			
		||||
		(*in).DeepCopyInto(*out)
 | 
			
		||||
	}
 | 
			
		||||
	if in.Filter != nil {
 | 
			
		||||
		in, out := &in.Filter, &out.Filter
 | 
			
		||||
		*out = new(PluginSet)
 | 
			
		||||
		(*in).DeepCopyInto(*out)
 | 
			
		||||
	}
 | 
			
		||||
	if in.PostFilter != nil {
 | 
			
		||||
		in, out := &in.PostFilter, &out.PostFilter
 | 
			
		||||
		*out = new(PluginSet)
 | 
			
		||||
		(*in).DeepCopyInto(*out)
 | 
			
		||||
	}
 | 
			
		||||
	if in.PreScore != nil {
 | 
			
		||||
		in, out := &in.PreScore, &out.PreScore
 | 
			
		||||
		*out = new(PluginSet)
 | 
			
		||||
		(*in).DeepCopyInto(*out)
 | 
			
		||||
	}
 | 
			
		||||
	if in.Score != nil {
 | 
			
		||||
		in, out := &in.Score, &out.Score
 | 
			
		||||
		*out = new(PluginSet)
 | 
			
		||||
		(*in).DeepCopyInto(*out)
 | 
			
		||||
	}
 | 
			
		||||
	if in.Reserve != nil {
 | 
			
		||||
		in, out := &in.Reserve, &out.Reserve
 | 
			
		||||
		*out = new(PluginSet)
 | 
			
		||||
		(*in).DeepCopyInto(*out)
 | 
			
		||||
	}
 | 
			
		||||
	if in.Permit != nil {
 | 
			
		||||
		in, out := &in.Permit, &out.Permit
 | 
			
		||||
		*out = new(PluginSet)
 | 
			
		||||
		(*in).DeepCopyInto(*out)
 | 
			
		||||
	}
 | 
			
		||||
	if in.PreBind != nil {
 | 
			
		||||
		in, out := &in.PreBind, &out.PreBind
 | 
			
		||||
		*out = new(PluginSet)
 | 
			
		||||
		(*in).DeepCopyInto(*out)
 | 
			
		||||
	}
 | 
			
		||||
	if in.Bind != nil {
 | 
			
		||||
		in, out := &in.Bind, &out.Bind
 | 
			
		||||
		*out = new(PluginSet)
 | 
			
		||||
		(*in).DeepCopyInto(*out)
 | 
			
		||||
	}
 | 
			
		||||
	if in.PostBind != nil {
 | 
			
		||||
		in, out := &in.PostBind, &out.PostBind
 | 
			
		||||
		*out = new(PluginSet)
 | 
			
		||||
		(*in).DeepCopyInto(*out)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Plugins.
 | 
			
		||||
func (in *Plugins) DeepCopy() *Plugins {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(Plugins)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *PodTopologySpreadArgs) DeepCopyInto(out *PodTopologySpreadArgs) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	out.TypeMeta = in.TypeMeta
 | 
			
		||||
	if in.DefaultConstraints != nil {
 | 
			
		||||
		in, out := &in.DefaultConstraints, &out.DefaultConstraints
 | 
			
		||||
		*out = make([]corev1.TopologySpreadConstraint, len(*in))
 | 
			
		||||
		for i := range *in {
 | 
			
		||||
			(*in)[i].DeepCopyInto(&(*out)[i])
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodTopologySpreadArgs.
 | 
			
		||||
func (in *PodTopologySpreadArgs) DeepCopy() *PodTopologySpreadArgs {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(PodTopologySpreadArgs)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
 | 
			
		||||
func (in *PodTopologySpreadArgs) DeepCopyObject() runtime.Object {
 | 
			
		||||
	if c := in.DeepCopy(); c != nil {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *RequestedToCapacityRatioArgs) DeepCopyInto(out *RequestedToCapacityRatioArgs) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	out.TypeMeta = in.TypeMeta
 | 
			
		||||
	if in.Shape != nil {
 | 
			
		||||
		in, out := &in.Shape, &out.Shape
 | 
			
		||||
		*out = make([]UtilizationShapePoint, len(*in))
 | 
			
		||||
		copy(*out, *in)
 | 
			
		||||
	}
 | 
			
		||||
	if in.Resources != nil {
 | 
			
		||||
		in, out := &in.Resources, &out.Resources
 | 
			
		||||
		*out = make([]ResourceSpec, len(*in))
 | 
			
		||||
		copy(*out, *in)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RequestedToCapacityRatioArgs.
 | 
			
		||||
func (in *RequestedToCapacityRatioArgs) DeepCopy() *RequestedToCapacityRatioArgs {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(RequestedToCapacityRatioArgs)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
 | 
			
		||||
func (in *RequestedToCapacityRatioArgs) DeepCopyObject() runtime.Object {
 | 
			
		||||
	if c := in.DeepCopy(); c != nil {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *RequestedToCapacityRatioParam) DeepCopyInto(out *RequestedToCapacityRatioParam) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	if in.Shape != nil {
 | 
			
		||||
		in, out := &in.Shape, &out.Shape
 | 
			
		||||
		*out = make([]UtilizationShapePoint, len(*in))
 | 
			
		||||
		copy(*out, *in)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RequestedToCapacityRatioParam.
 | 
			
		||||
func (in *RequestedToCapacityRatioParam) DeepCopy() *RequestedToCapacityRatioParam {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(RequestedToCapacityRatioParam)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *ResourceSpec) DeepCopyInto(out *ResourceSpec) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceSpec.
 | 
			
		||||
func (in *ResourceSpec) DeepCopy() *ResourceSpec {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(ResourceSpec)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *ScoringStrategy) DeepCopyInto(out *ScoringStrategy) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	if in.Resources != nil {
 | 
			
		||||
		in, out := &in.Resources, &out.Resources
 | 
			
		||||
		*out = make([]ResourceSpec, len(*in))
 | 
			
		||||
		copy(*out, *in)
 | 
			
		||||
	}
 | 
			
		||||
	if in.RequestedToCapacityRatio != nil {
 | 
			
		||||
		in, out := &in.RequestedToCapacityRatio, &out.RequestedToCapacityRatio
 | 
			
		||||
		*out = new(RequestedToCapacityRatioParam)
 | 
			
		||||
		(*in).DeepCopyInto(*out)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScoringStrategy.
 | 
			
		||||
func (in *ScoringStrategy) DeepCopy() *ScoringStrategy {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(ScoringStrategy)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *ServiceAffinityArgs) DeepCopyInto(out *ServiceAffinityArgs) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	out.TypeMeta = in.TypeMeta
 | 
			
		||||
	if in.AffinityLabels != nil {
 | 
			
		||||
		in, out := &in.AffinityLabels, &out.AffinityLabels
 | 
			
		||||
		*out = make([]string, len(*in))
 | 
			
		||||
		copy(*out, *in)
 | 
			
		||||
	}
 | 
			
		||||
	if in.AntiAffinityLabelsPreference != nil {
 | 
			
		||||
		in, out := &in.AntiAffinityLabelsPreference, &out.AntiAffinityLabelsPreference
 | 
			
		||||
		*out = make([]string, len(*in))
 | 
			
		||||
		copy(*out, *in)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceAffinityArgs.
 | 
			
		||||
func (in *ServiceAffinityArgs) DeepCopy() *ServiceAffinityArgs {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(ServiceAffinityArgs)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
 | 
			
		||||
func (in *ServiceAffinityArgs) DeepCopyObject() runtime.Object {
 | 
			
		||||
	if c := in.DeepCopy(); c != nil {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *UtilizationShapePoint) DeepCopyInto(out *UtilizationShapePoint) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UtilizationShapePoint.
 | 
			
		||||
func (in *UtilizationShapePoint) DeepCopy() *UtilizationShapePoint {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(UtilizationShapePoint)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | 
			
		||||
func (in *VolumeBindingArgs) DeepCopyInto(out *VolumeBindingArgs) {
 | 
			
		||||
	*out = *in
 | 
			
		||||
	out.TypeMeta = in.TypeMeta
 | 
			
		||||
	if in.BindTimeoutSeconds != nil {
 | 
			
		||||
		in, out := &in.BindTimeoutSeconds, &out.BindTimeoutSeconds
 | 
			
		||||
		*out = new(int64)
 | 
			
		||||
		**out = **in
 | 
			
		||||
	}
 | 
			
		||||
	if in.Shape != nil {
 | 
			
		||||
		in, out := &in.Shape, &out.Shape
 | 
			
		||||
		*out = make([]UtilizationShapePoint, len(*in))
 | 
			
		||||
		copy(*out, *in)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeBindingArgs.
 | 
			
		||||
func (in *VolumeBindingArgs) DeepCopy() *VolumeBindingArgs {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(VolumeBindingArgs)
 | 
			
		||||
	in.DeepCopyInto(out)
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
 | 
			
		||||
func (in *VolumeBindingArgs) DeepCopyObject() runtime.Object {
 | 
			
		||||
	if c := in.DeepCopy(); c != nil {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
@@ -34,13 +34,11 @@ import (
 | 
			
		||||
	"k8s.io/apimachinery/pkg/util/wait"
 | 
			
		||||
	"k8s.io/client-go/dynamic"
 | 
			
		||||
	"k8s.io/client-go/kubernetes"
 | 
			
		||||
	"k8s.io/kube-scheduler/config/v1beta1"
 | 
			
		||||
	"k8s.io/kube-scheduler/config/v1beta2"
 | 
			
		||||
	apiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler"
 | 
			
		||||
	configtesting "k8s.io/kubernetes/pkg/scheduler/apis/config/testing"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/framework"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/framework/plugins/serviceaffinity"
 | 
			
		||||
	frameworkruntime "k8s.io/kubernetes/pkg/scheduler/framework/runtime"
 | 
			
		||||
	st "k8s.io/kubernetes/pkg/scheduler/testing"
 | 
			
		||||
	testfwk "k8s.io/kubernetes/test/integration/framework"
 | 
			
		||||
@@ -49,126 +47,7 @@ import (
 | 
			
		||||
	"k8s.io/utils/pointer"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestServiceAffinityEnqueue(t *testing.T) {
 | 
			
		||||
	cfg := configtesting.V1beta1ToInternalWithDefaults(t, v1beta1.KubeSchedulerConfiguration{
 | 
			
		||||
		Profiles: []v1beta1.KubeSchedulerProfile{{
 | 
			
		||||
			SchedulerName: pointer.StringPtr(v1.DefaultSchedulerName),
 | 
			
		||||
			Plugins: &v1beta1.Plugins{
 | 
			
		||||
				PreFilter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: serviceaffinity.Name},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Filter: &v1beta1.PluginSet{
 | 
			
		||||
					Enabled: []v1beta1.Plugin{
 | 
			
		||||
						{Name: serviceaffinity.Name},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			PluginConfig: []v1beta1.PluginConfig{
 | 
			
		||||
				{
 | 
			
		||||
					Name: serviceaffinity.Name,
 | 
			
		||||
					Args: runtime.RawExtension{
 | 
			
		||||
						Object: &v1beta1.ServiceAffinityArgs{
 | 
			
		||||
							AffinityLabels: []string{"hostname"},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		}},
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// Use zero backoff seconds to bypass backoffQ.
 | 
			
		||||
	testCtx := testutils.InitTestSchedulerWithOptions(
 | 
			
		||||
		t,
 | 
			
		||||
		testutils.InitTestAPIServer(t, "serviceaffinity-enqueue", nil),
 | 
			
		||||
		nil,
 | 
			
		||||
		scheduler.WithProfiles(cfg.Profiles...),
 | 
			
		||||
		scheduler.WithPodInitialBackoffSeconds(0),
 | 
			
		||||
		scheduler.WithPodMaxBackoffSeconds(0),
 | 
			
		||||
	)
 | 
			
		||||
	testutils.SyncInformerFactory(testCtx)
 | 
			
		||||
	// It's intended to not start the scheduler's queue, and hence to
 | 
			
		||||
	// not start any flushing logic. We will pop and schedule the Pods manually later.
 | 
			
		||||
	defer testutils.CleanupTest(t, testCtx)
 | 
			
		||||
 | 
			
		||||
	cs, ns, ctx := testCtx.ClientSet, testCtx.NS.Name, testCtx.Ctx
 | 
			
		||||
	// Create two Nodes.
 | 
			
		||||
	for i := 1; i <= 2; i++ {
 | 
			
		||||
		nodeName := fmt.Sprintf("node%d", i)
 | 
			
		||||
		capacity := map[v1.ResourceName]string{v1.ResourcePods: "1"}
 | 
			
		||||
		node := st.MakeNode().Name(nodeName).Label("hostname", nodeName).Capacity(capacity).Obj()
 | 
			
		||||
		if _, err := cs.CoreV1().Nodes().Create(ctx, node, metav1.CreateOptions{}); err != nil {
 | 
			
		||||
			t.Fatalf("Failed to create Node %q: %v", nodeName, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Create a Service.
 | 
			
		||||
	svc := &v1.Service{
 | 
			
		||||
		ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
			Name: "svc",
 | 
			
		||||
		},
 | 
			
		||||
		Spec: v1.ServiceSpec{
 | 
			
		||||
			Ports:    []v1.ServicePort{{Port: int32(80)}},
 | 
			
		||||
			Selector: map[string]string{"foo": "bar"},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	if _, err := cs.CoreV1().Services(ns).Create(ctx, svc, metav1.CreateOptions{}); err != nil {
 | 
			
		||||
		t.Fatalf("Failed to create Service %q: %v", svc.Name, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Create two Pods.
 | 
			
		||||
	pause := imageutils.GetPauseImageName()
 | 
			
		||||
	for i := 1; i <= 2; i++ {
 | 
			
		||||
		podName := fmt.Sprintf("pod%d", i)
 | 
			
		||||
		pod := st.MakePod().Namespace(ns).Name(podName).Label("foo", "bar").Container(pause).Obj()
 | 
			
		||||
		// Make Pod1 an assigned Pod.
 | 
			
		||||
		if i == 1 {
 | 
			
		||||
			pod.Spec.NodeName = fmt.Sprintf("node%d", i)
 | 
			
		||||
		}
 | 
			
		||||
		if _, err := cs.CoreV1().Pods(ns).Create(ctx, pod, metav1.CreateOptions{}); err != nil {
 | 
			
		||||
			t.Fatalf("Failed to create Pod %q: %v", pod.Name, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Wait for pod2 to be present in the scheduling queue.
 | 
			
		||||
	if err := wait.Poll(time.Millisecond*200, wait.ForeverTestTimeout, func() (bool, error) {
 | 
			
		||||
		return len(testCtx.Scheduler.SchedulingQueue.PendingPods()) == 1, nil
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Pop Pod2 out. It should be unschedulable.
 | 
			
		||||
	podInfo := nextPodOrDie(t, testCtx)
 | 
			
		||||
	fwk, ok := testCtx.Scheduler.Profiles[podInfo.Pod.Spec.SchedulerName]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		t.Fatalf("Cannot find the profile for Pod %v", podInfo.Pod.Name)
 | 
			
		||||
	}
 | 
			
		||||
	// Schedule the Pod manually.
 | 
			
		||||
	_, fitError := testCtx.Scheduler.Algorithm.Schedule(ctx, nil, fwk, framework.NewCycleState(), podInfo.Pod)
 | 
			
		||||
	// The fitError is expected to be:
 | 
			
		||||
	// 0/2 nodes are available: 1 Too many pods, 1 node(s) didn't match service affinity.
 | 
			
		||||
	if fitError == nil {
 | 
			
		||||
		t.Fatalf("Expect Pod %v to fail at scheduling.", podInfo.Pod.Name)
 | 
			
		||||
	}
 | 
			
		||||
	testCtx.Scheduler.Error(podInfo, fitError)
 | 
			
		||||
 | 
			
		||||
	// Scheduling cycle is incremented from 0 to 1 after NextPod() is called, so
 | 
			
		||||
	// pass a number larger than 1 to move Pod to unschedulableQ.
 | 
			
		||||
	testCtx.Scheduler.SchedulingQueue.AddUnschedulableIfNotPresent(podInfo, 10)
 | 
			
		||||
 | 
			
		||||
	// Trigger a Service event.
 | 
			
		||||
	// We expect this event to trigger moving the test Pod from unschedulableQ to activeQ.
 | 
			
		||||
	if err := cs.CoreV1().Services(ns).Delete(ctx, "svc", metav1.DeleteOptions{}); err != nil {
 | 
			
		||||
		t.Fatalf("Failed to delete service 'svc': %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Now we should be able to pop the Pod from activeQ again.
 | 
			
		||||
	podInfo = nextPodOrDie(t, testCtx)
 | 
			
		||||
	if podInfo.Attempts != 2 {
 | 
			
		||||
		t.Errorf("Expected the Pod to be attempted 2 times, but got %v", podInfo.Attempts)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
// TODO(#105303): Add a test case to cover event registration for core API resources
 | 
			
		||||
 | 
			
		||||
var _ framework.FilterPlugin = &fakeCRPlugin{}
 | 
			
		||||
var _ framework.EnqueueExtensions = &fakeCRPlugin{}
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ import (
 | 
			
		||||
	"k8s.io/component-base/metrics/legacyregistry"
 | 
			
		||||
	"k8s.io/component-base/metrics/testutil"
 | 
			
		||||
	"k8s.io/klog/v2"
 | 
			
		||||
	"k8s.io/kube-scheduler/config/v1beta1"
 | 
			
		||||
	"k8s.io/kube-scheduler/config/v1beta2"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/scheduler/apis/config"
 | 
			
		||||
	kubeschedulerscheme "k8s.io/kubernetes/pkg/scheduler/apis/config/scheme"
 | 
			
		||||
	"k8s.io/kubernetes/test/integration/util"
 | 
			
		||||
@@ -58,7 +58,7 @@ const (
 | 
			
		||||
var dataItemsDir = flag.String("data-items-dir", "", "destination directory for storing generated data items for perf dashboard")
 | 
			
		||||
 | 
			
		||||
func newDefaultComponentConfig() (*config.KubeSchedulerConfiguration, error) {
 | 
			
		||||
	gvk := v1beta1.SchemeGroupVersion.WithKind("KubeSchedulerConfiguration")
 | 
			
		||||
	gvk := v1beta2.SchemeGroupVersion.WithKind("KubeSchedulerConfiguration")
 | 
			
		||||
	cfg := config.KubeSchedulerConfiguration{}
 | 
			
		||||
	_, _, err := kubeschedulerscheme.Codecs.UniversalDecoder().Decode(nil, &gvk, &cfg)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							@@ -2076,7 +2076,6 @@ k8s.io/kube-proxy/config/v1alpha1
 | 
			
		||||
# k8s.io/kube-scheduler v0.0.0 => ./staging/src/k8s.io/kube-scheduler
 | 
			
		||||
## explicit
 | 
			
		||||
k8s.io/kube-scheduler/config/v1
 | 
			
		||||
k8s.io/kube-scheduler/config/v1beta1
 | 
			
		||||
k8s.io/kube-scheduler/config/v1beta2
 | 
			
		||||
k8s.io/kube-scheduler/extender/v1
 | 
			
		||||
# k8s.io/kubectl v0.0.0 => ./staging/src/k8s.io/kubectl
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user