k8s.io/kubernetes@v1.31.0-alpha.0.0.20240520171757-56147500dadc/pkg/scheduler/apis/config/v1/conversion.go (about) 1 /* 2 Copyright 2022 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package v1 18 19 import ( 20 "fmt" 21 "sync" 22 23 "k8s.io/apimachinery/pkg/conversion" 24 "k8s.io/apimachinery/pkg/runtime" 25 utilruntime "k8s.io/apimachinery/pkg/util/runtime" 26 v1 "k8s.io/kube-scheduler/config/v1" 27 "k8s.io/kubernetes/pkg/scheduler/apis/config" 28 ) 29 30 var ( 31 // pluginArgConversionScheme is a scheme with internal and v1 registered, 32 // used for defaulting/converting typed PluginConfig Args. 33 // Access via getPluginArgConversionScheme() 34 pluginArgConversionScheme *runtime.Scheme 35 initPluginArgConversionScheme sync.Once 36 ) 37 38 func GetPluginArgConversionScheme() *runtime.Scheme { 39 initPluginArgConversionScheme.Do(func() { 40 // set up the scheme used for plugin arg conversion 41 pluginArgConversionScheme = runtime.NewScheme() 42 utilruntime.Must(AddToScheme(pluginArgConversionScheme)) 43 utilruntime.Must(config.AddToScheme(pluginArgConversionScheme)) 44 }) 45 return pluginArgConversionScheme 46 } 47 48 func Convert_v1_KubeSchedulerConfiguration_To_config_KubeSchedulerConfiguration(in *v1.KubeSchedulerConfiguration, out *config.KubeSchedulerConfiguration, s conversion.Scope) error { 49 if err := autoConvert_v1_KubeSchedulerConfiguration_To_config_KubeSchedulerConfiguration(in, out, s); err != nil { 50 return err 51 } 52 return convertToInternalPluginConfigArgs(out) 53 } 54 55 // convertToInternalPluginConfigArgs converts PluginConfig#Args into internal 56 // types using a scheme, after applying defaults. 57 func convertToInternalPluginConfigArgs(out *config.KubeSchedulerConfiguration) error { 58 scheme := GetPluginArgConversionScheme() 59 for i := range out.Profiles { 60 prof := &out.Profiles[i] 61 for j := range prof.PluginConfig { 62 args := prof.PluginConfig[j].Args 63 if args == nil { 64 continue 65 } 66 if _, isUnknown := args.(*runtime.Unknown); isUnknown { 67 continue 68 } 69 internalArgs, err := scheme.ConvertToVersion(args, config.SchemeGroupVersion) 70 if err != nil { 71 return fmt.Errorf("converting .Profiles[%d].PluginConfig[%d].Args into internal type: %w", i, j, err) 72 } 73 prof.PluginConfig[j].Args = internalArgs 74 } 75 } 76 return nil 77 } 78 79 func Convert_config_KubeSchedulerConfiguration_To_v1_KubeSchedulerConfiguration(in *config.KubeSchedulerConfiguration, out *v1.KubeSchedulerConfiguration, s conversion.Scope) error { 80 if err := autoConvert_config_KubeSchedulerConfiguration_To_v1_KubeSchedulerConfiguration(in, out, s); err != nil { 81 return err 82 } 83 return convertToExternalPluginConfigArgs(out) 84 } 85 86 // convertToExternalPluginConfigArgs converts PluginConfig#Args into 87 // external (versioned) types using a scheme. 88 func convertToExternalPluginConfigArgs(out *v1.KubeSchedulerConfiguration) error { 89 scheme := GetPluginArgConversionScheme() 90 for i := range out.Profiles { 91 for j := range out.Profiles[i].PluginConfig { 92 args := out.Profiles[i].PluginConfig[j].Args 93 if args.Object == nil { 94 continue 95 } 96 if _, isUnknown := args.Object.(*runtime.Unknown); isUnknown { 97 continue 98 } 99 externalArgs, err := scheme.ConvertToVersion(args.Object, SchemeGroupVersion) 100 if err != nil { 101 return err 102 } 103 out.Profiles[i].PluginConfig[j].Args.Object = externalArgs 104 } 105 } 106 return nil 107 }