k8s.io/kubernetes@v1.31.0-alpha.0.0.20240520171757-56147500dadc/cmd/kube-scheduler/app/options/configfile_test.go (about) 1 /* 2 Copyright 2023 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 options 18 19 import ( 20 "context" 21 "fmt" 22 "os" 23 "path/filepath" 24 "syscall" 25 "testing" 26 27 "github.com/stretchr/testify/assert" 28 "k8s.io/klog/v2" 29 "k8s.io/kubernetes/pkg/scheduler/apis/config" 30 ) 31 32 const ( 33 apiVersionMissing = "'apiVersion' is missing" 34 apiVersionTooOld = "no kind \"KubeSchedulerConfiguration\" is registered for" + 35 " version \"kubescheduler.config.k8s.io/v1alpha1\"" 36 37 // schedulerConfigMinimalCorrect is the minimal 38 // correct scheduler config 39 schedulerConfigMinimalCorrect = ` 40 apiVersion: kubescheduler.config.k8s.io/v1 41 kind: KubeSchedulerConfiguration` 42 43 // schedulerConfigDecodeErr is the scheduler config 44 // which throws decoding error when we try to load it 45 schedulerConfigDecodeErr = ` 46 kind: KubeSchedulerConfiguration` 47 48 // schedulerConfigVersionTooOld is the scheduler config 49 // which throws error because the config version 'v1alpha1' 50 // is too old 51 schedulerConfigVersionTooOld = ` 52 apiVersion: kubescheduler.config.k8s.io/v1alpha1 53 kind: KubeSchedulerConfiguration 54 ` 55 ) 56 57 func TestLoadConfigFromFile(t *testing.T) { 58 tmpDir, err := os.MkdirTemp("", "scheduler-configs") 59 if err != nil { 60 t.Fatal(err) 61 } 62 defer os.RemoveAll(tmpDir) 63 64 correctConfigFile := filepath.Join(tmpDir, "correct_config.yaml") 65 if err := os.WriteFile(correctConfigFile, 66 []byte(schedulerConfigMinimalCorrect), 67 os.FileMode(0600)); err != nil { 68 t.Fatal(err) 69 } 70 71 decodeErrConfigFile := filepath.Join(tmpDir, "decode_err_no_version_config.yaml") 72 if err := os.WriteFile(decodeErrConfigFile, 73 []byte(schedulerConfigDecodeErr), 74 os.FileMode(0600)); err != nil { 75 t.Fatal(err) 76 } 77 78 versionTooOldConfigFile := filepath.Join(tmpDir, "version_too_old_config.yaml") 79 if err := os.WriteFile(versionTooOldConfigFile, 80 []byte(schedulerConfigVersionTooOld), 81 os.FileMode(0600)); err != nil { 82 t.Fatal(err) 83 } 84 85 tests := []struct { 86 name string 87 path string 88 expectedErr error 89 expectedConfig *config.KubeSchedulerConfiguration 90 }{ 91 { 92 name: "Empty scheduler config file path", 93 path: "", 94 expectedErr: syscall.Errno(syscall.ENOENT), 95 expectedConfig: nil, 96 }, 97 { 98 name: "Correct scheduler config", 99 path: correctConfigFile, 100 expectedErr: nil, 101 expectedConfig: &config.KubeSchedulerConfiguration{}, 102 }, 103 { 104 name: "Scheduler config with decode error", 105 path: decodeErrConfigFile, 106 expectedErr: fmt.Errorf(apiVersionMissing), 107 expectedConfig: nil, 108 }, 109 { 110 name: "Scheduler config version too old", 111 path: versionTooOldConfigFile, 112 expectedErr: fmt.Errorf(apiVersionTooOld), 113 expectedConfig: nil, 114 }, 115 } 116 117 logger := klog.FromContext(context.Background()) 118 119 for i, test := range tests { 120 t.Run(fmt.Sprintf("case_%d: %s", i, test.name), func(t *testing.T) { 121 cfg, err := LoadConfigFromFile(logger, test.path) 122 if test.expectedConfig == nil { 123 assert.Nil(t, cfg) 124 } else { 125 assert.NotNil(t, cfg) 126 } 127 128 if test.expectedErr == nil { 129 assert.NoError(t, err) 130 } else { 131 assert.ErrorContains(t, err, test.expectedErr.Error()) 132 } 133 }) 134 135 } 136 }